86 lines
1.7 KiB
Go
86 lines
1.7 KiB
Go
/*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
package handler
|
|
|
|
import (
|
|
"text/template"
|
|
|
|
"git.st8l.com/luxolus/kdnotify/config"
|
|
n "git.st8l.com/luxolus/kdnotify/schema/notify"
|
|
)
|
|
|
|
type VrrpHandler struct {
|
|
Config *config.WatchConfig
|
|
Cxt *config.LibCxt
|
|
}
|
|
|
|
type TemplateEnv struct {
|
|
Cxt any
|
|
Event MessageEvent
|
|
}
|
|
|
|
type MessageEvent struct {
|
|
Type string
|
|
State string
|
|
Instance string
|
|
}
|
|
|
|
func NewVrrp(cxt *config.LibCxt, cfg *config.WatchConfig) *VrrpHandler {
|
|
return &VrrpHandler{
|
|
Config: cfg,
|
|
Cxt: &config.LibCxt{
|
|
Logger: cxt.Logger.Named("handler"),
|
|
Context: cxt.Context,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (h *VrrpHandler) ProcessVrrp(msg n.VrrpMessage) error {
|
|
log, matches := h.Cxt.Logger.Sugar(), 0
|
|
|
|
for _, rule := range h.Config.Rules {
|
|
if rule.Match(&msg) {
|
|
matches += 1
|
|
env := h.newTemplateEnv(&msg)
|
|
err := h.execTemplate(rule.Exec, &env)
|
|
if err != nil {
|
|
log.Warnw("failed to evaluate rule", "instance", msg.Instance, "error", err)
|
|
}
|
|
}
|
|
}
|
|
log.Debugw("processed VRRP message", "instance", msg.Instance, "rules", matches)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *VrrpHandler) execTemplate(t *template.Template, env *TemplateEnv) error {
|
|
cmdline, err := runTemplate(t, env)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
cmd, err := mkCmd(cmdline)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
go execRuleCmd(cmd, h.Cxt.Logger)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (h *VrrpHandler) newTemplateEnv(msg *n.VrrpMessage) TemplateEnv {
|
|
return TemplateEnv{
|
|
Cxt: h.Config.Context,
|
|
Event: MessageEvent{
|
|
Type: msg.Type.String(),
|
|
State: msg.State.String(),
|
|
Instance: msg.Instance,
|
|
},
|
|
}
|
|
}
|