diff --git a/DDNS.pm b/DDNS.pm index 1ef9e74..45b2323 100644 --- a/DDNS.pm +++ b/DDNS.pm @@ -2,7 +2,6 @@ package Martnet::DDNS; use strict; use warnings; -use Net::DNS; use File::Temp qw/tempfile/; use Memoize; @@ -12,13 +11,15 @@ our $VERSION = '0.4'; # our $misterdns = '198.251.79.234'; our $misterdns = '5.78.68.64'; - +our $defaultmaster = '5.78.68.64'; # could be v4 and v6 like '198.251.79.234;2607:f1c0:86e:b66f:6b86:babb:c367:b0dc' +our $keyfile = '/etc/bind/zone-management.key'; + sub new { my $me = shift; my %opts = @_; return bless { - 'keyfile' => '/etc/bind/Knewmartnet.+165+36945.key', + 'keyfile' => $keyfile, %opts }, $me; } @@ -53,21 +54,27 @@ sub _lookupOrDie { _validateOrDie($dom); my $fqdn = _fqdn($dom, $type); - - my $res = Net::DNS::Resolver->new; - my $query = $res->query($fqdn, "TXT"); - - if ($query) { - foreach my $rr (grep { $_->type eq 'TXT' } $query->answer) { - # We found a record; that's all that I care about. - #print $rr->nsdname, "\n"; - return 1; + + my $answer; + my $all = ''; + my $fh; + open($fh, "dig +short -t txt \@${misterdns} $fqdn |") + || die "Can't open dig: $!"; + while (<$fh>) { + $all .= $_; + if ($_ =~ /^\"(.+)\"$/) { + $answer = $1; } } + if ($answer) { + # We found a record; that's all I care about. + return 1; + } else { - die "query failed: ", $res->errorstring, "\n"; + die "query failed: $all\n"; } + # Unreached die "Failed to find existing DNS record for $fqdn"; } @@ -205,5 +212,11 @@ sub is_dnssec { return 0; } +sub default_master { + my ($this, $type) = @_; + + # This could return different masters for different types + return $defaultmaster; +} 1; diff --git a/Makefile.PL b/Makefile.PL index bba85d0..13ef227 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -3,8 +3,7 @@ use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'Martnet::DDNS', 'VERSION_FROM' => 'DDNS.pm', - 'PREREQ_PM' => { Net::DNS => 0.66, - File::Temp => 0.22, + 'PREREQ_PM' => { File::Temp => 0.22, Regexp::Common => 2013031301, }, 'EXE_FILES' => [ 'bin/add-vhost', diff --git a/bin/add-custom b/bin/add-custom index 30e6e02..0149987 100755 --- a/bin/add-custom +++ b/bin/add-custom @@ -7,7 +7,8 @@ use Regexp::Common qw/net/; my $host = shift || die "No zonename provided"; my $master = shift; -$master ||= '198.251.79.234;2607:f1c0:86e:b66f:6b86:babb:c367:b0dc'; +my $ddns = Martnet::DDNS->new(); +$master ||= $ddns->default_master(); die "Zonename must end in a dot" unless ($host =~ /^[a-zA-Z0-9\.\-\_]+\.$/); @@ -16,5 +17,4 @@ my $regex = $RE{net}{IPv4} . '|' . $RE{net}{IPv6}; die "Master must be an IPv4 or IPv6 address" unless ($master =~ /^$regex$/); -my $ddns = Martnet::DDNS->new(); $ddns->add($host, $master, '_custom'); diff --git a/bin/add-dnssec b/bin/add-dnssec index fe4047c..39c49a9 100755 --- a/bin/add-dnssec +++ b/bin/add-dnssec @@ -7,8 +7,8 @@ use Regexp::Common qw/net/; my $host = shift || die "No zonename provided"; my $master = shift; -#$master ||= '198.251.79.234'; -$master ||= '198.251.79.234;2607:f1c0:86e:b66f:6b86:babb:c367:b0dc'; +my $ddns = Martnet::DDNS->new(); +$master ||= $ddns->default_master(); die "Zonename must end in a dot" @@ -18,5 +18,4 @@ my $regex = $RE{net}{IPv4} . '|' . $RE{net}{IPv6}; die "Master must be an IPv4 or IPv6 address" unless ($master =~ /^$regex$/); -my $ddns = Martnet::DDNS->new(); $ddns->add($host, $master, '_dnssec'); diff --git a/bin/add-vhost b/bin/add-vhost index 7abf258..9acbe2d 100755 --- a/bin/add-vhost +++ b/bin/add-vhost @@ -6,8 +6,8 @@ use Martnet::DDNS; use Regexp::Common qw/net/; my $host = shift || die "No vhost provided"; -#my $master = shift || die "No master DNS IP provided"; -my $master ||= '198.251.79.234;2607:f1c0:86e:b66f:6b86:babb:c367:b0dc'; +my $ddns = Martnet::DDNS->new(); +my $master ||= $ddns->default_master(); die "Hostname must end in a dot" unless ($host =~ /^[a-zA-Z0-9\.\-\_]+\.$/); @@ -16,5 +16,4 @@ my $regex = $RE{net}{IPv4} . '|' . $RE{net}{IPv6}; die "Master must be an IPv4 or IPv6 address" unless ($master =~ /^$regex$/); -my $ddns = Martnet::DDNS->new(); $ddns->add($host, $master, '_vhosts');