package daemon import ( "context" "strings" "banger/internal/system" "banger/internal/vmdns" ) const vmResolverRouteDomain = "~vm" var ( lookupExecutableFunc = system.LookupExecutable vmDNSAddrFunc = func(server *vmdns.Server) string { return server.Addr() } ) func (d *Daemon) syncVMDNSResolverRouting(ctx context.Context) error { if d == nil || d.vmDNS == nil { return nil } if strings.TrimSpace(d.config.BridgeName) == "" { return nil } if _, err := lookupExecutableFunc("resolvectl"); err != nil { return nil } if _, err := d.runner.Run(ctx, "ip", "link", "show", d.config.BridgeName); err != nil { return nil } serverAddr := strings.TrimSpace(vmDNSAddrFunc(d.vmDNS)) if serverAddr == "" { return nil } if _, err := d.runner.RunSudo(ctx, "resolvectl", "dns", d.config.BridgeName, serverAddr); err != nil { return err } if _, err := d.runner.RunSudo(ctx, "resolvectl", "domain", d.config.BridgeName, vmResolverRouteDomain); err != nil { return err } _, err := d.runner.RunSudo(ctx, "resolvectl", "default-route", d.config.BridgeName, "no") return err } func (d *Daemon) clearVMDNSResolverRouting(ctx context.Context) error { if d == nil || strings.TrimSpace(d.config.BridgeName) == "" { return nil } if _, err := lookupExecutableFunc("resolvectl"); err != nil { return nil } if _, err := d.runner.Run(ctx, "ip", "link", "show", d.config.BridgeName); err != nil { return nil } _, err := d.runner.RunSudo(ctx, "resolvectl", "revert", d.config.BridgeName) return err } func (d *Daemon) ensureVMDNSResolverRouting(ctx context.Context) { if err := d.syncVMDNSResolverRouting(ctx); err != nil && d.logger != nil { d.logger.Warn("vm dns resolver route sync failed", "bridge", d.config.BridgeName, "error", err.Error()) } }