forked from smancke/insantus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
126 lines (112 loc) · 3.52 KB
/
config.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package main
import (
"flag"
"gopkg.in/yaml.v2"
"io/ioutil"
"os"
"strings"
"time"
)
type Env struct {
Id string `yaml:"id"`
Name string `yaml:"name"`
Default bool `yaml:"default"`
Vars map[string]string `yaml:"vars"`
Notifications []Notification `yaml:"notifications"`
Checks []Check
}
type Notification struct {
Type string `yaml:"type"`
Target string `yaml:"target"`
AlertAtDaytime bool `yaml:"alertAtDaytime"`
AlertAtNighttime bool `yaml:"alertAtNighttime"`
}
type Check struct {
Id string `yaml:"id"`
Name string `yaml:"name"`
Type string `yaml:"type"`
Every time.Duration `yaml:"every"`
Timeout time.Duration `yaml:"timeout"`
Envs []string `yaml:"envs"`
Params map[string]string `yaml:"params"`
}
type Config struct {
DBPath string
Listen string
Static string
Worker int
Duration time.Duration
SelfUrl string
Environments []Env
Pprof bool
PprofListen string
}
func (cfg *Config) EnvById(envId string) (Env, bool) {
for _, e := range cfg.Environments {
if e.Id == envId {
return e, true
}
}
return Env{}, false
}
func getConfig() (*Config, error) {
cfg := &Config{}
flag.StringVar(&cfg.DBPath, "db", "insantus.db", "Path to the sqlite storage db file")
flag.StringVar(&cfg.Listen, "listen", ":8080", "Server and port to listen")
flag.StringVar(&cfg.Static, "static", "static", "Directory with static content to serve")
flag.IntVar(&cfg.Worker, "worker", 20, "Number of cheks to run in parallel")
flag.DurationVar(&cfg.Duration, "duration", time.Minute, "Default duration for the checks")
flag.StringVar(&cfg.SelfUrl, "self-url", "", "Url to reference the this application")
flag.BoolVar(&cfg.Pprof, "pprof", false, "Enable the golang pprof interface")
flag.StringVar(&cfg.PprofListen, "pprof-listen", ":6060", "Server and port for the profile interface")
var checksPath, environmentsPath string
flag.StringVar(&environmentsPath, "environments", "environments.yml", "The YAML config for the environments")
flag.StringVar(&checksPath, "checks", "checks.yml", "The YAML config fot the checks")
flag.Parse()
var err error
cfg.Environments, err = readEnvironments(environmentsPath)
if err != nil {
return nil, err
}
for i, e := range cfg.Environments {
allChecks, err := readChecksForEnvironment(checksPath, e)
if err != nil {
return nil, err
}
cfg.Environments[i].Checks = []Check{}
for _, c := range allChecks {
if len(c.Envs) == 0 || contains(c.Envs, e.Id) {
cfg.Environments[i].Checks = append(cfg.Environments[i].Checks, c)
}
}
}
return cfg, nil
}
func readEnvironments(environmentsPath string) ([]Env, error) {
b, err := ioutil.ReadFile(environmentsPath)
if err != nil {
return nil, err
}
b = []byte(os.Expand(string(b), func(varName string) string {
if s, envExist := os.LookupEnv(varName); envExist {
return strings.Replace(s, "\n", "\\n", -1)
}
return ""
}))
envs := []Env{}
return envs, yaml.Unmarshal(b, &envs)
}
func readChecksForEnvironment(checksPath string, e Env) ([]Check, error) {
b, err := ioutil.ReadFile(checksPath)
if err != nil {
return nil, err
}
b = []byte(os.Expand(string(b), func(varName string) string {
if s, envExist := os.LookupEnv(varName); envExist {
return strings.Replace(s, "\n", "\\n", -1)
}
return strings.Replace(e.Vars[varName], "\n", "\\n", -1)
}))
checks := []Check{}
return checks, yaml.Unmarshal(b, &checks)
}