main.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. "os"
  19. "os/signal"
  20. "runtime"
  21. "strings"
  22. "time"
  23. "github.com/miniflux/miniflux/config"
  24. "github.com/miniflux/miniflux/logger"
  25. "github.com/miniflux/miniflux/model"
  26. "github.com/miniflux/miniflux/reader/feed"
  27. "github.com/miniflux/miniflux/scheduler"
  28. "github.com/miniflux/miniflux/server"
  29. "github.com/miniflux/miniflux/storage"
  30. "github.com/miniflux/miniflux/version"
  31. _ "github.com/lib/pq"
  32. "golang.org/x/crypto/ssh/terminal"
  33. )
  34. func run(cfg *config.Config, store *storage.Storage) {
  35. logger.Info("Starting Miniflux...")
  36. stop := make(chan os.Signal, 1)
  37. signal.Notify(stop, os.Interrupt)
  38. feedHandler := feed.NewFeedHandler(store)
  39. pool := scheduler.NewWorkerPool(feedHandler, cfg.GetInt("WORKER_POOL_SIZE", config.DefaultWorkerPoolSize))
  40. server := server.NewServer(cfg, store, pool, feedHandler)
  41. scheduler.NewFeedScheduler(
  42. store,
  43. pool,
  44. cfg.GetInt("POLLING_FREQUENCY", config.DefaultPollingFrequency),
  45. cfg.GetInt("BATCH_SIZE", config.DefaultBatchSize),
  46. )
  47. scheduler.NewSessionScheduler(store, config.DefaultSessionCleanupFrequency)
  48. <-stop
  49. logger.Info("Shutting down the server...")
  50. ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
  51. server.Shutdown(ctx)
  52. store.Close()
  53. logger.Info("Server gracefully stopped")
  54. }
  55. func askCredentials() (string, string) {
  56. reader := bufio.NewReader(os.Stdin)
  57. fmt.Print("Enter Username: ")
  58. username, _ := reader.ReadString('\n')
  59. fmt.Print("Enter Password: ")
  60. bytePassword, _ := terminal.ReadPassword(0)
  61. fmt.Printf("\n")
  62. return strings.TrimSpace(username), strings.TrimSpace(string(bytePassword))
  63. }
  64. func main() {
  65. flagInfo := flag.Bool("info", false, "Show application information")
  66. flagVersion := flag.Bool("version", false, "Show application version")
  67. flagMigrate := flag.Bool("migrate", false, "Migrate database schema")
  68. flagFlushSessions := flag.Bool("flush-sessions", false, "Flush all sessions (disconnect users)")
  69. flagCreateAdmin := flag.Bool("create-admin", false, "Create admin user")
  70. flag.Parse()
  71. cfg := config.NewConfig()
  72. store := storage.NewStorage(
  73. cfg.Get("DATABASE_URL", config.DefaultDatabaseURL),
  74. cfg.GetInt("DATABASE_MAX_CONNS", config.DefaultDatabaseMaxConns),
  75. )
  76. if *flagInfo {
  77. fmt.Println("Version:", version.Version)
  78. fmt.Println("Build Date:", version.BuildDate)
  79. fmt.Println("Go Version:", runtime.Version())
  80. return
  81. }
  82. if *flagVersion {
  83. fmt.Println(version.Version)
  84. return
  85. }
  86. if *flagMigrate {
  87. store.Migrate()
  88. return
  89. }
  90. if *flagFlushSessions {
  91. fmt.Println("Flushing all sessions (disconnect users)")
  92. if err := store.FlushAllSessions(); err != nil {
  93. fmt.Println(err)
  94. os.Exit(1)
  95. }
  96. return
  97. }
  98. if *flagCreateAdmin {
  99. user := &model.User{
  100. Username: os.Getenv("ADMIN_USERNAME"),
  101. Password: os.Getenv("ADMIN_PASSWORD"),
  102. IsAdmin: true,
  103. }
  104. if user.Username == "" || user.Password == "" {
  105. user.Username, user.Password = askCredentials()
  106. }
  107. if err := user.ValidateUserCreation(); err != nil {
  108. fmt.Println(err)
  109. os.Exit(1)
  110. }
  111. if err := store.CreateUser(user); err != nil {
  112. fmt.Println(err)
  113. os.Exit(1)
  114. }
  115. return
  116. }
  117. run(cfg, store)
  118. }