/types/configs/connection.go

https://github.com/hunterlong/statping · Go · 107 lines · 85 code · 18 blank · 4 comment · 14 complexity · ae35f9a3e03105c902402298b868b3d8 MD5 · raw file

  1. package configs
  2. import (
  3. "fmt"
  4. "github.com/jinzhu/gorm"
  5. "github.com/pkg/errors"
  6. "github.com/statping/statping/database"
  7. "github.com/statping/statping/types/checkins"
  8. "github.com/statping/statping/types/core"
  9. "github.com/statping/statping/types/failures"
  10. "github.com/statping/statping/types/groups"
  11. "github.com/statping/statping/types/hits"
  12. "github.com/statping/statping/types/incidents"
  13. "github.com/statping/statping/types/messages"
  14. "github.com/statping/statping/types/notifications"
  15. "github.com/statping/statping/types/null"
  16. "github.com/statping/statping/types/services"
  17. "github.com/statping/statping/types/users"
  18. "github.com/statping/statping/utils"
  19. "time"
  20. )
  21. // initModels sets the database for each Statping type packages
  22. func initModels(db database.Database) {
  23. core.SetDB(db)
  24. services.SetDB(db)
  25. hits.SetDB(db)
  26. failures.SetDB(db)
  27. checkins.SetDB(db)
  28. notifications.SetDB(db)
  29. incidents.SetDB(db)
  30. users.SetDB(db)
  31. messages.SetDB(db)
  32. groups.SetDB(db)
  33. }
  34. // Connect will attempt to connect to the sqlite, postgres, or mysql database
  35. func Connect(configs *DbConfig, retry bool) error {
  36. conn := configs.ConnectionString()
  37. log.WithFields(utils.ToFields(configs, conn)).Debugln("attempting to connect to database")
  38. dbSession, err := database.Openw(configs.DbConn, conn)
  39. if err != nil {
  40. log.Errorf(fmt.Sprintf("Database connection error %s", err))
  41. if retry {
  42. log.Warnln(fmt.Sprintf("Database %s connection to '%s' is not available, trying again in 5 seconds...", configs.DbConn, configs.DbHost))
  43. time.Sleep(5 * time.Second)
  44. return Connect(configs, retry)
  45. } else {
  46. return err
  47. }
  48. }
  49. configs.ApiSecret = utils.Params.GetString("API_SECRET")
  50. log.WithFields(utils.ToFields(dbSession)).Debugln("connected to database")
  51. db := dbSession.DB()
  52. db.SetMaxOpenConns(utils.Params.GetInt("MAX_OPEN_CONN"))
  53. db.SetMaxIdleConns(utils.Params.GetInt("MAX_IDLE_CONN"))
  54. db.SetConnMaxLifetime(utils.Params.GetDuration("MAX_LIFE_CONN"))
  55. if db.Ping() == nil {
  56. if utils.VerboseMode >= 4 {
  57. dbSession.LogMode(true).Debug().SetLogger(gorm.Logger{log})
  58. }
  59. log.Infoln(fmt.Sprintf("Database %s connection was successful.", configs.DbConn))
  60. }
  61. if utils.Params.GetBool("READ_ONLY") {
  62. log.Warnln("Running in READ ONLY MODE")
  63. }
  64. configs.Db = dbSession
  65. initModels(configs.Db)
  66. return err
  67. }
  68. // CreateAdminUser will create the default admin user "admin", "admin", or use the
  69. // environment variables ADMIN_USER, ADMIN_PASSWORD, and ADMIN_EMAIL if set.
  70. func CreateAdminUser() error {
  71. adminUser := utils.Params.GetString("ADMIN_USER")
  72. adminPass := utils.Params.GetString("ADMIN_PASSWORD")
  73. adminEmail := utils.Params.GetString("ADMIN_EMAIL")
  74. if adminUser == "" || adminPass == "" {
  75. adminUser = "admin"
  76. adminPass = "admin"
  77. }
  78. admin := &users.User{
  79. Username: adminUser,
  80. Password: adminPass,
  81. Email: adminEmail,
  82. Scopes: "admin",
  83. Admin: null.NewNullBool(true),
  84. }
  85. if err := admin.Create(); err != nil {
  86. return errors.Wrap(err, "error creating admin")
  87. }
  88. return nil
  89. }