Merge pull request #624 from ddclient/feature_porkbun_subdomains

Feature porkbun subdomains
This commit is contained in:
Lenard Hess 2024-02-04 10:34:51 +01:00 committed by GitHub
commit 34cc8fc70c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 44 additions and 10 deletions

View file

@ -301,8 +301,9 @@ ssl=yes # use ssl-support. Works with
# protocol=porkbun # protocol=porkbun
# apikey=APIKey # apikey=APIKey
# secretapikey=SecretAPIKey # secretapikey=SecretAPIKey
# root-domain=example.com
# host.example.com,host2.sub.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) ## ClouDNS (https://www.cloudns.net)

View file

@ -869,6 +869,7 @@ my %services = (
'variables' => { 'variables' => {
'apikey' => setv(T_PASSWD, 1, 0, '', undef), 'apikey' => setv(T_PASSWD, 1, 0, '', undef),
'secretapikey' => 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), 'on-root-domain' => setv(T_BOOL, 0, 0, 0, undef),
'login' => setv(T_LOGIN, 0, 0, 'unused', undef), 'login' => setv(T_LOGIN, 0, 0, 'unused', undef),
'password' => setv(T_PASSWD, 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: Available configuration variables:
* apikey (required): API Key of Porkbun API * apikey (required): API Key of Porkbun API
* secretapikey (required): Secret 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 * on-root-domain=yes or no (default: no): Indicates whether the specified domain name (FQDN) is
an unnamed record (Zone APEX) in a zone. an unnamed record (Zone APEX) in a zone.
It is useful to specify it as a local variable as shown in the example. 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 * 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. 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. * use (deprecated) : This parameter is deprecated but can be overridden like the above parameters.
@ -7124,13 +7127,19 @@ Available configuration variables:
Limitations: Limitations:
* Multiple same name records (for round robin) are not supported. * Multiple same name records (for round robin) are not supported.
The same IP address is set for all, creating meaningless extra records. 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: Example ${program}.conf file entry:
protocol=porkbun protocol=porkbun
apikey=APIKey apikey=APIKey
secretapikey=SecretAPIKey secretapikey=SecretAPIKey
host.example.com,host2.sub.example.com root-domain=example.com
on-root-domain=yes example.com,sub.example.com example.com,host.example.com,host2.sub.example.com
Additional example to finely control IPv4 or IPv6 : Additional example to finely control IPv4 or IPv6 :
# Example 01 : Global enable both IPv4 and IPv6, and update both records. # 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 protocol=porkbun
apikey=APIKey apikey=APIKey
secretapikey=SecretAPIKey secretapikey=SecretAPIKey
root-domain=example.com
host.example.com,host2.sub.example.com host.example.com,host2.sub.example.com
# Example 02 : Global enable only IPv4, and update only IPv6 record. # 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 protocol=porkbun
apikey=APIKey apikey=APIKey
secretapikey=SecretAPIKey secretapikey=SecretAPIKey
root-domain=example.com
usev6=ifv6, ifv6=enp1s0, usev4=disabled ipv6.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 EoEXAMPLE
} }
@ -7160,6 +7178,28 @@ sub nic_porkbun_update {
debug("\nnic_porkbun_update -------------------"); debug("\nnic_porkbun_update -------------------");
foreach my $host (@_) { 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') { foreach my $ipv ('ipv4', 'ipv6') {
my $ip = delete $config{$host}{"want$ipv"}; my $ip = delete $config{$host}{"want$ipv"};
if (!$ip) { if (!$ip) {
@ -7167,13 +7207,6 @@ sub nic_porkbun_update {
} }
my $rrset_type = is_ipv6($ip) ? "AAAA" : "A"; 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); info("setting %s address to %s for %s", $ipv, $ip, $host);
verbose("UPDATE:","updating %s", $host); verbose("UPDATE:","updating %s", $host);