package daemon import ( "context" "fmt" "isle/bootstrap" "isle/dnsmasq" "path/filepath" "sort" "code.betamike.com/micropelago/pmux/pmuxlib" "dev.mediocregopher.com/mediocre-go-lib.git/mlog" ) func dnsmasqConfig( daemonConfig Config, hostBootstrap bootstrap.Bootstrap, ) dnsmasq.ConfData { hostsSlice := make([]dnsmasq.ConfDataHost, 0, len(hostBootstrap.Hosts)) for _, host := range hostBootstrap.Hosts { hostsSlice = append(hostsSlice, dnsmasq.ConfDataHost{ Name: string(host.Name), IP: host.IP().String(), }) } sort.Slice(hostsSlice, func(i, j int) bool { return hostsSlice[i].IP < hostsSlice[j].IP }) return dnsmasq.ConfData{ Resolvers: daemonConfig.DNS.Resolvers, Domain: hostBootstrap.NetworkCreationParams.Domain, IP: hostBootstrap.ThisHost().IP().String(), Hosts: hostsSlice, } } func dnsmasqWriteConfig( runtimeDirPath string, daemonConfig Config, hostBootstrap bootstrap.Bootstrap, ) ( string, error, ) { var ( confPath = filepath.Join(runtimeDirPath, "dnsmasq.conf") confData = dnsmasqConfig(daemonConfig, hostBootstrap) ) if err := dnsmasq.WriteConfFile(confPath, confData); err != nil { return "", fmt.Errorf("writing dnsmasq.conf to %q: %w", confPath, err) } return confPath, nil } func dnsmasqPmuxProcConfig( logger *mlog.Logger, runtimeDirPath, binDirPath string, daemonConfig Config, hostBootstrap bootstrap.Bootstrap, ) ( pmuxlib.ProcessConfig, error, ) { confPath, err := dnsmasqWriteConfig( runtimeDirPath, daemonConfig, hostBootstrap, ) if err != nil { return pmuxlib.ProcessConfig{}, fmt.Errorf( "writing dnsmasq config: %w", err, ) } return pmuxlib.ProcessConfig{ Cmd: filepath.Join(binDirPath, "dnsmasq"), Args: []string{"-d", "-C", confPath}, StartAfterFunc: func(ctx context.Context) error { // TODO consider a shared dnsmasq across all the daemon's networks. // This would have a few benefits: // - Less processes, less problems // - Less configuration for the user in the case of more than one // network. // - Can listen on 127.0.0.x:53, rather than on the nebula address. // This allows DNS to come up before nebula, which is helpful when // nebula depends on DNS. return waitForNebula(ctx, logger, hostBootstrap) }, }, nil }