|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
|
|
|
"github.com/noerw/osem_notify/core"
|
|
|
|
"github.com/noerw/osem_notify/utils"
|
|
|
|
)
|
|
|
|
|
|
|
|
// initConfig reads in config file and ENV variables if set.
|
|
|
|
func initConfig() {
|
|
|
|
theConfig := cfgFile
|
|
|
|
if cfgFile == "" {
|
|
|
|
theConfig = utils.GetConfigFile("osem_notify")
|
|
|
|
}
|
|
|
|
|
|
|
|
viper.SetConfigType("yaml")
|
|
|
|
viper.SetConfigFile(theConfig)
|
|
|
|
viper.SetEnvPrefix("OSEM_NOTIFY") // keys only work in upper case
|
|
|
|
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
|
|
|
|
viper.AutomaticEnv() // WARNING: OSEM_NOTIFIY_CONFIG will not be considered this way. but why should it..
|
|
|
|
|
|
|
|
// If a config file is found, read it in.
|
|
|
|
if _, err := os.Stat(theConfig); err == nil {
|
|
|
|
err := viper.ReadInConfig()
|
|
|
|
if err != nil {
|
|
|
|
log.Error("Error when reading config file:", err)
|
|
|
|
}
|
|
|
|
} else if cfgFile != "" {
|
|
|
|
log.Error("Specified config file not found!")
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
validateConfig()
|
|
|
|
}
|
|
|
|
|
|
|
|
func validateConfig() {
|
|
|
|
transport := viper.GetString("defaultHealthchecks.notifications.transport")
|
|
|
|
if viper.GetBool("notify") && transport == "email" {
|
|
|
|
if len(viper.GetStringSlice("defaultHealthchecks.notifications.options.recipients")) == 0 {
|
|
|
|
log.Warn("No recipients set up for transport email")
|
|
|
|
}
|
|
|
|
|
|
|
|
emailRequired := []string{
|
|
|
|
viper.GetString("email.host"),
|
|
|
|
viper.GetString("email.port"),
|
|
|
|
viper.GetString("email.user"),
|
|
|
|
viper.GetString("email.pass"),
|
|
|
|
viper.GetString("email.from"),
|
|
|
|
}
|
|
|
|
for _, conf := range emailRequired {
|
|
|
|
if conf == "" {
|
|
|
|
log.Error("Default transport set as email, but missing email config")
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getNotifyConf(boxID string) (*core.NotifyConfig, error) {
|
|
|
|
// config used when no configuration is present at all
|
|
|
|
conf := &core.NotifyConfig{
|
|
|
|
Events: []core.NotifyEvent{
|
|
|
|
core.NotifyEvent{
|
|
|
|
Type: "measurement_age",
|
|
|
|
Target: "all",
|
|
|
|
Threshold: "15m",
|
|
|
|
},
|
|
|
|
core.NotifyEvent{
|
|
|
|
Type: "measurement_faulty",
|
|
|
|
Target: "all",
|
|
|
|
Threshold: "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
// override with default configuration from file
|
|
|
|
// considering the case that .events may be defined but empty
|
|
|
|
// to allow to define no events, and don't leak shorter lists into
|
|
|
|
// previous longer ones
|
|
|
|
if keyDefined("healthchecks.default.events") {
|
|
|
|
conf.Events = []core.NotifyEvent{}
|
|
|
|
}
|
|
|
|
err := viper.UnmarshalKey("healthchecks.default", conf)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// override with per box configuration from file
|
|
|
|
if keyDefined("healthchecks." + boxID + ".events") {
|
|
|
|
conf.Events = []core.NotifyEvent{}
|
|
|
|
}
|
|
|
|
err = viper.UnmarshalKey("healthchecks."+boxID, conf)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return conf, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// implement our own keyCheck, as viper.InConfig() does not work
|
|
|
|
func keyDefined(key string) bool {
|
|
|
|
allConfKeys := viper.AllKeys()
|
|
|
|
for _, k := range allConfKeys {
|
|
|
|
if k == key {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|