// Package updater runs one dynamic DNS update pass across all configured entries. package updater import ( "fmt" "log" "git.aehoo.net/alphard/he-dydns/internal/config" "git.aehoo.net/alphard/he-dydns/internal/hedns" "git.aehoo.net/alphard/he-dydns/internal/network" ) // Run discovers the current address(es) and updates every configured entry. // It returns an error only when address discovery itself fails outright; // per-entry update failures are logged and aggregated but do not stop other // entries from being attempted. func Run(cfg *config.Config) error { addrs, err := network.Discover(cfg.Interface) if err != nil { return fmt.Errorf("discovering address: %w", err) } if addrs.Empty() { log.Printf("no address found (interface=%q); skipping update", cfg.Interface) return nil } if addrs.IPv4 != nil { log.Printf("discovered IPv4 address %s", addrs.IPv4) } if addrs.IPv6 != nil { log.Printf("discovered IPv6 address %s", addrs.IPv6) } var failures int for _, entry := range cfg.Entries { if addrs.IPv4 != nil { if err := hedns.Update(entry.Hostname, entry.Token, addrs.IPv4); err != nil { log.Printf("error: %v", err) failures++ } else { log.Printf("updated %s -> %s", entry.Hostname, addrs.IPv4) } } if addrs.IPv6 != nil { if err := hedns.Update(entry.Hostname, entry.Token, addrs.IPv6); err != nil { log.Printf("error: %v", err) failures++ } else { log.Printf("updated %s -> %s", entry.Hostname, addrs.IPv6) } } } if failures > 0 { return fmt.Errorf("%d update(s) failed", failures) } return nil }