diff --git a/ChangeLog.md b/ChangeLog.md index 6ac8d0c..8f1eba9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -81,6 +81,10 @@ repository history](https://github.com/ddclient/ddclient/commits/master). [#670](https://github.com/ddclient/ddclient/pull/670) * Fixed DNSExit provider when configured with a zone and non-identical hostname. [#673](https://github.com/ddclient/ddclient/issues/673) + * `infomaniak`: Fixed frequent forced updates after 25 days (`max-interval`). + [#691](https://github.com/ddclient/ddclient/issues/691) + * `regfishde`: Fixed IPv6 support. + [#691](https://github.com/ddclient/ddclient/issues/691) ## 2023-11-23 v3.11.2 diff --git a/ddclient.in b/ddclient.in index 0f4cf74..88419a6 100755 --- a/ddclient.in +++ b/ddclient.in @@ -210,9 +210,9 @@ our %builtinweb = ( sub query_cisco { my ($h, $asa, $v4) = @_; - warning("'--if' is deprecated for '--usev4=ifv4; use '--ifv4' instead") + warning("'--if' is deprecated for '--usev4=cisco%s; use '--ifv4' instead", $asa ? '-asa' : '') if ($v4 && !defined(opt('ifv4')) && defined(opt('if', $h))); - warning("'--fw' is deprecated for '--usev4=fwv4; use '--fwv4' instead") + warning("'--fw' is deprecated for '--usev4=cisco%s; use '--fwv4' instead", $asa ? '-asa' : '') if ($v4 && !defined(opt('fwv4')) && defined(opt('fw', $h))); my $if = ($v4 ? opt('ifv4', $h) : undef) // opt('if', $h); my $fw = ($v4 ? opt('fwv4', $h) : undef) // opt('fw', $h); @@ -1323,9 +1323,9 @@ sub main { fatal("invalid argument '--use=%s'; possible values are:\n%s", $opt{'use'}, join("\n", ip_strategies_usage())) - unless exists $ip_strategies{lc opt('use')}; + if defined(opt('use')) && !$ip_strategies{lc(opt('use'))}; if (defined($opt{'usev6'})) { - usage("invalid argument '--usev6=%s'; possible values are:\n%s", + fatal("invalid argument '--usev6=%s'; possible values are:\n%s", $opt{'usev6'}, join("\n", ipv6_strategies_usage())) unless exists $ipv6_strategies{lc opt('usev6')}; } @@ -1565,7 +1565,7 @@ sub write_recap { $recap{$h}{$v} = $config{$h}{$v}; } } else { - for my $v (qw(atime wtime status)) { + for my $v (qw(atime wtime status status-ipv4 status-ivp6)) { $recap{$h}{$v} = $config{$h}{$v}; } } @@ -1620,7 +1620,7 @@ sub read_recap { for my $h (keys(%recap)) { next if !exists($config->{$h}); - for (qw(atime mtime wtime ip status)) { + for (qw(atime mtime wtime ip ipv4 ipv6 status status-ipv4 status-ipv6)) { # TODO: Isn't $config equal to \%recap here? If so, this is a no-op. What was the # original intention behind this? To copy %recap values into %config? If so, is # it better to just delete this and live with the current behavior (which doesn't @@ -2019,8 +2019,8 @@ sub init_config { HOST: for my $h (keys %config) { my $proto = opt('protocol', $h); - load_sha1_support($proto) if (grep(/^$proto$/, ("freedns", "nfsn"))); - load_json_support($proto) if (grep(/^$proto$/, ("1984", "cloudflare", "digitalocean", "gandi", "godaddy", "hetzner", "yandex", "nfsn", "njalla", "porkbun", "dnsexit2"))); + load_sha1_support($proto) if (grep($_ eq $proto, ("freedns", "nfsn"))); + load_json_support($proto) if (grep($_ eq $proto, ("1984", "cloudflare", "digitalocean", "gandi", "godaddy", "hetzner", "yandex", "nfsn", "njalla", "porkbun", "dnsexit2"))); if (!exists($protocols{$proto})) { warning("skipping host: %s: unrecognized protocol '%s'", $h, $proto); @@ -2101,9 +2101,10 @@ sub test_possible_ip { local $opt{'debug'} = 0; printf "----- Test_possible_ip with 'get_ip' -----\n"; - printf "use=ip, ip=%s address is %s\n", opt('ip'), get_ip('ip') // 'NOT FOUND' - if defined opt('ip'); - + if (defined(opt('ip'))) { + local $opt{'use'} = 'ip'; + printf "use=ip, ip=%s address is %s\n", opt('ip'), get_ip('ip') // 'NOT FOUND'; + } { local $opt{'use'} = 'if'; # Note: The `ip` command adds a `@eth0` suffix to the names of VLAN @@ -2127,7 +2128,7 @@ sub test_possible_ip { } } local $opt{'use'} = 'fw'; - printf "use=fw, fw=%s address is %s\n", opt('fw'), get_ip(opt('fw')) // 'NOT FOUND' + printf "use=fw, fw=%s address is %s\n", opt('fw'), get_ip('fw') // 'NOT FOUND' if !exists $builtinfw{opt('fw')}; } @@ -2147,10 +2148,12 @@ sub test_possible_ip { # Now force IPv4 printf "----- Test_possible_ip with 'get_ipv4' ------\n"; - printf "use=ipv4, ipv4=%s address is %s\n", opt('ipv4'), get_ipv4('ipv4') // 'NOT FOUND' - if defined opt('ipv4'); - + if (defined(opt('ipv4'))) { + local $opt{'usev4'} = 'ipv4'; + printf "usev4=ipv4, ipv4=%s address is %s\n", opt('ipv4'), get_ipv4('ipv4') // 'NOT FOUND'; + } { + local $opt{'usev4'} = 'ifv4'; # Note: The `ip` command adds a `@eth0` suffix to the names of VLAN # interfaces. That `@eth0` suffix is NOT part of the interface name. my @ifs = map({ /^[^\s:]*:\s*([^\s:@]+)/ ? $1 : () } @@ -2161,30 +2164,32 @@ sub test_possible_ip { warning("failed to get list of interfaces") if !@ifs; for my $if (@ifs) { local $opt{'ifv4'} = $if; - printf "use=ifv4, ifv4=%s address is %s\n", opt('ifv4'), get_ipv4('ifv4') // 'NOT FOUND'; + printf "usev4=ifv4, ifv4=%s address is %s\n", opt('ifv4'), get_ipv4('ifv4') // 'NOT FOUND'; } } { local $opt{'usev4'} = 'webv4'; for my $web (sort keys %builtinweb) { local $opt{'webv4'} = $web; - printf "use=webv4, webv4=$web address is %s\n", get_ipv4('webv4') // 'NOT FOUND' + printf "usev4=webv4, webv4=$web address is %s\n", get_ipv4('webv4') // 'NOT FOUND' if ($web !~ "6") ## Don't bother if web site only supports IPv6; } - printf "use=webv4, webv4=%s address is %s\n", opt('webv4'), get_ipv4('webv4') // 'NOT FOUND' + printf "usev4=webv4, webv4=%s address is %s\n", opt('webv4'), get_ipv4('webv4') // 'NOT FOUND' if ! exists $builtinweb{opt('webv4')}; } if (opt('cmdv4')) { local $opt{'usev4'} = 'cmdv4'; - printf "use=cmdv4, cmdv4=%s address is %s\n", opt('cmdv4'), get_ipv4('cmdv4') // 'NOT FOUND'; + printf "usev4=cmdv4, cmdv4=%s address is %s\n", opt('cmdv4'), get_ipv4('cmdv4') // 'NOT FOUND'; } # Now force IPv6 printf "----- Test_possible_ip with 'get_ipv6' -----\n"; - printf "use=ipv6, ipv6=%s address is %s\n", opt('ipv6'), get_ipv6('ipv6') // 'NOT FOUND' - if defined opt('ipv6'); - + if (defined(opt('ipv6'))) { + local $opt{'usev6'} = 'ipv6'; + printf "usev6=ipv6, ipv6=%s address is %s\n", opt('ipv6'), get_ipv6('ipv6') // 'NOT FOUND'; + } { + local $opt{'usev6'} = 'ifv6'; # Note: The `ip` command adds a `@eth0` suffix to the names of VLAN # interfaces. That `@eth0` suffix is NOT part of the interface name. my @ifs = map({ /^[^\s:]*:\s*([^\s:@]+)/ ? $1 : () } @@ -2195,22 +2200,22 @@ sub test_possible_ip { warning("failed to get list of interfaces") if !@ifs; for my $if (@ifs) { local $opt{'ifv6'} = $if; - printf "use=ifv6, ifv6=%s address is %s\n", opt('ifv6'), get_ipv6('ifv6') // 'NOT FOUND'; + printf "usev6=ifv6, ifv6=%s address is %s\n", opt('ifv6'), get_ipv6('ifv6') // 'NOT FOUND'; } } { local $opt{'usev6'} = 'webv6'; for my $web (sort keys %builtinweb) { local $opt{'webv6'} = $web; - printf "use=webv6, webv6=$web address is %s\n", get_ipv6('webv6') // 'NOT FOUND' + printf "usev6=webv6, webv6=$web address is %s\n", get_ipv6('webv6') // 'NOT FOUND' if ($web !~ "4"); ## Don't bother if web site only supports IPv4 } - printf "use=webv6, webv6=%s address is %s\n", opt('webv6'), get_ipv6('webv6') // 'NOT FOUND' + printf "usev6=webv6, webv6=%s address is %s\n", opt('webv6'), get_ipv6('webv6') // 'NOT FOUND' if ! exists $builtinweb{opt('webv6')}; } if (opt('cmdv6')) { local $opt{'usev6'} = 'cmdv6'; - printf "use=cmdv6, cmdv6=%s address is %s\n", opt('cmdv6'), get_ipv6('cmdv6') // 'NOT FOUND'; + printf "usev6=cmdv6, cmdv6=%s address is %s\n", opt('cmdv6'), get_ipv6('cmdv6') // 'NOT FOUND'; } exit 0 unless opt('debug'); @@ -3926,7 +3931,7 @@ sub nic_dyndns2_force_update { info("forcing updating %s because 'mx' has changed to %s.", $host, $config{$host}{'mx'}); $update = 1; - } elsif ($config{$host}{'mx'} && (ynu($config{$host}{'backupmx'}, 1, 2, 3) ne ynu($config{$host}{'backupmx'}, 1, 2, 3))) { + } elsif ($config{$host}{'mx'} && (ynu($config{$host}{'backupmx'}, 1, 2, 3) ne ynu($recap{$host}{'backupmx'}, 1, 2, 3))) { info("forcing updating %s because 'backupmx' has changed to %s.", $host, ynu($config{$host}{'backupmx'}, "YES", "NO", "NO")); $update = 1; @@ -5242,7 +5247,7 @@ sub nic_njalla_update { # Read input params my $ipv4 = delete $config{$h}{'wantipv4'}; my $ipv6 = delete $config{$h}{'wantipv6'}; - my $quietreply = delete $config{$h}{'quietreply'}; + my $quietreply = $config{$h}{'quietreply'}; my $ip_output = ''; # Build url @@ -7699,13 +7704,13 @@ sub nic_regfishde_update { ## update configured host for my $h (@_) { - my $ip = delete $config{$h}{'wantip'}; - my $ipv6 = delete $config{$h}{'wantip'}; - - info("regfish.de setting IP address to %s for %s", $ip, $h); - - my $ipv = ($ip eq ($ipv6 // '')) ? '6' : '4'; - my $url = "https://$config{$h}{'server'}/?fqdn=$h&ipv$ipv=$ip&forcehost=1&token=$config{$h}{'password'}"; + my $ipv4 = delete $config{$h}{'wantipv4'}; + my $ipv6 = delete $config{$h}{'wantipv6'}; + info("regfish.de setting IPv4 address to %s for %s", $ipv4, $h) if $ipv4; + info("regfish.de setting IPv6 address to %s for %s", $ipv6, $h) if $ipv6; + my $url = "https://$config{$h}{'server'}/?fqdn=$h&forcehost=1&token=$config{$h}{'password'}"; + $url .= "&ipv4=$ipv4" if $ipv4; + $url .= "&ipv6=$ipv6" if $ipv6; # Try to get URL my $reply = geturl(proxy => opt('proxy'), url => $url); @@ -7716,16 +7721,17 @@ sub nic_regfishde_update { last; } last if !header_ok($h, $reply); - - if ($reply =~ /success/) { - $config{$h}{'ip'} = $ip; - $config{$h}{'mtime'} = $now; - $config{$h}{'status'} = 'good'; - success("updating %s: good: IP address set to %s", $h, $ip); - } else { - $config{$h}{'status'} = 'failed'; - failed("updating %s: Server said: '$reply'", $h); + if ($reply !~ /success/) { + failed("updating %s: Server said: '%s'", $h, $reply); + next; } + $config{$h}{'ipv4'} = $ipv4 if $ipv4; + $config{$h}{'ipv6'} = $ipv6 if $ipv6; + $config{$h}{'status-ipv4'} = 'good' if $ipv4; + $config{$h}{'status-ipv6'} = 'good' if $ipv6; + $config{$h}{'mtime'} = $now; + success("updating %s: good: IPv4 address set to %s", $h, $ipv4) if $ipv4; + success("updating %s: good: IPv6 address set to %s", $h, $ipv6) if $ipv6; } } @@ -8037,7 +8043,7 @@ sub nic_infomaniak_update { if (defined $updated && $updated) { info($msg); $config{$h}{"ipv$v"} = $ip; - $config{$h}{'mtime'} = $config{$h}{'mtime'} // $now; + $config{$h}{'mtime'} = $now; $config{$h}{"status-ipv$v"} = 'good'; next INFOMANIAK_IP_LOOP; }