From 8dbb7477bed0fcc5f90fb005c7f387ea6a2e079e Mon Sep 17 00:00:00 2001 From: fruchti Date: Sat, 26 Aug 2023 11:11:12 +0200 Subject: [PATCH] DynDNS: Allow multiple domains --- options/dyndns.nix | 52 ++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/options/dyndns.nix b/options/dyndns.nix index 6f44b18..09ea088 100644 --- a/options/dyndns.nix +++ b/options/dyndns.nix @@ -11,9 +11,9 @@ in description = "Identifier of the network interface to use"; }; - domain = lib.mkOption { - type = lib.types.str; - description = "Domain name to update"; + domains = lib.mkOption { + type = lib.types.listOf lib.types.str; + description = "Domain names to update"; }; server = lib.mkOption { @@ -41,7 +41,7 @@ in enable = true; after = [ "network.target" ]; unitConfig = { - Description = "Update AAAA records for ${cfg.domain} via DynDNS"; + Description = "Update AAAA records via DynDNS"; }; serviceConfig = { DynamicUser = true; @@ -53,22 +53,15 @@ in ReadWriteDirectories = [ homeDirectory ]; StateDirectory = stateDirectory; }; - # preStart = '' - # #!${pkgs.bash}/bin/bash - - # [ -d "${homeDirectory}" ] || mkdir -p "${homeDirectory}" - # ''; script = '' #!${pkgs.bash}/bin/bash set -eu - host="${cfg.domain}" interface="${cfg.interface}" 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) @@ -77,27 +70,32 @@ in exit 1 fi - 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 + for host in ${builtins.concatStringsSep " " cfg.domains} ; do + echo "Checking $host." - current_ip=$(cat "$state_file") + state_file="${homeDirectory}/current_ipv6_$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 - if [ -z "$current_ip" ] ; then - echo "Could not determine current AAAA record." - exit 1 - fi + current_ip=$(cat "$state_file") - if [ "$current_ip" = "$new_ip" ] ; then - echo "Current AAAA record is already $current_ip, no update needed." - exit 0 - fi + if [ -z "$current_ip" ] ; then + echo "Could not determine current AAAA record." + exit 1 + fi - echo "Updating IP to $new_ip." - ${pkgs.curl}/bin/curl "https://$dyndns_user:$dyndns_password@$dyndns_server/?hostname=$host&myip=$new_ip" + if [ "$current_ip" = "$new_ip" ] ; then + echo "Current AAAA record is already $current_ip, no update needed." + continue + fi - echo "$new_ip" > "$state_file" + 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" + done ''; };