90 lines
1.6 KiB
Go
90 lines
1.6 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"git.binarythought.com/cdramey/alrm/alarm"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type Config struct {
|
|
Groups map[string]*Group
|
|
Alarms map[string]alarm.Alarm
|
|
Interval time.Duration
|
|
DebugLevel int
|
|
Listen string
|
|
Path string
|
|
APIKey []byte
|
|
APIKeyFile string
|
|
}
|
|
|
|
func (c *Config) NewAlarm(name string, typename string) (alarm.Alarm, error) {
|
|
if c.Alarms == nil {
|
|
c.Alarms = make(map[string]alarm.Alarm)
|
|
}
|
|
|
|
if _, exists := c.Alarms[name]; exists {
|
|
return nil, fmt.Errorf("alarm %s already exists", name)
|
|
}
|
|
|
|
a, err := alarm.NewAlarm(name, typename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
c.Alarms[name] = a
|
|
|
|
return a, nil
|
|
}
|
|
|
|
func (c *Config) NewGroup(name string) (*Group, error) {
|
|
if c.Groups == nil {
|
|
c.Groups = make(map[string]*Group)
|
|
}
|
|
|
|
if _, exists := c.Groups[name]; exists {
|
|
return nil, fmt.Errorf("group %s already exists", name)
|
|
}
|
|
|
|
group := &Group{Name: name}
|
|
c.Groups[name] = group
|
|
return group, nil
|
|
}
|
|
|
|
func (c *Config) SetInterval(val string) error {
|
|
interval, err := time.ParseDuration(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.Interval = interval
|
|
return nil
|
|
}
|
|
|
|
func ReadConfig(fn string, debuglvl int) (*Config, error) {
|
|
cfg := &Config{
|
|
// Default check interval, 30 seconds
|
|
Interval: time.Second * 30,
|
|
// Default listen address
|
|
Listen: "127.0.0.1:8282",
|
|
DebugLevel: debuglvl,
|
|
Path: fn,
|
|
// API keyfile defaults to alrmrc.key
|
|
APIKeyFile: fn + ".key",
|
|
}
|
|
|
|
pr := &parser{config: cfg}
|
|
if err := pr.parse(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(cfg.APIKey) == 0 {
|
|
b, err := os.ReadFile(cfg.APIKeyFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cfg.APIKey = b
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|