/
main.go
89 lines (78 loc) · 1.92 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import (
"encoding/json"
"flag"
"io/ioutil"
"log"
"net/http"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
var (
DataDir = "./data/"
Collections = map[string]*EventCollection{}
collectionsLock sync.Mutex
version = "0.2.0"
)
func main() {
configFilePath := flag.String("config", "./cistern.json", "Path to config file")
apiAddr := flag.String("api-addr", "localhost:2020", "API listen address")
uiContentPath := flag.String("ui-content", "", "Path to static UI content (enables UI)")
flag.StringVar(&DataDir, "data-dir", DataDir, "Data directory")
flag.Parse()
log.Printf("Cistern v%s starting", version)
configFileData, err := ioutil.ReadFile(*configFilePath)
if err != nil {
log.Fatal("Failed to read config file:", err)
}
config := Config{}
err = json.Unmarshal(configFileData, &config)
if err != nil {
log.Fatal("Not a valid config file:", err)
}
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
done := make(chan struct{})
go func() {
sig := <-sigs
log.Println("Got signal", sig)
close(done)
}()
for _, group := range config.CloudWatchLogs {
if group.FlowLog {
go func(group ConfigCloudWatchLogGroup) {
err := captureFlowLogs(group.Name, config.Retention, done)
if err != nil {
log.Fatal(err)
}
}(group)
} else {
go func(group ConfigCloudWatchLogGroup) {
err := captureJSONLogs(group.Name, config.Retention, done)
if err != nil {
log.Fatal(err)
}
}(group)
}
}
if *uiContentPath != "" {
handler, err := UI(*uiContentPath)
if err != nil {
log.Fatalln("Couldn't set up UI:", err)
}
http.Handle("/ui/", handler)
}
http.Handle("/api/", service())
go func() {
err := http.ListenAndServe(*apiAddr, nil)
if err != nil {
log.Fatalln("Couldn't start API server:", err)
}
}()
<-done
log.Println("Waiting for things to get cleaned up...")
time.Sleep(250 * time.Millisecond)
}