cli.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package cli // import "miniflux.app/v2/internal/cli"
  4. import (
  5. "flag"
  6. "fmt"
  7. "miniflux.app/v2/internal/config"
  8. "miniflux.app/v2/internal/database"
  9. "miniflux.app/v2/internal/locale"
  10. "miniflux.app/v2/internal/logger"
  11. "miniflux.app/v2/internal/storage"
  12. "miniflux.app/v2/internal/ui/static"
  13. "miniflux.app/v2/internal/version"
  14. )
  15. const (
  16. flagInfoHelp = "Show build information"
  17. flagVersionHelp = "Show application version"
  18. flagMigrateHelp = "Run SQL migrations"
  19. flagFlushSessionsHelp = "Flush all sessions (disconnect users)"
  20. flagCreateAdminHelp = "Create admin user"
  21. flagResetPasswordHelp = "Reset user password"
  22. flagResetFeedErrorsHelp = "Clear all feed errors for all users"
  23. flagDebugModeHelp = "Show debug logs"
  24. flagConfigFileHelp = "Load configuration file"
  25. flagConfigDumpHelp = "Print parsed configuration values"
  26. flagHealthCheckHelp = `Perform a health check on the given endpoint (the value "auto" try to guess the health check endpoint).`
  27. flagRefreshFeedsHelp = "Refresh a batch of feeds and exit"
  28. flagRunCleanupTasksHelp = "Run cleanup tasks (delete old sessions and archives old entries)"
  29. )
  30. // Parse parses command line arguments.
  31. func Parse() {
  32. var (
  33. err error
  34. flagInfo bool
  35. flagVersion bool
  36. flagMigrate bool
  37. flagFlushSessions bool
  38. flagCreateAdmin bool
  39. flagResetPassword bool
  40. flagResetFeedErrors bool
  41. flagDebugMode bool
  42. flagConfigFile string
  43. flagConfigDump bool
  44. flagHealthCheck string
  45. flagRefreshFeeds bool
  46. flagRunCleanupTasks bool
  47. )
  48. flag.BoolVar(&flagInfo, "info", false, flagInfoHelp)
  49. flag.BoolVar(&flagInfo, "i", false, flagInfoHelp)
  50. flag.BoolVar(&flagVersion, "version", false, flagVersionHelp)
  51. flag.BoolVar(&flagVersion, "v", false, flagVersionHelp)
  52. flag.BoolVar(&flagMigrate, "migrate", false, flagMigrateHelp)
  53. flag.BoolVar(&flagFlushSessions, "flush-sessions", false, flagFlushSessionsHelp)
  54. flag.BoolVar(&flagCreateAdmin, "create-admin", false, flagCreateAdminHelp)
  55. flag.BoolVar(&flagResetPassword, "reset-password", false, flagResetPasswordHelp)
  56. flag.BoolVar(&flagResetFeedErrors, "reset-feed-errors", false, flagResetFeedErrorsHelp)
  57. flag.BoolVar(&flagDebugMode, "debug", false, flagDebugModeHelp)
  58. flag.StringVar(&flagConfigFile, "config-file", "", flagConfigFileHelp)
  59. flag.StringVar(&flagConfigFile, "c", "", flagConfigFileHelp)
  60. flag.BoolVar(&flagConfigDump, "config-dump", false, flagConfigDumpHelp)
  61. flag.StringVar(&flagHealthCheck, "healthcheck", "", flagHealthCheckHelp)
  62. flag.BoolVar(&flagRefreshFeeds, "refresh-feeds", false, flagRefreshFeedsHelp)
  63. flag.BoolVar(&flagRunCleanupTasks, "run-cleanup-tasks", false, flagRunCleanupTasksHelp)
  64. flag.Parse()
  65. cfg := config.NewParser()
  66. if flagConfigFile != "" {
  67. config.Opts, err = cfg.ParseFile(flagConfigFile)
  68. if err != nil {
  69. logger.Fatal("%v", err)
  70. }
  71. }
  72. config.Opts, err = cfg.ParseEnvironmentVariables()
  73. if err != nil {
  74. logger.Fatal("%v", err)
  75. }
  76. if flagConfigDump {
  77. fmt.Print(config.Opts)
  78. return
  79. }
  80. if config.Opts.LogDateTime() {
  81. logger.EnableDateTime()
  82. }
  83. if flagDebugMode || config.Opts.HasDebugMode() {
  84. logger.EnableDebug()
  85. }
  86. if flagHealthCheck != "" {
  87. doHealthCheck(flagHealthCheck)
  88. return
  89. }
  90. if flagInfo {
  91. info()
  92. return
  93. }
  94. if flagVersion {
  95. fmt.Println(version.Version)
  96. return
  97. }
  98. if config.Opts.IsDefaultDatabaseURL() {
  99. logger.Info("The default value for DATABASE_URL is used")
  100. }
  101. logger.Debug("Loading translations...")
  102. if err := locale.LoadCatalogMessages(); err != nil {
  103. logger.Fatal("Unable to load translations: %v", err)
  104. }
  105. logger.Debug("Loading static assets...")
  106. if err := static.CalculateBinaryFileChecksums(); err != nil {
  107. logger.Fatal("Unable to calculate binary files checksum: %v", err)
  108. }
  109. if err := static.GenerateStylesheetsBundles(); err != nil {
  110. logger.Fatal("Unable to generate Stylesheet bundles: %v", err)
  111. }
  112. if err := static.GenerateJavascriptBundles(); err != nil {
  113. logger.Fatal("Unable to generate Javascript bundles: %v", err)
  114. }
  115. db, err := database.NewConnectionPool(
  116. config.Opts.DatabaseURL(),
  117. config.Opts.DatabaseMinConns(),
  118. config.Opts.DatabaseMaxConns(),
  119. config.Opts.DatabaseConnectionLifetime(),
  120. )
  121. if err != nil {
  122. logger.Fatal("Unable to initialize database connection pool: %v", err)
  123. }
  124. defer db.Close()
  125. store := storage.NewStorage(db)
  126. if err := store.Ping(); err != nil {
  127. logger.Fatal("Unable to connect to the database: %v", err)
  128. }
  129. if flagMigrate {
  130. if err := database.Migrate(db); err != nil {
  131. logger.Fatal(`%v`, err)
  132. }
  133. return
  134. }
  135. if flagResetFeedErrors {
  136. store.ResetFeedErrors()
  137. return
  138. }
  139. if flagFlushSessions {
  140. flushSessions(store)
  141. return
  142. }
  143. if flagCreateAdmin {
  144. createAdmin(store)
  145. return
  146. }
  147. if flagResetPassword {
  148. resetPassword(store)
  149. return
  150. }
  151. // Run migrations and start the daemon.
  152. if config.Opts.RunMigrations() {
  153. if err := database.Migrate(db); err != nil {
  154. logger.Fatal(`%v`, err)
  155. }
  156. }
  157. if err := database.IsSchemaUpToDate(db); err != nil {
  158. logger.Fatal(`You must run the SQL migrations, %v`, err)
  159. }
  160. // Create admin user and start the daemon.
  161. if config.Opts.CreateAdmin() {
  162. createAdmin(store)
  163. }
  164. if flagRefreshFeeds {
  165. refreshFeeds(store)
  166. return
  167. }
  168. if flagRunCleanupTasks {
  169. runCleanupTasks(store)
  170. return
  171. }
  172. startDaemon(store)
  173. }