added check.pl and query
This commit is contained in:
parent
72c7f8d3e4
commit
070a6da94b
|
@ -1,11 +1,12 @@
|
||||||
include GNUmakevars
|
include GNUmakevars
|
||||||
|
|
||||||
all: gethostbyname fqdn
|
all: gethostbyname fqdn query
|
||||||
install: \
|
install: \
|
||||||
$(BINDIR)/gethostbyname \
|
|
||||||
$(BINDIR)/axfr \
|
$(BINDIR)/axfr \
|
||||||
$(BINDIR)/fqdn \
|
$(BINDIR)/fqdn \
|
||||||
|
$(BINDIR)/gethostbyname \
|
||||||
$(BINDIR)/minnet \
|
$(BINDIR)/minnet \
|
||||||
|
$(BINDIR)/query \
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use Net::DNS;
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
print STDERR "Usage: $0 domainname-or-ip-address\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() unless (@ARGV == 1);
|
||||||
|
|
||||||
|
my $res = new Net::DNS::Resolver;
|
||||||
|
if ($ARGV[0] =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
|
||||||
|
check_ptr($ARGV[0]);
|
||||||
|
} else {
|
||||||
|
check_a($ARGV[0]);
|
||||||
|
# check_ns($ARGV[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0;
|
||||||
|
|
||||||
|
my %addr_to_name;
|
||||||
|
my %name_to_addr;
|
||||||
|
|
||||||
|
sub check_ptr {
|
||||||
|
my ($addr, $name) = @_;
|
||||||
|
|
||||||
|
my @names;
|
||||||
|
if (defined $addr_to_name{$addr}) {
|
||||||
|
@names = @{ $addr_to_name{$addr} };
|
||||||
|
} else {
|
||||||
|
# XXX - ipv6?
|
||||||
|
my $q = join('.', reverse (split(/\./, $addr)), "in-addr", "arpa");
|
||||||
|
my $reply = $res->send($q, 'PTR');
|
||||||
|
for my $ans ($reply->answer) {
|
||||||
|
if ($ans->type eq 'PTR') {
|
||||||
|
push @names, $ans->ptrdname;
|
||||||
|
} else {
|
||||||
|
die "cannot happen";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (@names == 0) {
|
||||||
|
print "[$addr] $q has no PTR record\n";
|
||||||
|
}
|
||||||
|
$addr_to_name{$addr} = \@names;
|
||||||
|
}
|
||||||
|
if ($name) {
|
||||||
|
unless (grep { $_ eq $name } @names) {
|
||||||
|
print "$name not found in PTR records of [$addr]\n";
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for my $name (@names) {
|
||||||
|
check_a($name, $addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub check_a {
|
||||||
|
my ($name, $addr) = @_;
|
||||||
|
|
||||||
|
my @addrs;
|
||||||
|
if (defined $name_to_addr{$name}) {
|
||||||
|
@addrs = @{ $name_to_addr{$name} };
|
||||||
|
} else {
|
||||||
|
my $reply = $res->send($name, 'A');
|
||||||
|
for my $ans ($reply->answer) {
|
||||||
|
if ($ans->type eq 'A') {
|
||||||
|
push @addrs, $ans->address;
|
||||||
|
} else {
|
||||||
|
print "unexpected response to A query for $name\n";
|
||||||
|
$ans->print;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (@addrs == 0) {
|
||||||
|
print "$name has no A record\n";
|
||||||
|
}
|
||||||
|
$name_to_addr{$name} = \@addrs;
|
||||||
|
}
|
||||||
|
if ($addr) {
|
||||||
|
unless (grep { $_ eq $addr } @addrs) {
|
||||||
|
print "[$addr] not found in A records of $name\n";
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for my $addr (@addrs) {
|
||||||
|
check_ptr($addr, $name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $answer = $res->query($ARGV[0], $ARGV[1]);
|
||||||
|
if ($answer) {
|
||||||
|
$answer->print;
|
||||||
|
} else {
|
||||||
|
print STDERR "query failed: ", $res->errorstring, "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# $res->nameservers($ARGV[2]);
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/usr/bin/perl -w
|
||||||
|
use strict;
|
||||||
|
use Net::DNS;
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
print STDERR "Usage: $0 domainname type nameserver\n" unless (@ARGV == 2);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() unless (@ARGV == 3);
|
||||||
|
|
||||||
|
my $res = new Net::DNS::Resolver;
|
||||||
|
$res->nameservers($ARGV[2]);
|
||||||
|
my $answer = $res->query($ARGV[0], $ARGV[1]);
|
||||||
|
if ($answer) {
|
||||||
|
$answer->print;
|
||||||
|
} else {
|
||||||
|
print STDERR "query failed: ", $res->errorstring, "\n";
|
||||||
|
}
|
Loading…
Reference in New Issue