func NewCacheServer(space app.Space, config *dns.Config) *CacheServer { server := &CacheServer{ records: make(map[string]*DomainRecord), servers: make([]NameServer, len(config.NameServers)), hosts: config.GetInternalHosts(), } space.InitializeApplication(func() error { if !space.HasApp(dispatcher.APP_ID) { return errors.New("DNS: Dispatcher is not found in the space.") } dispatcher := space.GetApp(dispatcher.APP_ID).(dispatcher.PacketDispatcher) for idx, destPB := range config.NameServers { address := destPB.Address.AsAddress() if address.Family().IsDomain() && address.Domain() == "localhost" { server.servers[idx] = &LocalNameServer{} } else { dest := destPB.AsDestination() if dest.Network == v2net.Network_Unknown { dest.Network = v2net.Network_UDP } if dest.Network == v2net.Network_UDP { server.servers[idx] = NewUDPNameServer(dest, dispatcher) } } } if len(config.NameServers) == 0 { server.servers = append(server.servers, &LocalNameServer{}) } return nil }) return server }
func (this *DnsConfig) Build() *dns.Config { config := new(dns.Config) config.NameServers = make([]*v2net.Endpoint, len(this.Servers)) for idx, server := range this.Servers { config.NameServers[idx] = &v2net.Endpoint{ Network: v2net.Network_UDP, Address: server.Build(), Port: 53, } } if this.Hosts != nil { config.Hosts = make(map[string]*v2net.IPOrDomain) for k, v := range this.Hosts { config.Hosts[k] = v.Build() } } return config }
func NewCacheServer(ctx context.Context, config *dns.Config) (*CacheServer, error) { space := app.SpaceFromContext(ctx) if space == nil { return nil, errors.New("DNSCacheServer: No space in context.") } server := &CacheServer{ records: make(map[string]*DomainRecord), servers: make([]NameServer, len(config.NameServers)), hosts: config.GetInternalHosts(), } space.OnInitialize(func() error { disp := dispatcher.FromSpace(space) if disp == nil { return errors.New("DNS: Dispatcher is not found in the space.") } for idx, destPB := range config.NameServers { address := destPB.Address.AsAddress() if address.Family().IsDomain() && address.Domain() == "localhost" { server.servers[idx] = &LocalNameServer{} } else { dest := destPB.AsDestination() if dest.Network == v2net.Network_Unknown { dest.Network = v2net.Network_UDP } if dest.Network == v2net.Network_UDP { server.servers[idx] = NewUDPNameServer(dest, disp) } } } if len(config.NameServers) == 0 { server.servers = append(server.servers, &LocalNameServer{}) } return nil }) return server, nil }