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  }