summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2026-08-20 21:45:20 +0200
committerMel <mel@rnrd.eu>2026-08-20 21:45:20 +0200
commit6a4c0a16118d0b545c3c5f6a08ecad432940c1cf (patch)
tree39da9f54ce2d8a3c2401d4744b2cad6c65565ed1 /main.go
parentb52c860a7b1d3f57abc442bb8c1257f228d49536 (diff)
downloadddnnss-6a4c0a16118d0b545c3c5f6a08ecad432940c1cf.tar.zst
ddnnss-6a4c0a16118d0b545c3c5f6a08ecad432940c1cf.zip
Clean logging for modules
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'main.go')
-rw-r--r--main.go119
1 files changed, 84 insertions, 35 deletions
diff --git a/main.go b/main.go
index cc99e9e..96a3ae7 100644
--- a/main.go
+++ b/main.go
@@ -27,50 +27,55 @@ func main() {
return
}
- slog.Info("ddnnss!", slog.String("version", version))
+ baseLog := slog.New(slog.NewTextHandler(os.Stderr, nil))
+ baseLog.Info("ddnnss!", slog.String("version", version))
cfg, err := LoadConfig(*configPath)
if err != nil {
- slog.Error("could not load config", slog.String("error", err.Error()))
+ baseLog.Error("could not load config", slog.String("error", err.Error()))
os.Exit(1)
}
- providers := map[string]provider.Provider{}
- sources := map[string]source.Source{}
+ providers, sources := createModules(baseLog, cfg)
- slog.Info("starting new cycle", slog.Int("records", len(cfg.Records)))
+ baseLog.Info("starting new cycle", slog.Int("records", len(cfg.Records)))
failed := false
for _, r := range cfg.Records {
fqdn := r.Name + "." + r.Zone
- log := slog.With("record", fqdn, "type", r.Type)
+ log := baseLog.With(
+ slog.Group("record",
+ slog.String("fqdn", fqdn),
+ slog.String("type", string(r.Type)),
+ ),
+ )
+
+ sourceName, providerName := r.Source, r.Provider
log.Info(
"ensuring record",
- slog.String("provider", r.Provider),
- slog.String("source", r.Source),
+ slog.String("provider", providerName),
+ slog.String("source", sourceName),
)
- p, ok := providers[r.Provider]
- if !ok {
- p, err = provider.New(log, cfg.Providers[r.Provider])
- if err != nil {
- log.Error("provider setup failed", "provider", r.Provider, "error", err)
- failed = true
- continue
- }
- providers[r.Provider] = p
+ s, ok := sources[sourceName]
+ if !ok || s == nil {
+ log.Error(
+ "skipping record, failed creating source",
+ slog.String("source", sourceName),
+ )
+ failed = true
+ continue
}
- s, ok := sources[r.Source]
- if !ok {
- s, err = source.New(log, cfg.Sources[r.Source])
- if err != nil {
- log.Error("source setup failed", "source", r.Source, "error", err)
- failed = true
- continue
- }
- sources[r.Source] = s
+ p, ok := providers[providerName]
+ if !ok || p == nil {
+ log.Error(
+ "skipping record, failed creating provider",
+ slog.String("provider", providerName),
+ )
+ failed = true
+ continue
}
family := source.IPv4
@@ -78,15 +83,22 @@ func main() {
family = source.IPv6
}
if !s.Supports(family) {
- log.Error("source cannot provide the needed address family",
- "source", r.Source, "family", family)
+ log.Error(
+ "skipping record, source cannot provide the needed address family",
+ slog.String("source", sourceName),
+ slog.String("family", string(family)),
+ )
failed = true
continue
}
addr, err := s.Lookup(family)
if err != nil {
- log.Error("address lookup failed", "source", r.Source, "error", err)
+ log.Error(
+ "failed record, address lookup failed",
+ slog.String("source", sourceName),
+ slog.String("error", err.Error()),
+ )
failed = true
continue
}
@@ -94,25 +106,62 @@ func main() {
prev, changed, err := p.Ensure(r.Zone, r.Name, r.Type, addr)
switch {
case err != nil:
- log.Error("update failed", "error", err)
+ log.Error("record update failed", slog.String("error", err.Error()))
failed = true
case changed && prev == "":
- log.Info("record created", "addr", addr)
+ log.Info("record created", slog.String("addr", addr.String()))
case changed:
- log.Info("record updated", "from", prev, "to", addr)
+ log.Info("record updated", slog.String("from", prev), slog.String("to", addr.String()))
default:
log.Info("record unchanged", "addr", addr)
}
}
- slog.Info(
- "cycle finished",
+ baseLog.Info(
+ "cycle finished!",
slog.Int("records", len(cfg.Records)),
slog.Bool("failed", failed),
)
if failed {
- slog.Error("not all records were ensured successfully")
+ baseLog.Error("not all records were ensured successfully")
os.Exit(1)
}
}
+
+func createModules(log *slog.Logger, cfg *Config) (map[string]provider.Provider, map[string]source.Source) {
+ sources := map[string]source.Source{}
+ providers := map[string]provider.Provider{}
+
+ for name, c := range cfg.Sources {
+ s, err := source.New(log, name, c)
+ if err != nil {
+ log.Error(
+ "failed creating source",
+ slog.String("name", name),
+ slog.String("kind", string(c.Kind)),
+ slog.String("error", err.Error()),
+ )
+ sources[name] = nil
+ continue
+ }
+ sources[name] = s
+ }
+
+ for name, c := range cfg.Providers {
+ p, err := provider.New(log, name, c)
+ if err != nil {
+ log.Error(
+ "failed creating provider",
+ slog.String("name", name),
+ slog.String("kind", string(c.Kind)),
+ slog.String("error", err.Error()),
+ )
+ providers[name] = nil
+ continue
+ }
+ providers[name] = p
+ }
+
+ return providers, sources
+}