Skip to content

Commit

Permalink
Merge pull request #624 from ddclient/feature_porkbun_subdomains
Browse files Browse the repository at this point in the history
Feature porkbun subdomains
  • Loading branch information
LenardHess committed Feb 4, 2024
2 parents f1c77a0 + 330ddc6 commit 34cc8fc
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 10 deletions.
3 changes: 2 additions & 1 deletion ddclient.conf.in
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
51 changes: 42 additions & 9 deletions ddclient.in
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -7114,23 +7115,31 @@ 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.
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.
Expand All @@ -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.
Expand All @@ -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
}

Expand All @@ -7160,20 +7178,35 @@ 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) {
next;
}
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);

Expand Down

0 comments on commit 34cc8fc

Please sign in to comment.