Update config
[bloat] / main.go
1 package main
2
3 import (
4         "log"
5         "math/rand"
6         "net/http"
7         "os"
8         "path/filepath"
9         "strings"
10         "time"
11
12         "bloat/config"
13         "bloat/kv"
14         "bloat/renderer"
15         "bloat/repo"
16         "bloat/service"
17         "bloat/util"
18 )
19
20 var (
21         configFile = "bloat.conf"
22 )
23
24 func init() {
25         rand.Seed(time.Now().Unix())
26 }
27
28 func main() {
29         opts, _, err := util.Getopts(os.Args, "f:")
30         if err != nil {
31                 log.Fatal(err)
32         }
33
34         for _, opt := range opts {
35                 switch opt.Option {
36                 case 'f':
37                         configFile = opt.Value
38                 }
39         }
40
41         config, err := config.ParseFile(configFile)
42         if err != nil {
43                 log.Fatal(err)
44         }
45
46         if !config.IsValid() {
47                 log.Fatal("invalid config")
48         }
49
50         templatesGlobPattern := filepath.Join(config.TemplatesPath, "*")
51         renderer, err := renderer.NewRenderer(templatesGlobPattern)
52         if err != nil {
53                 log.Fatal(err)
54         }
55
56         err = os.Mkdir(config.DatabasePath, 0755)
57         if err != nil && !os.IsExist(err) {
58                 log.Fatal(err)
59         }
60
61         sessionDBPath := filepath.Join(config.DatabasePath, "session")
62         sessionDB, err := kv.NewDatabse(sessionDBPath)
63         if err != nil {
64                 log.Fatal(err)
65         }
66
67         appDBPath := filepath.Join(config.DatabasePath, "app")
68         appDB, err := kv.NewDatabse(appDBPath)
69         if err != nil {
70                 log.Fatal(err)
71         }
72
73         sessionRepo := repo.NewSessionRepo(sessionDB)
74         appRepo := repo.NewAppRepo(appDB)
75
76         customCSS := config.CustomCSS
77         if !strings.HasPrefix(customCSS, "http://") &&
78                 !strings.HasPrefix(customCSS, "https://") {
79                 customCSS = "/static/" + customCSS
80         }
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.Open(config.LogFile)
87                 if err != nil {
88                         log.Fatal(err)
89                 }
90                 defer lf.Close()
91                 logger = log.New(lf, "", log.LstdFlags)
92         }
93
94         s := service.NewService(config.ClientName, config.ClientScope,
95                 config.ClientWebsite, customCSS, config.PostFormats, renderer,
96                 sessionRepo, appRepo)
97         s = service.NewAuthService(sessionRepo, appRepo, s)
98         s = service.NewLoggingService(logger, s)
99         handler := service.NewHandler(s, config.StaticDirectory)
100
101         logger.Println("listening on", config.ListenAddress)
102         err = http.ListenAndServe(config.ListenAddress, handler)
103         if err != nil {
104                 log.Fatal(err)
105         }
106 }