#!/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 [--edit] [--ddns-keyname ]... [--enable-dnssec|--disable-dnssec] \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;