diff --git a/options/dyndns.nix b/options/dyndns.nix index 1c2151a..6f44b18 100644 --- a/options/dyndns.nix +++ b/options/dyndns.nix @@ -33,7 +33,11 @@ in }; config = lib.mkIf cfg.enable { - systemd.services.dyndns = { + systemd.services.dyndns = let + stateDirectory = "dyndns"; + homeDirectory = "/var/lib/${stateDirectory}"; + in + { enable = true; after = [ "network.target" ]; unitConfig = { @@ -46,7 +50,14 @@ in ProtectSystem = true; ProtectHome = true; NoNewPrivileges = true; + ReadWriteDirectories = [ homeDirectory ]; + StateDirectory = stateDirectory; }; + # preStart = '' + # #!${pkgs.bash}/bin/bash + + # [ -d "${homeDirectory}" ] || mkdir -p "${homeDirectory}" + # ''; script = '' #!${pkgs.bash}/bin/bash @@ -57,6 +68,7 @@ in dyndns_server="${cfg.server}" dyndns_user="${cfg.username}" dyndns_password="$(cat "${cfg.passwordFile}")" + state_file="${homeDirectory}/current_ipv6" new_ip=$(${pkgs.iproute}/bin/ip -6 a show scope global -temporary dev "$interface" | ${pkgs.gnused}/bin/sed -n -E 's/^\ *inet6\ (2001(:[0-9a-f]+)+).*$/\1/p' | head -1) @@ -65,7 +77,12 @@ in exit 1 fi - current_ip=$(${pkgs.dig}/bin/dig aaaa +short "$host") + if [ ! -f "$state_file" ] ; then + echo "No state file found, determining currently set IP via DNS query." + ${pkgs.dig}/bin/dig aaaa +short "$host" > "$state_file" + fi + + current_ip=$(cat "$state_file") if [ -z "$current_ip" ] ; then echo "Could not determine current AAAA record." @@ -79,6 +96,8 @@ in echo "Updating IP to $new_ip." ${pkgs.curl}/bin/curl "https://$dyndns_user:$dyndns_password@$dyndns_server/?hostname=$host&myip=$new_ip" + + echo "$new_ip" > "$state_file" ''; };