main.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package main
  5. //go:generate go run generate.go
  6. //go:generate gofmt -s -w sql/sql.go
  7. //go:generate gofmt -s -w server/static/css.go
  8. //go:generate gofmt -s -w server/static/bin.go
  9. //go:generate gofmt -s -w server/static/js.go
  10. //go:generate gofmt -s -w server/template/views.go
  11. //go:generate gofmt -s -w server/template/common.go
  12. //go:generate gofmt -s -w locale/translations.go
  13. import (
  14. "bufio"
  15. "context"
  16. "flag"
  17. "fmt"
  18. "log"
  19. "os"
  20. "os/signal"
  21. "runtime"
  22. "strings"
  23. "time"
  24. "github.com/miniflux/miniflux2/config"
  25. "github.com/miniflux/miniflux2/model"
  26. "github.com/miniflux/miniflux2/reader/feed"
  27. "github.com/miniflux/miniflux2/scheduler"
  28. "github.com/miniflux/miniflux2/server"
  29. "github.com/miniflux/miniflux2/storage"
  30. "github.com/miniflux/miniflux2/version"
  31. _ "github.com/lib/pq"
  32. "golang.org/x/crypto/ssh/terminal"
  33. )
  34. func run(cfg *config.Config, store *storage.Storage) {
  35. log.Println("Starting Miniflux...")
  36. stop := make(chan os.Signal, 1)
  37. signal.Notify(stop, os.Interrupt)
  38. feedHandler := feed.NewFeedHandler(store)
  39. server := server.NewServer(cfg, store, feedHandler)
  40. go func() {
  41. pool := scheduler.NewWorkerPool(feedHandler, cfg.GetInt("WORKER_POOL_SIZE", 5))
  42. scheduler.NewScheduler(store, pool, cfg.GetInt("POLLING_FREQUENCY", 30), cfg.GetInt("BATCH_SIZE", 10))
  43. }()
  44. <-stop
  45. log.Println("Shutting down the server...")
  46. ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
  47. server.Shutdown(ctx)
  48. store.Close()
  49. log.Println("Server gracefully stopped")
  50. }
  51. func askCredentials() (string, string) {
  52. reader := bufio.NewReader(os.Stdin)
  53. fmt.Print("Enter Username: ")
  54. username, _ := reader.ReadString('\n')
  55. fmt.Print("Enter Password: ")
  56. bytePassword, _ := terminal.ReadPassword(0)
  57. fmt.Printf("\n")
  58. return strings.TrimSpace(username), strings.TrimSpace(string(bytePassword))
  59. }
  60. func main() {
  61. flagInfo := flag.Bool("info", false, "Show application information")
  62. flagVersion := flag.Bool("version", false, "Show application version")
  63. flagMigrate := flag.Bool("migrate", false, "Migrate database schema")
  64. flagFlushSessions := flag.Bool("flush-sessions", false, "Flush all sessions (disconnect users)")
  65. flagCreateAdmin := flag.Bool("create-admin", false, "Create admin user")
  66. flag.Parse()
  67. cfg := config.NewConfig()
  68. store := storage.NewStorage(
  69. cfg.Get("DATABASE_URL", "postgres://postgres:postgres@localhost/miniflux2?sslmode=disable"),
  70. cfg.GetInt("DATABASE_MAX_CONNS", 20),
  71. )
  72. if *flagInfo {
  73. fmt.Println("Version:", version.Version)
  74. fmt.Println("Build Date:", version.BuildDate)
  75. fmt.Println("Go Version:", runtime.Version())
  76. return
  77. }
  78. if *flagVersion {
  79. fmt.Println(version.Version)
  80. return
  81. }
  82. if *flagMigrate {
  83. store.Migrate()
  84. return
  85. }
  86. if *flagFlushSessions {
  87. fmt.Println("Flushing all sessions (disconnect users)")
  88. if err := store.FlushAllSessions(); err != nil {
  89. fmt.Println(err)
  90. os.Exit(1)
  91. }
  92. return
  93. }
  94. if *flagCreateAdmin {
  95. user := &model.User{IsAdmin: true}
  96. user.Username, user.Password = askCredentials()
  97. if err := user.ValidateUserCreation(); err != nil {
  98. fmt.Println(err)
  99. os.Exit(1)
  100. }
  101. if err := store.CreateUser(user); err != nil {
  102. fmt.Println(err)
  103. os.Exit(1)
  104. }
  105. return
  106. }
  107. run(cfg, store)
  108. }