DynDNS: Allow multiple domains
This commit is contained in:
parent
845efe9e8f
commit
8dbb7477be
|
@ -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
|
||||
'';
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue