two/internal/watchdog/resources.go
GnomeZworc 0fa84b8320
f-29: watchdog: add checksubnet #29
Signed-off-by: GnomeZworc <nicolas.boufidjeline@g3e.fr>
2026-08-17 23:39:25 +02:00

72 lines
1.4 KiB
Go

package watchdog
import (
"fmt"
"sort"
"strings"
"git.g3e.fr/syonad/two/internal/netif"
"git.g3e.fr/syonad/two/internal/watchdog/notify"
"git.g3e.fr/syonad/two/pkg/systemd"
)
const (
prefixVPC = "vpc/"
prefixSubnet = "subnet/"
prefixVM = "vm/"
kindVPC = "vpc"
kindSubnet = "subnet"
kindVM = "vm"
stateSuffix = "/state"
)
func resourceNames(pairs map[string]string, prefix string) []string {
names := make([]string, 0, len(pairs))
for key := range pairs {
name, ok := strings.CutPrefix(key, prefix)
if !ok {
continue
}
name, ok = strings.CutSuffix(name, stateSuffix)
if !ok {
continue
}
if name == "" || strings.Contains(name, "/") {
continue
}
names = append(names, name)
}
sort.Strings(names)
return names
}
type unitChecker interface {
Status(unit string) (*systemd.ServiceStatus, error)
}
func checkUnit(kind, name, unit string, u unitChecker, n notify.Notifier) {
if u == nil {
return
}
st, err := u.Status(unit)
if err != nil {
n.Notify(kind, name, fmt.Sprintf("unit %s illisible: %v", unit, err))
return
}
if st.ActiveState != "active" {
n.Notify(kind, name, fmt.Sprintf("unit %s %s (%s)", unit, st.ActiveState, st.SubState))
}
}
func linkProblem(iface string) string {
up, err := netif.LinkIsUp(iface)
switch {
case err != nil:
return fmt.Sprintf("interface %s introuvable: %v", iface, err)
case !up:
return fmt.Sprintf("interface %s down", iface)
}
return ""
}