The main server, and probably only repository in this org.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
2.9 KiB

5 years ago
5 years ago
5 years ago
5 years ago
  1. package main
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "database/sql"
  6. "encoding/hex"
  7. "fmt"
  8. "log"
  9. "net/http"
  10. "time"
  11. "git.aiterp.net/lucifer/lucifer/light"
  12. "git.aiterp.net/lucifer/lucifer/models"
  13. "github.com/gorilla/mux"
  14. "git.aiterp.net/lucifer/lucifer/controllers"
  15. "git.aiterp.net/lucifer/lucifer/database/sqlite"
  16. "git.aiterp.net/lucifer/lucifer/internal/config"
  17. "git.aiterp.net/lucifer/lucifer/middlewares"
  18. _ "git.aiterp.net/lucifer/lucifer/light/hue"
  19. )
  20. func main() {
  21. // Setup
  22. conf, err := config.Load("./config.yaml", "/etc/lucifer/lucifer.yaml")
  23. if err != nil {
  24. log.Fatalln("Failed to load configuration:", err)
  25. }
  26. err = sqlite.Initialize(conf.DB.FileName)
  27. if err != nil {
  28. log.Fatalln("Failed to set up database:", err)
  29. }
  30. // Initialize
  31. setupAdmin(sqlite.UserRepository, sqlite.GroupRepository)
  32. // Services
  33. lightService := light.NewService(sqlite.BridgeRepository, sqlite.LightRepository)
  34. // Controllers
  35. userController := controllers.NewUserController(sqlite.UserRepository, sqlite.SessionRepository)
  36. groupController := controllers.NewGroupController(sqlite.GroupRepository, sqlite.UserRepository, sqlite.LightRepository)
  37. lightController := controllers.NewLightController(lightService, sqlite.GroupRepository, sqlite.UserRepository, sqlite.LightRepository)
  38. bridgeController := controllers.NewBridgeController(lightService, sqlite.GroupRepository)
  39. // Router
  40. router := mux.NewRouter()
  41. router.Use(middlewares.Session(sqlite.SessionRepository, sqlite.UserRepository))
  42. groupController.Mount(router, "/api/group/")
  43. userController.Mount(router, "/api/user/")
  44. lightController.Mount(router, "/api/light/")
  45. bridgeController.Mount(router, "/api/bridge/")
  46. // Background Tasks
  47. go lightService.SyncLoop(context.TODO())
  48. // TODO: Listen in another goroutine and have SIGINT/SIGTERM handlers with graceful shutdown.
  49. http.ListenAndServe(conf.Server.Address, router)
  50. }
  51. func setupAdmin(users models.UserRepository, groups models.GroupRepository) {
  52. ctx, cancel := context.WithTimeout(context.Background(), time.Second*15)
  53. defer cancel()
  54. admin, err := users.FindByName(ctx, "Admin")
  55. if err != nil {
  56. if err != sql.ErrNoRows {
  57. log.Fatalln("Could not check for admin user:", err)
  58. }
  59. admin = models.User{Name: "Admin"}
  60. admin.SetPassword("123456")
  61. admin, err = users.Insert(ctx, admin)
  62. if err != nil {
  63. fmt.Println("Failed to insert admin username:", err)
  64. }
  65. }
  66. buf := make([]byte, 16)
  67. _, err = rand.Read(buf)
  68. if err != nil {
  69. log.Fatalln("Could not get random bytes:", err)
  70. }
  71. password := hex.EncodeToString(buf)
  72. admin.SetPassword(password)
  73. err = users.Update(ctx, admin)
  74. if err != nil {
  75. log.Println("Could not update admin password:", err)
  76. } else {
  77. log.Println("Administrator: Admin /", password)
  78. }
  79. groups.UpdatePermissions(ctx, models.GroupPermission{
  80. UserID: admin.ID,
  81. GroupID: 0,
  82. Read: true,
  83. Write: true,
  84. Create: true,
  85. Delete: true,
  86. Manage: true,
  87. })
  88. }