From 4505d8b340359aea3bbcfc9600cbf0395d9ae4cf Mon Sep 17 00:00:00 2001 From: arcnmx Date: Tue, 20 Feb 2024 16:04:14 -0800 Subject: [PATCH] fix(avahi): workaround weird hostname conflicts --- nixos/avahi.nix | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/nixos/avahi.nix b/nixos/avahi.nix index 8d8013d5..fe00fcf2 100644 --- a/nixos/avahi.nix +++ b/nixos/avahi.nix @@ -1,9 +1,12 @@ { + pkgs, config, lib, ... }: let - inherit (lib.modules) mkDefault; + inherit (lib.modules) mkDefault mkIf mkOptionDefault; + inherit (lib.strings) makeBinPath; + cfg = config.services.avahi; in { services.avahi = { enable = mkDefault true; @@ -16,4 +19,41 @@ in { }; wideArea = mkDefault false; }; + + systemd.services = let + # work around a weird bug or interaction in avahi-daemon + RestartSec = 2; + daemon = "avahi-daemon.service"; + avahi-daemon-watchdog = pkgs.writeShellScript "avahi-daemon-watchdog" '' + set -eu + export PATH="$PATH:${makeBinPath [ config.systemd.package pkgs.coreutils pkgs.gnugrep ]}" + while read -r line; do + if [[ $line = *"Host name conflict"* ]]; then + if systemctl is-active ${daemon} > /dev/null; then + echo restarting avahi-daemon due to host name conflict... >&2 + systemctl stop ${daemon} + sleep ${toString RestartSec} + systemctl start ${daemon} + fi + fi + done < <(journalctl -o cat -feu ${daemon} | grep -F 'Host name conflict, retrying with ') + ''; + in mkIf (cfg.enable && cfg.publish.enable) { + avahi-daemon = { + serviceConfig = { + inherit RestartSec; + }; + }; + avahi-daemon-watchdog = { + wantedBy = [ daemon ]; + serviceConfig = { + Type = mkOptionDefault "exec"; + ExecStart = [ + "${avahi-daemon-watchdog}" + ]; + Restart = mkOptionDefault "on-failure"; + RestartSec = mkOptionDefault RestartSec; + }; + }; + }; }