package daemon import ( "context" "strings" ) const vmResolverRouteDomain = "~vm" 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 := n.lookupExecutable("resolvectl"); err != nil { return nil } if _, err := n.runner.Run(ctx, "ip", "link", "show", n.config.BridgeName); err != nil { return nil } serverAddr := strings.TrimSpace(n.vmDNSAddr(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 := n.lookupExecutable("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()) } }