isle/go/daemon/children/dnsmasq.go

85 lines
2.0 KiB
Go
Raw Permalink Normal View History

package children
import (
2024-07-19 14:50:20 +00:00
"context"
"fmt"
"isle/bootstrap"
"isle/daemon/daecommon"
"isle/dnsmasq"
"path/filepath"
"code.betamike.com/micropelago/pmux/pmuxlib"
2024-07-19 14:50:20 +00:00
"dev.mediocregopher.com/mediocre-go-lib.git/mlog"
)
func dnsmasqWriteConfig(
ctx context.Context,
logger *mlog.Logger,
runtimeDirPath string,
networkConfig daecommon.NetworkConfig,
hostBootstrap bootstrap.Bootstrap,
) (
string, bool, error,
) {
hosts := make([]dnsmasq.ConfDataHost, 0, len(hostBootstrap.Hosts))
for _, host := range hostBootstrap.Hosts {
hosts = append(hosts, dnsmasq.ConfDataHost{
Name: string(host.Name),
IP: host.IP().String(),
})
}
var (
confPath = filepath.Join(runtimeDirPath, "dnsmasq.conf")
confData = dnsmasq.ConfData{
Resolvers: networkConfig.DNS.Resolvers,
Domain: hostBootstrap.NetworkCreationParams.Domain,
IP: hostBootstrap.ThisHost().IP().String(),
Hosts: hosts,
}
)
changed, err := dnsmasq.WriteConfFile(ctx, logger, confPath, confData)
if err != nil {
return "", false, fmt.Errorf(
"writing dnsmasq.conf to %q: %w", confPath, err,
)
}
return confPath, changed, nil
}
func dnsmasqPmuxProc(
ctx context.Context,
logger *mlog.Logger,
runtimeDirPath, binDirPath string,
networkConfig daecommon.NetworkConfig,
hostBootstrap bootstrap.Bootstrap,
) (
*pmuxlib.Process, error,
) {
confPath, _, err := dnsmasqWriteConfig(
ctx, logger, runtimeDirPath, networkConfig, hostBootstrap,
)
if err != nil {
return nil, fmt.Errorf(
"writing dnsmasq config: %w", err,
)
}
cfg := pmuxlib.ProcessConfig{
Cmd: filepath.Join(binDirPath, "dnsmasq"),
Args: []string{
// Don't daemonize. The docs say to use --keep-in-foreground in
// production, and that this flag is for debugging only, but only
// with this flag will sigint work as expected.
"--no-daemon",
"--log-facility=-", // Log only to stderr
"-C", confPath,
},
}
cfg = withPmuxLoggers(ctx, logger, "dnsmasq", cfg)
return pmuxlib.NewProcess(cfg), nil
}