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
# 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)

View file

@ -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);