fix: systemd path unit for reload — plugin touches trigger file, systemd reloads as root

This commit is contained in:
Claus Lohmar 2026-07-29 09:53:54 +00:00
parent 3c0b210d04
commit a8edcfe823
2 changed files with 27 additions and 8 deletions

View file

@ -354,8 +354,29 @@ EOF
[Service]
Restart=on-failure
RestartSec=5
EOF
# Add path unit: watches for reload trigger, runs systemctl reload dnsmasq as root
cat > /etc/systemd/system/dnsmasq-reload.path << 'EOF'
[Unit]
Description=Watch dnsmasq config for reload trigger
[Path]
PathChanged=/opt/zoraxy/conf/dhcp/dnsmasq.conf.reload
[Install]
WantedBy=multi-user.target
EOF
cat > /etc/systemd/system/dnsmasq-reload.service << 'EOF'
[Unit]
Description=Reload dnsmasq on config change
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl reload dnsmasq
EOF
systemctl daemon-reload
systemctl enable dnsmasq-reload.path 2>/dev/null || true
systemctl start dnsmasq-reload.path 2>/dev/null || true
systemctl enable dnsmasq 2>/dev/null || true
systemctl restart dnsmasq 2>/dev/null || service dnsmasq restart 2>/dev/null || true
log "dnsmasq restarted"

View file

@ -7,7 +7,6 @@ import (
"log"
"net/http"
"os"
"os/exec"
"regexp"
"strconv"
"strings"
@ -24,8 +23,6 @@ var (
// Override via environment: LEASE_FILE, CONF_FILE, RELOAD_CMD, RELOAD_ARGS
leasesFile = envOrDefault("LEASE_FILE", "/opt/zoraxy/conf/dhcp/dnsmasq.leases")
confFile = envOrDefault("CONF_FILE", "/opt/zoraxy/conf/dhcp/dnsmasq.conf")
reloadCmd = envOrDefault("RELOAD_CMD", "/usr/bin/sudo")
reloadArgs = strings.Fields(envOrDefault("RELOAD_ARGS", "pkill -HUP dnsmasq"))
)
func envOrDefault(key, fallback string) string {
@ -242,16 +239,17 @@ func unpinLease(mac string) error {
// reloadDnsmasq runs the reload command (e.g. sudo systemctl reload dnsmasq).
func reloadDnsmasq() error {
// Scrub expired leases before reloading so the UI stays clean.
// Scrub expired leases before reloading.
if err := cleanLeaseFile(); err != nil {
log.Printf("WARNING: failed to clean lease file: %v", err)
// Continue — reload is still useful even if cleaning fails.
}
cmd := exec.Command(reloadCmd, reloadArgs...)
output, err := cmd.CombinedOutput()
// Touch a trigger file — systemd.path unit watches this and reloads dnsmasq.
triggerFile := confFile + ".reload"
f, err := os.Create(triggerFile)
if err != nil {
return fmt.Errorf("reload failed: %w — %s", err, string(output))
return fmt.Errorf("create trigger file: %w", err)
}
f.Close()
return nil
}