003fe5d27000e6781c751a38612969c27f25c23b
[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         renderer, err := renderer.NewRenderer(config.TemplatesGlobPattern)
51         if err != nil {
52                 log.Fatal(err)
53         }
54
55         err = os.Mkdir(config.DatabasePath, 0755)
56         if err != nil && !os.IsExist(err) {
57                 log.Fatal(err)
58         }
59
60         sessionDB, err := kv.NewDatabse(filepath.Join(config.DatabasePath, "session"))
61         if err != nil {
62                 log.Fatal(err)
63         }
64
65         appDB, err := kv.NewDatabse(filepath.Join(config.DatabasePath, "app"))
66         if err != nil {
67                 log.Fatal(err)
68         }
69
70         sessionRepo := repo.NewSessionRepo(sessionDB)
71         appRepo := repo.NewAppRepo(appDB)
72
73         customCSS := config.CustomCSS
74         if !strings.HasPrefix(customCSS, "http://") &&
75                 !strings.HasPrefix(customCSS, "https://") {
76                 customCSS = "/static/" + customCSS
77         }
78
79         var logger *log.Logger
80         if len(config.Logfile) < 1 {
81                 logger = log.New(os.Stdout, "", log.LstdFlags)
82         } else {
83                 lf, err := os.Open(config.Logfile)
84                 if err != nil {
85                         log.Fatal(err)
86                 }
87                 defer lf.Close()
88                 logger = log.New(lf, "", log.LstdFlags)
89         }
90
91         s := service.NewService(config.ClientName, config.ClientScope, config.ClientWebsite,
92                 customCSS, config.PostFormats, renderer, sessionRepo, appRepo)
93         s = service.NewAuthService(sessionRepo, appRepo, s)
94         s = service.NewLoggingService(logger, s)
95         handler := service.NewHandler(s, config.StaticDirectory)
96
97         log.Println("listening on", config.ListenAddress)
98         err = http.ListenAndServe(config.ListenAddress, handler)
99         if err != nil {
100                 log.Fatal(err)
101         }
102 }