updates for more flags

This commit is contained in:
2026-01-24 13:34:18 -05:00
parent fc67da62f7
commit 427fc3ee4b
5 changed files with 190 additions and 89 deletions

View File

@@ -2,47 +2,64 @@
use strict;
use warnings;
use Martnet::DDNS;
use Regexp::Common qw/net/;
use Getopt::Long qw/GetOptions/;
use JSON::PP qw/encode_json true false/;
sub usage {
die "Usage: add-slave [--enable-dnssec|--disable-dnssec] --master <IPv4|IPv6> <zone.>\n";
}
use Getopt::Long qw/GetOptions/;
use JSON::PP ();
use Regexp::Common qw/net/;
use Martnet::DDNS;
my $master;
my $enable_dnssec = 0;
my $edit = 0;
my @ddns_keys;
my $enable_dnssec = 0;
my $disable_dnssec = 0;
GetOptions(
'master|m=s' => \$master,
'enable-dnssec' => \$enable_dnssec,
'disable-dnssec' => \$disable_dnssec,
) or usage();
'master|m=s' => \$master,
'edit!' => \$edit,
'ddns-keyname=s' => \@ddns_keys,
'enable-dnssec!' => \$enable_dnssec,
'disable-dnssec!' => \$disable_dnssec,
) or die "Usage: add-slave --master <ip> [--edit] [--ddns-keyname <key>]... [--enable-dnssec|--disable-dnssec] <zone.>\n";
usage() unless defined $master;
my $zone = shift || die "No zone provided\n";
die "Cannot specify both --enable-dnssec and --disable-dnssec\n"
if ($enable_dnssec && $disable_dnssec);
die "Zone must end in a dot\n"
unless ($zone =~ /^[a-zA-Z0-9\.\-\_]+\.$/);
my $host = shift || die "No zonename provided\n";
my $ddns = Martnet::DDNS->new();
die "Zonename must end in a dot\n"
unless ($host =~ /^[a-zA-Z0-9\.\-\_]+\.$/);
die "--master is required\n"
unless defined $master && $master ne '';
my $regex = $RE{net}{IPv4} . '|' . $RE{net}{IPv6};
die "Master must be an IPv4 or IPv6 address\n"
unless ($master =~ /^$regex$/);
my $payload = { master => $master };
if ($enable_dnssec) {
$payload->{dnssec} = true;
} elsif ($disable_dnssec) {
$payload->{dnssec} = false;
die "Specify only one of --enable-dnssec or --disable-dnssec\n"
if ($enable_dnssec && $disable_dnssec);
# Build canonical JSON payload; operators do not hand-author JSON.
my %payload = (
master => $master,
);
if (@ddns_keys) {
$payload{ddns_keys} = [ @ddns_keys ];
}
$ddns->add($host, encode_json($payload), '_pureslave');
if ($enable_dnssec) {
$payload{dnssec} = JSON::PP::true;
} elsif ($disable_dnssec) {
$payload{dnssec} = JSON::PP::false;
}
my $json = JSON::PP->new->canonical(1)->encode(\%payload);
my $ddns = Martnet::DDNS->new();
if ($edit) {
$ddns->set($zone, $json, '_pureslave');
} else {
$ddns->add($zone, $json, '_pureslave');
}
exit 0;