#!/usr/bin/perl -wT
# blacklists: commandline interface to DNS, ORBS & MAPS RBL/RSS(/DUL?)
# copyright (c) 2001 John Bro bro (at) ne9 (dot) com  v.0.9  Jan 1 2001
# Freeware as long as copyright remains. Please inform me of your improvements.
# todo: adapt to web, accept multiple input args
use strict;
use Getopt::Long; # options are not case-sensitive!?
my($verbose,$server,$addserver,$help,$test,$version); my ($IpNum,$Output);
my $prog	='blacklists';
my $Version	="0.9;  01/01/2001 (c) John Bro";
my $OpenRelayResponse='Open Relay';

# ==============================================
my @BlackListServers=qw[
	relays.orbs.org 
	dialups.mail-abuse.org 
	relays.mail-abuse.org 
	blackholes.mail-abuse.org 
	orbs.dorkslayers.com
];
# ======= Manage Options ========================

GetOptions( "verbose"	   => \$verbose,
            "servers=s"	   => \$server,
	    "addserver=s"  => \$addserver,
	    "help"	   => \$help,
	    "test"	   => \$test,	    
	    "version"	   => \$version,	    	    
);

if ( $version ) { print "$prog $Version\n"; exit; }
if (( ! $ARGV[0] ) || ( $help  )) { &Help() }

# ----------------------------------------------
if ( $server )		{ @BlackListServers="$server"  } # How do we specify MULTIPLE servers here?
if ( $addserver )	{ push @BlackListServers, $addserver;  }
if ( $verbose ) { 
	print "BlackListServers: ";  
	foreach my $s ( @BlackListServers) { print "$s "; }
	print "\n"; 
}
# -------- Lookup IP# from a name --------------

if ( $ARGV[0] =~ /[a-zA-Z]/ ) {			# if we have a domain name, look it up and get the IP#.
	my $Name = $ARGV[0];			
	$IpNum=&GetHostByName($Name);
	if ( $verbose ) { print "IP#: $IpNum\n"; }
} else { $IpNum=$ARGV[0];  }			# Otherwise, use the supplied IP# # print "else IpNum: $IpNum\n"; }

if ( $test ) { $IpNum='127.0.0.2'; }		# after looking up the iP# of any host name on commandline
						# but first make sure it's well formed
# -------- Validate IP#s -----------------------						
die "Bad IP $IpNum" unless ( $IpNum =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}$)/ );
my @dq	= split('\.',"$IpNum");						
for  my $n (@dq) { die "Invalid IP Number" unless ( $n < 256 ) }	# verify that each of the n's is <256 ?

# -------- Loop over the servers ---------------
foreach my $svr ( @BlackListServers ) {	

  $dq[3] = ( $test ) && ( $svr eq 'dialups.mail-abuse.org' ) ? 3 : 2 ;  # change for dialups testing only
						  # REVERSE IT and tack it onto the black list servers name
  my $Suspect ="$dq[3].$dq[2].$dq[1].$dq[0].${svr}";	if ($verbose) { print "TESTING: $Suspect\n"; }
  my  $reply  = &GetHostByName($Suspect);		if ($verbose) { print "REPLY:   $reply\n"; }
  next unless $reply;
# -- make English Replies ------  
  if	( $reply eq '127.0.0.2' ) { $Output="$OpenRelayResponse"; }
  elsif	( $reply eq '127.0.0.3' ) { $Output="$OpenRelayResponse (manual entry)"; }
  elsif	( $reply eq '127.0.0.4' ) { $Output='Untestable'; }
  elsif	( $reply eq '127.0.0.5' ) { $Output='SPAM HAVEN'; }
  else 	{ $Output=$reply; }
  
  print 	"$svr: $Output\n";
}
if ($test) { print "NOTE: These results are for the test IP#, not $ARGV[0]\n"; }
# -----------------------------------------------------------------------------
# ============ FUNCTIONS ======================
# ============ FUNCTIONS ======================
# ============ FUNCTIONS ======================

# === GetHostByName============================
sub GetHostByName($) {
  my $Host = shift;
  my $addr = (gethostbyname("$Host"))[4];	# FULL ($name, $aliases, $addrtype, $length, $addr, @addrs) = gethostbyname($OrbsAddr); # print "\nname: $name \naliases: $aliases \naddrtype: $addrtype \naddr: $addr\n ";
#exit  unless $addr;
  if ( $addr ) {
     my $result   = join(".",unpack("C4", $addr));
     return $result;
  } else { return 0; }   
}

# ========= Help ==============================
sub Help() {
if ( $verbose ) { print "\n"; }	

print q{  blacklists [ --verbose --help ( --server=SERVER | --addserver=SERVER ) --test  --version] \\
	     ip# | domain.name
};

print qq|   use '--verbose'  for more detail \n| unless $verbose;

if ( $verbose ) { print qq|
	Checks several RBL type servers for spammers.
	Current version: $Version
	
	-h --help	prints this screen
	   --verbose	tells you what is going on
	   --version	current version of program
	-t --test    	queries for 127.0.0.2 which is listed in all (127.0.0.3 for dialups.mail-abuse.org)
	-s --server=SERVER	use this server instead of built-in list
	-a --addserver=SERVER	add this server to the list
	
	Current blacklist servers are:
|;
}
if ( $verbose ) { for my $s (@BlackListServers) { print "\t\t$s\n"; } }	
if ( $verbose ) { print qq|	
	In non-verbose mode, returns nothing if not found on any list.
	Returns  'server: listing_type' for each list where found.

|; }
exit;
}

