Blame contrib/loclist.pl

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
    }