diff --git a/ddclient.conf.in b/ddclient.conf.in index 756aec3..c4d5172 100644 --- a/ddclient.conf.in +++ b/ddclient.conf.in @@ -301,8 +301,9 @@ ssl=yes # use ssl-support. Works with # protocol=porkbun # apikey=APIKey # secretapikey=SecretAPIKey +# root-domain=example.com # host.example.com,host2.sub.example.com -# on-root-domain=yes example.com,sub.example.com +# example.com,sub.example.com ## ## ClouDNS (https://www.cloudns.net) diff --git a/ddclient.in b/ddclient.in index 5c50d3d..f88a638 100755 --- a/ddclient.in +++ b/ddclient.in @@ -869,6 +869,7 @@ my %services = ( 'variables' => { 'apikey' => setv(T_PASSWD, 1, 0, '', undef), 'secretapikey' => setv(T_PASSWD, 1, 0, '', undef), + 'root-domain' => setv(T_OFQDN, 0, 0, '', undef), 'on-root-domain' => setv(T_BOOL, 0, 0, 0, undef), 'login' => setv(T_LOGIN, 0, 0, 'unused', undef), 'password' => setv(T_PASSWD, 0, 0, 'unused', undef), @@ -7114,9 +7115,11 @@ https://kb.porkbun.com/article/190-getting-started-with-the-porkbun-api Available configuration variables: * apikey (required): API Key of Porkbun API * secretapikey (required): Secret API Key of Porkbun API + * root-domain: The root domain of the specified domain name. * on-root-domain=yes or no (default: no): Indicates whether the specified domain name (FQDN) is an unnamed record (Zone APEX) in a zone. It is useful to specify it as a local variable as shown in the example. + This configuration value is deprecated, use root-domain instead! * usev4, usev6 : These configuration variables can be specified as local variables to override the global settings. It is useful to finely control IPv4 or IPv6 as shown in the example. * use (deprecated) : This parameter is deprecated but can be overridden like the above parameters. @@ -7124,13 +7127,19 @@ Available configuration variables: Limitations: * Multiple same name records (for round robin) are not supported. The same IP address is set for all, creating meaningless extra records. + * If neither root-domain nor on-root-domain are specified, ${program} will split the given + hostname into subdomain and domain on the first dot. + For example: + * sub.example.com -> Subdomain "sub", root domain "example.com" + * sub.foo.example.com -> Subdomain "sub", root domain "foo.example.com" + If both root-domain and on-root-domain are specified, root-domain takes precedence. Example ${program}.conf file entry: protocol=porkbun apikey=APIKey secretapikey=SecretAPIKey - host.example.com,host2.sub.example.com - on-root-domain=yes example.com,sub.example.com + root-domain=example.com + example.com,host.example.com,host2.sub.example.com Additional example to finely control IPv4 or IPv6 : # Example 01 : Global enable both IPv4 and IPv6, and update both records. @@ -7140,6 +7149,7 @@ Additional example to finely control IPv4 or IPv6 : protocol=porkbun apikey=APIKey secretapikey=SecretAPIKey + root-domain=example.com host.example.com,host2.sub.example.com # Example 02 : Global enable only IPv4, and update only IPv6 record. @@ -7148,8 +7158,16 @@ Additional example to finely control IPv4 or IPv6 : protocol=porkbun apikey=APIKey secretapikey=SecretAPIKey + root-domain=example.com usev6=ifv6, ifv6=enp1s0, usev4=disabled ipv6.example.com + # Example 03: Update just a root domain + protocol=porkbun + apikey=APIKey + secretapikey=SecretAPIKey + root-domain=host.example.com + host.example.com + EoEXAMPLE } @@ -7160,6 +7178,28 @@ sub nic_porkbun_update { debug("\nnic_porkbun_update -------------------"); foreach my $host (@_) { + my ($sub_domain, $domain); + if ($config{$host}{'root-domain'} ne '') { + # Process 'root-domain' option + $domain = $config{$host}{'root-domain'}; + $sub_domain = $host; + $sub_domain =~ s/\.$domain//; + + if (!defined($sub_domain)) { + error("'root-domain' (%s) is not part of the full domain (%s)!", $domain, $host); + next; + } + warning("%s has both 'root-domain' and 'on-root-domain' defined. The latter is ignored") if $config{$host}{'on-root-domain'}; + } elsif ($config{$host}{'on-root-domain'}) { + # Process legacy 'on-root-domain' option + $sub_domain = ''; + $domain = $host; + } else { + # Default to the subdomain/domain being split at the first dot + ($sub_domain, $domain) = split(/\./, $host, 2); + } + verbose("subdomain %s, root domain %s", $sub_domain, $domain) if $sub_domain != ''; + foreach my $ipv ('ipv4', 'ipv6') { my $ip = delete $config{$host}{"want$ipv"}; if (!$ip) { @@ -7167,13 +7207,6 @@ sub nic_porkbun_update { } my $rrset_type = is_ipv6($ip) ? "AAAA" : "A"; - my ($sub_domain, $domain); - if ($config{$host}{'on-root-domain'}) { - $sub_domain = ''; - $domain = $host; - } else { - ($sub_domain, $domain) = split(/\./, $host, 2); - } info("setting %s address to %s for %s", $ipv, $ip, $host); verbose("UPDATE:","updating %s", $host);