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 (n *HostNetwork) syncVMDNSResolverRouting(ctx context.Context) error { if n == nil || n.vmDNS == nil { return nil } if strings.TrimSpace(n.config.BridgeName) == "" { return nil } if _, err := lookupExecutableFunc("resolvectl"); err != nil { return nil } if _, err := n.runner.Run(ctx, "ip", "link", "show", n.config.BridgeName); err != nil { return nil } serverAddr := strings.TrimSpace(vmDNSAddrFunc(n.vmDNS)) if serverAddr == "" { return nil } if _, err := n.runner.RunSudo(ctx, "resolvectl", "dns", n.config.BridgeName, serverAddr); err != nil { return err } if _, err := n.runner.RunSudo(ctx, "resolvectl", "domain", n.config.BridgeName, vmResolverRouteDomain); err != nil { return err } _, err := n.runner.RunSudo(ctx, "resolvectl", "default-route", n.config.BridgeName, "no") return err } func (n *HostNetwork) clearVMDNSResolverRouting(ctx context.Context) error { if n == nil || strings.TrimSpace(n.config.BridgeName) == "" { return nil } if _, err := lookupExecutableFunc("resolvectl"); err != nil { return nil } if _, err := n.runner.Run(ctx, "ip", "link", "show", n.config.BridgeName); err != nil { return nil } _, err := n.runner.RunSudo(ctx, "resolvectl", "revert", n.config.BridgeName) return err } func (n *HostNetwork) ensureVMDNSResolverRouting(ctx context.Context) { if err := n.syncVMDNSResolverRouting(ctx); err != nil && n.logger != nil { n.logger.Warn("vm dns resolver route sync failed", "bridge", n.config.BridgeName, "error", err.Error()) } }