github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/rootd/dns/server_windows.go (about) 1 package dns 2 3 import ( 4 "context" 5 "fmt" 6 "net" 7 "time" 8 9 "github.com/datawire/dlib/dgroup" 10 "github.com/telepresenceio/telepresence/v2/pkg/vif" 11 ) 12 13 const ( 14 maxRecursionTestRetries = 40 15 recursionTestTimeout = 1500 * time.Millisecond 16 ) 17 18 func (s *Server) Worker(c context.Context, dev vif.Device, configureDNS func(net.IP, *net.UDPAddr)) error { 19 listener, err := newLocalUDPListener(c) 20 if err != nil { 21 return err 22 } 23 dnsAddr, err := splitToUDPAddr(listener.LocalAddr()) 24 if err != nil { 25 return err 26 } 27 configureDNS(s.remoteIP, dnsAddr) 28 29 // Start local DNS server 30 g := dgroup.NewGroup(c, dgroup.GroupConfig{}) 31 g.Go("Server", func(c context.Context) error { 32 // No need to close listener. It's closed by the dns server. 33 defer func() { 34 c, cancel := context.WithTimeout(context.WithoutCancel(c), 5*time.Second) 35 s.Lock() 36 _ = dev.SetDNS(c, s.clusterDomain, s.remoteIP, nil) 37 s.Unlock() 38 cancel() 39 }() 40 if err := s.updateRouterDNS(c, dev); err != nil { 41 return err 42 } 43 s.processSearchPaths(g, s.updateRouterDNS, dev) 44 return s.Run(c, make(chan struct{}), []net.PacketConn{listener}, nil, s.resolveInCluster) 45 }) 46 return g.Wait() 47 } 48 49 func (s *Server) updateRouterDNS(c context.Context, dev vif.Device) error { 50 s.Lock() 51 err := dev.SetDNS(c, s.clusterDomain, s.remoteIP, s.search) 52 s.Unlock() 53 s.flushDNS() 54 if err != nil { 55 return fmt.Errorf("failed to set DNS: %w", err) 56 } 57 return nil 58 }