66 lines
1.5 KiB
Perl
Executable File
66 lines
1.5 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Getopt::Long qw/GetOptions/;
|
|
use JSON::PP ();
|
|
use Regexp::Common qw/net/;
|
|
use Martnet::DDNS;
|
|
|
|
my $master;
|
|
my $edit = 0;
|
|
my @ddns_keys;
|
|
my $enable_dnssec = 0;
|
|
my $disable_dnssec = 0;
|
|
|
|
GetOptions(
|
|
'master|m=s' => \$master,
|
|
'edit!' => \$edit,
|
|
'ddns-keyname=s' => \@ddns_keys,
|
|
'enable-dnssec!' => \$enable_dnssec,
|
|
'disable-dnssec!' => \$disable_dnssec,
|
|
) or die "Usage: add-custom --master <ip> [--edit] [--ddns-keyname <key>]... [--enable-dnssec|--disable-dnssec] <zone.>\n";
|
|
|
|
my $zone = shift || die "No zone provided\n";
|
|
|
|
die "Zone must end in a dot\n"
|
|
unless ($zone =~ /^[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$/);
|
|
|
|
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 ];
|
|
}
|
|
|
|
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, '_custom');
|
|
} else {
|
|
$ddns->add($zone, $json, '_custom');
|
|
}
|
|
|
|
exit 0;
|