#!/usr/bin/perl -w
use strict;
my $debug=0;
$debug=1 if(@ARGV and $ARGV[0] =~ /^-[dv]+$/s and shift @ARGV);
my $skipexternal=0;
$skipexternal=1 if(@ARGV and $ARGV[0] =~ /^-e$/s and shift @ARGV);
my $printspamcheckheader=0;
$printspamcheckheader=1 if(@ARGV and $ARGV[0] =~ /^-s$/s and shift @ARGV);
die "usage: $0 [-dv] [-s] <ip> [<ip> [..]]\n" unless(@ARGV);
my ($ip,$revip,$tmp,@bad);
foreach $ip (@ARGV) {
	@bad=();
	unless($ip =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
		print STDERR "$ip isn't an IP address!\n";
		next;
	}
	if($printspamcheckheader) {
		print "X-SpamCheck-$ip:";
	} elsif($#ARGV) {
		print "$ip:";
	}
	$ip="$1.$2.$3.$4";
	$revip="$4.$3.$2.$1";
	push @bad,"DNS" unless(&checkrevdns(pack("C4",$1,$2,$3,$4)));
	unless($skipexternal) {
#		push @bad,"DUL" if(&checkip("$revip.dialups.mail-abuse.org."));
#		push @bad,"RSS" if(&checkip("$revip.relays.mail-abuse.org."));
#		push @bad,"BHMA" if(&checkip("$revip.blackholes.mail-abuse.org."));
		push @bad,"SC" if(&checkip("$revip.bl.spamcop.net."));
		$tmp=&checkip("$revip.zen.spamhaus.org.");
		if($tmp eq "127.0.0.2") {
			push @bad,"SBL";
		} elsif($tmp eq "127.0.0.3") {
			push @bad,"CSS";
		} elsif($tmp =~ /^127\.0\.0\.([4-8])$/s) {
			push @bad,"XBL($1)";
		} elsif($tmp =~ /^127\.0\.0\.(1[01])$/s) {
			push @bad,"PBL($1)";
		} elsif($tmp) {
			push @bad,"ZEN";
		}
#		push @bad,"RNA" if(&checkip("$revip.bl.reynolds.net.au."));
		push @bad,"BEN" if(&checkip("$revip.blackholes.easynet.nl."));
		push @bad,"DEN" if(&checkip("$revip.dynablock.easynet.nl."));
# blackholes.us doesn't seem to exist any longer
#		push @bad,"ARBU" if(&checkip("$revip.argentina.blackholes.us."));
#		push @bad,"BRBU" if(&checkip("$revip.brazil.blackholes.us."));
#		push @bad,"CNBU" if(&checkip("$revip.china.blackholes.us."));
#		push @bad,"KRBU" if(&checkip("$revip.korea.blackholes.us."));
#		push @bad,"TRBU" if(&checkip("$revip.turkey.blackholes.us."));
#		push @bad,"MYBU" if(&checkip("$revip.malaysia.blackholes.us."));
#		push @bad,"HKBU" if(&checkip("$revip.hongkong.blackholes.us."));
	}
	push @bad,"SPO" if(&checkip("$revip.spam.pedantic.org."));
	if(@bad) {
		print " " if($#ARGV or $printspamcheckheader);
		print join(" ",@bad);
	}
	print "\n" if(@bad or $#ARGV or $printspamcheckheader);
}

sub checkip {
	my $ip=shift;
	print STDERR "Checking $ip..." if($debug);
	my $addr=gethostbyname($ip);
	if(defined $addr) {
		$addr=join('.',unpack("C".length($addr),$addr));
	} else {
		$addr="";
	}
	print STDERR "$addr\n" if($debug);
	return $addr;
}

sub checkrevdns {
	use Socket;
	my $addr=shift;
	print STDERR "Checking ".join('.',unpack("C4",$addr))."..." if($debug);
	my $name=gethostbyaddr($addr,AF_INET);
	$name="" unless(defined $name);
	$name="" unless($name =~ /\./s); # 204.188.196.44 returns "No-RDNS-Record"
	print STDERR "$name\n" if($debug);
	return $name;
}
