|
Packit Service |
f6e53a |
#!/usr/bin/perl
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
# loclist.pl -- check a list of hostnames for LOC records
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
# -v -- verbose output (include NO results). used to be the default
|
|
Packit Service |
f6e53a |
# -n -- try looking for network LOC records as well (slower)
|
|
Packit Service |
f6e53a |
# -r -- try doing reverse-resolution on IP-appearing hosts
|
|
Packit Service |
f6e53a |
# -d -- debugging output
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
# egrep 'loc2earth.*host' /serv/www/logs/wn.log |
|
|
Packit Service |
f6e53a |
# perl -pe 's/^.*host=//; s/([a-zA-Z0-9.-]+).*/$1/' |
|
|
Packit Service |
f6e53a |
# sort -u | ~/loclist.pl > loc.sites
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
use Net::DNS '0.08';
|
|
Packit Service |
f6e53a |
use Getopt::Std;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
getopts('vnrd');
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
$res = new Net::DNS::Resolver;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
line:
|
|
Packit Service |
f6e53a |
foreach $_ (<>) {
|
|
Packit Service |
f6e53a |
chomp;
|
|
Packit Service |
f6e53a |
$foundloc = $namefound = 0;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
next line if m/^$/;
|
|
Packit Service |
f6e53a |
next line if m/[^\w.-\/+_]/; # /, +, _ not actually valid in hostnames
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
print STDERR "$_ DEBUG looking up...\n" if $opt_d;
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
if (m/^\d+\.\d+\.\d+\.\d+$/) {
|
|
Packit Service |
f6e53a |
if ($opt_r) {
|
|
Packit Service |
f6e53a |
$query = $res->query($_);
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
if (defined ($query)) {
|
|
Packit Service |
f6e53a |
foreach $ans ($query->answer) {
|
|
Packit Service |
f6e53a |
if ($ans->type eq "PTR") {
|
|
Packit Service |
f6e53a |
$_ = $ans->ptrdname;
|
|
Packit Service |
f6e53a |
$namefound++;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
next line unless $namefound;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
$query = $res->query($_,"LOC");
|
|
Packit Service |
f6e53a |
|
|
Packit Service |
f6e53a |
if (defined ($query)) { # then we got an answer of some sort
|
|
Packit Service |
f6e53a |
foreach $ans ($query->answer) {
|
|
Packit Service |
f6e53a |
if ($ans->type eq "LOC") {
|
|
Packit Service |
f6e53a |
print "$_ YES ",$ans->rdatastr,"\n";
|
|
Packit Service |
f6e53a |
$foundloc++;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
if ($opt_n && !$foundloc) { # try the RFC 1101 search bit
|
|
Packit Service |
f6e53a |
@addrs = @netnames = ();
|
|
Packit Service |
f6e53a |
$query = $res->query($_,"A");
|
|
Packit Service |
f6e53a |
if (defined ($query)) {
|
|
Packit Service |
f6e53a |
foreach $ans ($query->answer) {
|
|
Packit Service |
f6e53a |
if ($ans->type eq "A") {
|
|
Packit Service |
f6e53a |
push(@addrs,$ans->address);
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
if (@addrs) {
|
|
Packit Service |
f6e53a |
checkaddrs:
|
|
Packit Service |
f6e53a |
foreach $ipstr (@addrs) {
|
|
Packit Service |
f6e53a |
$ipnum = unpack("N",pack("CCCC",split(/\./,$ipstr,4)));
|
|
Packit Service |
f6e53a |
($ip1) = split(/\./,$ipstr);
|
|
Packit Service |
f6e53a |
if ($ip1 >= 224) { # class D/E, treat as host addr
|
|
Packit Service |
f6e53a |
$mask = 0xFFFFFFFF;
|
|
Packit Service |
f6e53a |
} elsif ($ip1 >= 192) { # "class C"
|
|
Packit Service |
f6e53a |
$mask = 0xFFFFFF00;
|
|
Packit Service |
f6e53a |
} elsif ($ip1 >= 128) { # "class B"
|
|
Packit Service |
f6e53a |
$mask = 0xFFFF0000;
|
|
Packit Service |
f6e53a |
} else { # class A
|
|
Packit Service |
f6e53a |
$mask = 0xFF000000;
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
$oldmask = 0;
|
|
Packit Service |
f6e53a |
while ($oldmask != $mask) {
|
|
Packit Service |
f6e53a |
$oldmask = $mask;
|
|
Packit Service |
f6e53a |
$querystr =
|
|
Packit Service |
f6e53a |
join(".", reverse (unpack("CCCC",pack("N",$ipnum & $mask))))
|
|
Packit Service |
f6e53a |
. ".in-addr.arpa";
|
|
Packit Service |
f6e53a |
$query = $res->query($querystr,"PTR");
|
|
Packit Service |
f6e53a |
if (defined ($query)) {
|
|
Packit Service |
f6e53a |
foreach $ans ($query->answer) {
|
|
Packit Service |
f6e53a |
if ($ans->type eq "PTR") {
|
|
Packit Service |
f6e53a |
# we want the list in LIFO order
|
|
Packit Service |
f6e53a |
unshift(@netnames,$ans->ptrdname);
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
$query = $res->query($querystr,"A");
|
|
Packit Service |
f6e53a |
if (defined ($query)) {
|
|
Packit Service |
f6e53a |
foreach $ans ($query->answer) {
|
|
Packit Service |
f6e53a |
if ($ans->type eq "A") {
|
|
Packit Service |
f6e53a |
$mask = unpack("L",pack("CCCC",
|
|
Packit Service |
f6e53a |
split(/\./,$ans->address,4)));
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
if (@netnames) {
|
|
Packit Service |
f6e53a |
foreach $network (@netnames) {
|
|
Packit Service |
f6e53a |
$query = $res->query($network,"LOC");
|
|
Packit Service |
f6e53a |
if (defined ($query)) {
|
|
Packit Service |
f6e53a |
foreach $ans ($query->answer) {
|
|
Packit Service |
f6e53a |
if ($ans->type eq "LOC") {
|
|
Packit Service |
f6e53a |
print "$_ YES ",$ans->rdatastr,"\n";
|
|
Packit Service |
f6e53a |
$foundloc++;
|
|
Packit Service |
f6e53a |
last checkaddrs;
|
|
Packit Service |
f6e53a |
} elsif ($ans->type eq "CNAME") {
|
|
Packit Service |
f6e53a |
# XXX should follow CNAME chains here
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
if ($opt_v && !$foundloc) {
|
|
Packit Service |
f6e53a |
print "$_ NO\n";
|
|
Packit Service |
f6e53a |
}
|
|
Packit Service |
f6e53a |
}
|