main.go 3.5 KB

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