main.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. "time"
  10. "github.com/gorilla/handlers"
  11. "github.com/jinzhu/gorm"
  12. "github.com/robfig/cron"
  13. "gogs.carducci-dante.gov.it/karmen/core/config"
  14. "gogs.carducci-dante.gov.it/karmen/core/cron/sync"
  15. "gogs.carducci-dante.gov.it/karmen/core/generator"
  16. "gogs.carducci-dante.gov.it/karmen/core/generator/generators/department"
  17. "gogs.carducci-dante.gov.it/karmen/core/generator/generators/list"
  18. karmen_handlers "gogs.carducci-dante.gov.it/karmen/core/handlers"
  19. "gogs.carducci-dante.gov.it/karmen/core/orm"
  20. )
  21. const (
  22. MaxNumRetries = 20
  23. RetryTimeInterval = 5
  24. )
  25. var (
  26. db *gorm.DB
  27. err error
  28. models = []interface{}{
  29. &orm.Teacher{},
  30. &orm.Department{},
  31. &orm.Subject{},
  32. &orm.Class{},
  33. &orm.Student{},
  34. &orm.Activity{},
  35. &orm.Office{},
  36. &orm.Administrative{},
  37. &orm.Group{},
  38. &orm.Document{},
  39. &orm.Job{},
  40. &orm.File{},
  41. }
  42. )
  43. func main() {
  44. configFile := flag.String("config", "config/config.yaml", "Load the given config file")
  45. flag.Parse()
  46. log.Println("Loading config file...")
  47. err = config.ReadFile(*configFile, config.Config)
  48. if err != nil {
  49. panic(err)
  50. }
  51. log.Println("Starting karmen and waiting for the DB...")
  52. count := MaxNumRetries
  53. wait := true
  54. for wait && count > 0 {
  55. db, err = orm.New(fmt.Sprintf("%s?%s", config.Config.Orm.Connection, config.Config.Orm.Options))
  56. if err != nil {
  57. count--
  58. log.Println(err)
  59. log.Printf("Remaining retries: %d", count)
  60. time.Sleep(time.Second * RetryTimeInterval)
  61. continue
  62. }
  63. wait = false
  64. }
  65. orm.Use(db)
  66. if config.Config.Orm.AutoMigrate {
  67. log.Print("Automigrating...")
  68. orm.AutoMigrate()
  69. }
  70. log.Println("Map models <-> handlers")
  71. if err := orm.MapHandlers(models); err != nil {
  72. panic(err)
  73. }
  74. generator.Generators = make(map[string]generator.Generator)
  75. log.Println("Initialize ListGenerator")
  76. generator.Generators["list"] = list.NewListGenerator(config.Config)
  77. log.Println("Initialize DepartmentGenerator")
  78. generator.Generators["department"] = department.NewDepartmentGenerator(&generator.Config{ConfigT: *config.Config})
  79. files, err := filepath.Glob("generator/generators/*")
  80. if err != nil {
  81. panic(err)
  82. }
  83. log.Println("Found the following generators...", files)
  84. gTypes := make([]*orm.GeneratorType, 0)
  85. for _, g := range files {
  86. gTypes = append(gTypes, &orm.GeneratorType{Name: filepath.Base(g)})
  87. }
  88. log.Println("Update generator_types table...")
  89. for _, gt := range gTypes {
  90. var gType []orm.GeneratorType
  91. if err := orm.DB().Where("name = ?", gt.Name).Find(&gType).Error; err != nil {
  92. panic(err)
  93. }
  94. if len(gType) == 0 {
  95. err := orm.DB().Debug().Create(gt).Error
  96. if err != nil {
  97. panic(err)
  98. }
  99. }
  100. }
  101. if err := orm.DB().Find(&gTypes).Error; err != nil {
  102. panic(err)
  103. }
  104. log.Println("Currently registered generators are:")
  105. for _, g := range gTypes {
  106. log.Println(g.Name)
  107. }
  108. log.Println("Starting cron jobs...")
  109. c := cron.New()
  110. syncJob := sync.NewSyncJob(config.Config)
  111. if config.Config.Sync.Schedule == "" {
  112. config.Config.Sync.Schedule = "@every 10m"
  113. }
  114. log.Printf("Adding LDAP Sync Job with schedule set at %s", config.Config.Sync.Schedule)
  115. log.Printf("Sync will run with SAFE mode set to %v", config.Config.Sync.SafeRun)
  116. log.Printf("Sync will run with SEND_MAIL set to %v", config.Config.Sync.SendMail)
  117. log.Printf("Sync will run with SCHEDULE set to %v", config.Config.Sync.Schedule)
  118. c.AddJob(config.Config.Sync.Schedule, syncJob)
  119. c.Start()
  120. log.Println("karmen is listening to port 3000...")
  121. if err := http.ListenAndServe(":3000", handlers.LoggingHandler(os.Stdout, karmen_handlers.Handlers(models))); err != nil {
  122. panic(err)
  123. }
  124. }