cli.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // Copyright 2018 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 cli // import "miniflux.app/cli"
  5. import (
  6. "flag"
  7. "fmt"
  8. "miniflux.app/config"
  9. "miniflux.app/database"
  10. "miniflux.app/locale"
  11. "miniflux.app/logger"
  12. "miniflux.app/storage"
  13. "miniflux.app/version"
  14. )
  15. const (
  16. flagInfoHelp = "Show application 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. )
  27. // Parse parses command line arguments.
  28. func Parse() {
  29. var (
  30. err error
  31. flagInfo bool
  32. flagVersion bool
  33. flagMigrate bool
  34. flagFlushSessions bool
  35. flagCreateAdmin bool
  36. flagResetPassword bool
  37. flagResetFeedErrors bool
  38. flagDebugMode bool
  39. flagConfigFile string
  40. flagConfigDump bool
  41. )
  42. flag.BoolVar(&flagInfo, "info", false, flagInfoHelp)
  43. flag.BoolVar(&flagInfo, "i", false, flagInfoHelp)
  44. flag.BoolVar(&flagVersion, "version", false, flagVersionHelp)
  45. flag.BoolVar(&flagVersion, "v", false, flagVersionHelp)
  46. flag.BoolVar(&flagMigrate, "migrate", false, flagMigrateHelp)
  47. flag.BoolVar(&flagFlushSessions, "flush-sessions", false, flagFlushSessionsHelp)
  48. flag.BoolVar(&flagCreateAdmin, "create-admin", false, flagCreateAdminHelp)
  49. flag.BoolVar(&flagResetPassword, "reset-password", false, flagResetPasswordHelp)
  50. flag.BoolVar(&flagResetFeedErrors, "reset-feed-errors", false, flagResetFeedErrorsHelp)
  51. flag.BoolVar(&flagDebugMode, "debug", false, flagDebugModeHelp)
  52. flag.StringVar(&flagConfigFile, "config-file", "", flagConfigFileHelp)
  53. flag.StringVar(&flagConfigFile, "c", "", flagConfigFileHelp)
  54. flag.BoolVar(&flagConfigDump, "config-dump", false, flagConfigDumpHelp)
  55. flag.Parse()
  56. cfg := config.NewParser()
  57. if flagConfigFile != "" {
  58. config.Opts, err = cfg.ParseFile(flagConfigFile)
  59. if err != nil {
  60. logger.Fatal("%v", err)
  61. }
  62. }
  63. config.Opts, err = cfg.ParseEnvironmentVariables()
  64. if err != nil {
  65. logger.Fatal("%v", err)
  66. }
  67. if flagConfigDump {
  68. fmt.Print(config.Opts)
  69. return
  70. }
  71. if config.Opts.LogDateTime() {
  72. logger.EnableDateTime()
  73. }
  74. if flagDebugMode || config.Opts.HasDebugMode() {
  75. logger.EnableDebug()
  76. }
  77. if flagInfo {
  78. info()
  79. return
  80. }
  81. if flagVersion {
  82. fmt.Println(version.Version)
  83. return
  84. }
  85. if config.Opts.IsDefaultDatabaseURL() {
  86. logger.Info("The default value for DATABASE_URL is used")
  87. }
  88. logger.Debug("Loading translations...")
  89. if err := locale.LoadCatalogMessages(); err != nil {
  90. logger.Fatal("Unable to load translations: %v", err)
  91. }
  92. db, err := database.NewConnectionPool(
  93. config.Opts.DatabaseURL(),
  94. config.Opts.DatabaseMinConns(),
  95. config.Opts.DatabaseMaxConns(),
  96. )
  97. if err != nil {
  98. logger.Fatal("Unable to connect to the database: %v", err)
  99. }
  100. defer db.Close()
  101. if flagMigrate {
  102. database.Migrate(db)
  103. return
  104. }
  105. store := storage.NewStorage(db)
  106. if flagResetFeedErrors {
  107. store.ResetFeedErrors()
  108. return
  109. }
  110. if flagFlushSessions {
  111. flushSessions(store)
  112. return
  113. }
  114. if flagCreateAdmin {
  115. createAdmin(store)
  116. return
  117. }
  118. if flagResetPassword {
  119. resetPassword(store)
  120. return
  121. }
  122. // Run migrations and start the deamon.
  123. if config.Opts.RunMigrations() {
  124. if err := database.Migrate(db); err != nil {
  125. logger.Fatal(`%v`, err)
  126. }
  127. }
  128. if err := database.IsSchemaUpToDate(db); err != nil {
  129. logger.Fatal(`You must run the SQL migrations, %v`, err)
  130. }
  131. // Create admin user and start the deamon.
  132. if config.Opts.CreateAdmin() {
  133. createAdmin(store)
  134. }
  135. startDaemon(store)
  136. }