summaryrefslogtreecommitdiff
path: root/autodnscheck.pl
blob: 1aa5f763aaa2fe6e111a755526f23138c24224e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/perl

use strict;
use warnings;
use Net::DNS;

my $DEBUG=0;
my $DOMAIN="mirrors.postgresql.org";
my $MASTER="dominion.postgresql.org";

my $errors = '';


# Create two resolvers. One to resolve general names (using the machiens
# default resolver) and one that queries the master.
my $res_generic = Net::DNS::Resolver->new;
my $res_master = Net::DNS::Resolver->new(nameservers => [$MASTER], recurse => 0);


# Load the SOA record with the serial number from the master server
my $qq = $res_master->query($DOMAIN,"SOA");
die "Could not get SOA record from primary!\n" unless ($qq);
my $masterserial = ($qq->answer)[0]->serial;
die "Could not get serial number from primary!\n" unless ($masterserial);

$DEBUG && print "Master serial is: $masterserial\n";


# Load the list of available nameservers from the master server
my $q = $res_master->query($DOMAIN,"NS");
die "No nameservers found!" if (!$q);

my $servercount = $q->answer;
if ($servercount < 4) {
    $errors .= "There are only $servercount DNS servers listed!\n";
}


# Check the serial on each server against the ones on the master
foreach my $rr ($q->answer) {
    my $nsip='';
    $DEBUG && print "Scanning " . $rr->nsdname . "\n";

    my $ns = $res_generic->query($rr->nsdname,'A');
    if (!$ns) {
	$errors .= "Could not find nameserver " . $rr->nsdname . "\n";
	next;
    }

    foreach my $rrr ($ns->answer) {
	$nsip = $rrr->address if ($rrr->type eq "A");
    }
    if ($nsip eq "") {
	$errors .= "Nameserver " . $rr->nsdname . " has no A record!\n";
	next;
    }

    my $res2 = Net::DNS::Resolver->new(nameservers => [$nsip], recurse => 0);
    
    $qq = $res2->query($DOMAIN,"SOA");
    if (!$qq) {
	$errors .= "Failed to query nameserver " . $rr->nsdname . " for SOA record!\n";
	next;
    }

    my $serial = ($qq->answer)[0]->serial;
    
    if (!$serial) {
	$errors .= "Failed to get serial from nameserver " . $rr->nsdname . "\n";
	next;
    }
    $DEBUG && print "Serial for " . $rr->nsdname . " is $serial\n";

    if ($serial != $masterserial) {
	$errors .= "Serial for " . $rr->nsdname . " ($serial) differs from master ($masterserial)\n";
	next;
    }
}

if ($errors ne "") {
    print "** Errors occured **\n";
    print $errors . "\n";
    print "********************\n";
    exit(1);
}
else {
    print "DNS check completed, all $servercount servers in sync.\n";
}