Files
martnet-ddns/bin/validate-master
2020-01-15 11:13:05 -05:00

62 lines
1.5 KiB
Perl
Executable File

#!/usr/bin/perl
use strict;
use warnings;
use Martnet::DDNS;
my $ddns = Martnet::DDNS->new();
my $cfgpath = '/etc/bind';
my $datapath = '/var/lib/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($cfgpath . '/' . $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";
}
}
}