main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "net"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "time"
  12. "bloat/config"
  13. "bloat/renderer"
  14. "bloat/repo"
  15. "bloat/service"
  16. "bloat/util"
  17. )
  18. var (
  19. configFile = "/etc/bloat.conf"
  20. )
  21. func errExit(err error) {
  22. fmt.Fprintln(os.Stderr, err.Error())
  23. os.Exit(1)
  24. }
  25. func setupHttp() {
  26. tr := http.DefaultTransport.(*http.Transport)
  27. tr.MaxIdleConnsPerHost = 30
  28. tr.MaxIdleConns = 300
  29. tr.ForceAttemptHTTP2 = false
  30. tr.DialContext = (&net.Dialer{
  31. Timeout: 30 * time.Second,
  32. KeepAlive: 3 * time.Minute,
  33. DualStack: true,
  34. }).DialContext
  35. client := http.DefaultClient
  36. client.Transport = tr
  37. }
  38. func main() {
  39. opts, _, err := util.Getopts(os.Args, "f:")
  40. if err != nil {
  41. errExit(err)
  42. }
  43. for _, opt := range opts {
  44. switch opt.Option {
  45. case 'f':
  46. configFile = opt.Value
  47. }
  48. }
  49. config, err := config.ParseFile(configFile)
  50. if err != nil {
  51. errExit(err)
  52. }
  53. if !config.IsValid() {
  54. errExit(errors.New("invalid config"))
  55. }
  56. templatesGlobPattern := filepath.Join(config.TemplatesPath, "*")
  57. renderer, err := renderer.NewRenderer(templatesGlobPattern)
  58. if err != nil {
  59. errExit(err)
  60. }
  61. err = os.Mkdir(config.DatabasePath, 0755)
  62. if err != nil && !os.IsExist(err) {
  63. errExit(err)
  64. }
  65. sessionDBPath := filepath.Join(config.DatabasePath, "session")
  66. sessionDB, err := util.NewDatabse(sessionDBPath)
  67. if err != nil {
  68. errExit(err)
  69. }
  70. appDBPath := filepath.Join(config.DatabasePath, "app")
  71. appDB, err := util.NewDatabse(appDBPath)
  72. if err != nil {
  73. errExit(err)
  74. }
  75. sessionRepo := repo.NewSessionRepo(sessionDB)
  76. appRepo := repo.NewAppRepo(appDB)
  77. customCSS := config.CustomCSS
  78. if len(customCSS) > 0 && !strings.HasPrefix(customCSS, "http://") &&
  79. !strings.HasPrefix(customCSS, "https://") {
  80. customCSS = "/static/" + customCSS
  81. }
  82. var logger *log.Logger
  83. if len(config.LogFile) < 1 {
  84. logger = log.New(os.Stdout, "", log.LstdFlags)
  85. } else {
  86. lf, err := os.OpenFile(config.LogFile,
  87. os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
  88. if err != nil {
  89. errExit(err)
  90. }
  91. defer lf.Close()
  92. logger = log.New(lf, "", log.LstdFlags)
  93. }
  94. setupHttp()
  95. s := service.NewService(config.ClientName, config.ClientScope,
  96. config.ClientWebsite, customCSS, config.PostFormats, renderer,
  97. sessionRepo, appRepo, config.SingleInstance)
  98. handler := service.NewHandler(s, logger, config.StaticDirectory)
  99. logger.Println("listening on", config.ListenAddress)
  100. err = http.ListenAndServe(config.ListenAddress, handler)
  101. if err != nil {
  102. errExit(err)
  103. }
  104. }