From 05bb242f500274c7775755afa89722c46e4529b4 Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 13 May 2026 21:47:07 -0400 Subject: [PATCH] Fix dnsmasq crash by creating tftp-root dir and using subnet config dnsmasq exited with status 3 because the tftp-root directory didn't exist at startup. Also replaced hardcoded 192.168.1.0 in dhcp-range with the configured subnet value. Co-Authored-By: Claude Opus 4.6 --- internal/pxe/supervisor.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/internal/pxe/supervisor.go b/internal/pxe/supervisor.go index 94d43a5..7e86f7d 100644 --- a/internal/pxe/supervisor.go +++ b/internal/pxe/supervisor.go @@ -41,6 +41,9 @@ func (s *Supervisor) Start(ctx context.Context, hosts []model.Host) error { if err := os.MkdirAll(s.cfg.RuntimeDir, 0o755); err != nil { return fmt.Errorf("pxe: create runtime dir: %w", err) } + if err := os.MkdirAll(s.cfg.TFTPRoot, 0o755); err != nil { + return fmt.Errorf("pxe: create tftp root: %w", err) + } if err := s.writeConfig(hosts); err != nil { return err } @@ -82,8 +85,14 @@ func (s *Supervisor) writeConfig(hosts []model.Host) error { return fmt.Errorf("pxe: write dhcp-hostsfile: %w", err) } + subnet := s.cfg.Subnet + if i := strings.Index(subnet, "/"); i != -1 { + subnet = subnet[:i] + } + conf := dnsmasqConf{ Interface: s.cfg.Interface, + Subnet: subnet, TFTPRoot: s.cfg.TFTPRoot, HostsFile: hostsPath, PublicURL: s.cfg.PublicURL, @@ -126,6 +135,7 @@ func (s *Supervisor) startProcess(ctx context.Context) error { type dnsmasqConf struct { Interface string + Subnet string TFTPRoot string HostsFile string PublicURL string @@ -137,7 +147,7 @@ port=0 interface={{.Interface}} bind-interfaces -dhcp-range=tag:known,192.168.1.0,proxy +dhcp-range=tag:known,{{.Subnet}},proxy dhcp-hostsfile={{.HostsFile}} dhcp-ignore=tag:!known