added validation and runtime detection of addition to a second group
This commit is contained in:
28
DDNS.pm
28
DDNS.pm
@ -4,6 +4,9 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use Net::DNS;
|
use Net::DNS;
|
||||||
use File::Temp qw/tempfile/;
|
use File::Temp qw/tempfile/;
|
||||||
|
use Memoize;
|
||||||
|
|
||||||
|
memoize('_gethosts');
|
||||||
|
|
||||||
our $VERSION = '0.2';
|
our $VERSION = '0.2';
|
||||||
|
|
||||||
@ -21,7 +24,7 @@ sub _validateTypeOrDie {
|
|||||||
my ($t) = @_;
|
my ($t) = @_;
|
||||||
|
|
||||||
die "Invalid type"
|
die "Invalid type"
|
||||||
unless ($t =~ /^_(vhosts|hostedservers|pureslave|custom)$/);
|
unless ($t =~ /^_(vhosts|pureslave|custom)$/);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _fqdn {
|
sub _fqdn {
|
||||||
@ -121,11 +124,34 @@ sub _gethosts {
|
|||||||
return @vh;
|
return @vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Find the type of domin that $dom is. If we don't find it, return
|
||||||
|
# undef. (The domain $dom ends in a dot; the DNS info we find won't;
|
||||||
|
# hence the concat of the extra "." after the lc.)
|
||||||
|
sub type {
|
||||||
|
my ($this, $dom) = @_;
|
||||||
|
|
||||||
|
_validateOrDie($dom);
|
||||||
|
|
||||||
|
my @vh = $this->get();
|
||||||
|
foreach my $i (@vh) {
|
||||||
|
if (lc($i->{zone})."." eq lc($dom)) {
|
||||||
|
return $i->{type};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Didn't find it.
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
sub add {
|
sub add {
|
||||||
my ($this, $dom, $master, $type) = @_;
|
my ($this, $dom, $master, $type) = @_;
|
||||||
_validateOrDie($dom);
|
_validateOrDie($dom);
|
||||||
my $fqdn = _fqdn($dom, $type);
|
my $fqdn = _fqdn($dom, $type);
|
||||||
|
|
||||||
|
if (my $type = $this->type($dom)) {
|
||||||
|
die "Domain $dom already exists [of type $type]";
|
||||||
|
}
|
||||||
|
|
||||||
$this->__docmd("update add $fqdn 60 TXT $master");
|
$this->__docmd("update add $fqdn 60 TXT $master");
|
||||||
$this->cleanup();
|
$this->cleanup();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,7 @@ WriteMakefile(
|
|||||||
'bin/sync-slave',
|
'bin/sync-slave',
|
||||||
'bin/list-all',
|
'bin/list-all',
|
||||||
'bin/is-managed',
|
'bin/is-managed',
|
||||||
|
'bin/validate-master',
|
||||||
],
|
],
|
||||||
'AUTHOR' => 'Jorj Bauer <jorj@jorj.org>',
|
'AUTHOR' => 'Jorj Bauer <jorj@jorj.org>',
|
||||||
);
|
);
|
||||||
|
|||||||
60
bin/validate-master
Executable file
60
bin/validate-master
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Martnet::DDNS;
|
||||||
|
|
||||||
|
my $ddns = Martnet::DDNS->new();
|
||||||
|
|
||||||
|
my $path = '/etc/bind';
|
||||||
|
|
||||||
|
my %files = ( 'custom.zones.9' => '_custom',
|
||||||
|
'martnet.zones.9' => '_custom',
|
||||||
|
'hostedservers.zones.9' => '_custom',
|
||||||
|
'vhost.zones.9' => '_vhosts',
|
||||||
|
'martnet.slave.zones.9' => '*' );
|
||||||
|
|
||||||
|
our %fixes = ( '_custom' => 'add-custom',
|
||||||
|
'_vhosts' => 'add-vhost',
|
||||||
|
'_pureslave' => 'add-slave',
|
||||||
|
'*' => 'one of the add-* scripts',
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach my $i (keys %files) {
|
||||||
|
validate_file($path . '/' . $i, $files{$i});
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
|
||||||
|
sub validate_file {
|
||||||
|
my ($path, $expected_type) = @_;
|
||||||
|
|
||||||
|
open(my $fh, $path) || die "Can't open $path: $!";
|
||||||
|
|
||||||
|
while (<$fh>) {
|
||||||
|
my ($zonename) = ($_ =~ /zone \"([^\"]+)\"/i);
|
||||||
|
next unless ($zonename);
|
||||||
|
$zonename = lc($zonename);
|
||||||
|
unless ($zonename =~ /\.$/) {
|
||||||
|
$zonename .= '.'; # must end with a dot
|
||||||
|
}
|
||||||
|
|
||||||
|
findOrDie($path, $zonename, $expected_type);
|
||||||
|
}
|
||||||
|
close $fh;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub findOrDie {
|
||||||
|
my ($path, $zonename, $expected_type) = @_;
|
||||||
|
|
||||||
|
my $type = $ddns->type($zonename);
|
||||||
|
unless ($type) {
|
||||||
|
my $fix = $fixes{$expected_type};
|
||||||
|
die "domain $zonename is not managed, but is in $path [expected $expected_type]; to fix, either remove the domain from the file, or use $fix to fix it";
|
||||||
|
}
|
||||||
|
if ($expected_type ne '*') {
|
||||||
|
unless ($type eq $expected_type) {
|
||||||
|
die "domain $zonename is managed in $path of type [$type] but should be [$expected_type] if it's in that file";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user