#!/usr/bin/perl

use strict;

my $whois = '/usr/bin/whois';
my $list = "./ip_list";
my $chains = "./chains";
my @chains = ();
my @list = ();
my %whlist = ();
my @temp = ();
my $tl = "";
my ($key,$value);
my $lcount = 0;

open (IPFL, $list);
@list = <IPFL>;
close(IPFL);

open (CH, "<$chains");
@chains = <CH>;
close(CH);

# read and process the list of IP addresses @list
foreach ( @list ){
    chomp;
    @temp = `whois $_`;
    if ( $temp[1] =~ /\[whois.arin.net\]/ )
    {
        do_US_entry($_);
    }
    else
    {
        foreach $tl( @temp ){
            chomp;
            if ( $tl =~ /^\%/ || $tl =~ /^\[/ || $tl eq "" ){
                #print "$tl\n";
                next;
            }else{
                ($key,$value) = split(/:/, $tl);
                #print "Key is\: $key\n";
                #print "Value is\: $value\n"; 
                $whlist{$key} = $value;
            }
        }
        my $inetnum = $whlist{'inetnum'};
        $inetnum =~ s/ //g;
        my $netname = $whlist{'netname'};
        my $country = $whlist{'country'};
        chomp $inetnum;
        chomp $netname;
        chomp $country;
        $inetnum =~s/^\s+//g;
        $netname =~ s/^\s+//g;
        $country =~ s/\s+//g;
        if ( ! $inetnum ){
            print "Inetnum empty -- quitting\n";
            exit;
        }
        else
        {
            create_rule($inetnum,$netname,$country);
        }
        @temp = ();
        `sleep 1`;
    }
    &finish;
}

exit;

sub create_rule{
    my ($inum,$inam,$c) = @_;
    if ( grep(/$inum/,@chains) ){
        print "\n$inum already exists in chains.\n\n";
        return;
    }
    else{
        my $aa =  "\n\# $inum\t$inam\t$c\n";
        my $bb =  "iptables \-A INPUT \-p tcp \--dport 25 \-m iprange \--src-range $inum \-j LOG \--log-level debug \--log-prefix \"RIPE\-$c\: \"\;\n";
        my $cc =  "iptables \-A INPUT \-p tcp \--dport 25 \-m iprange \--src-range $inum \-j DROP\;\n";
        my $entry = "$aa" . "$bb" . "$cc";
        print "$entry";
        push ( @chains, $entry);
    }   
}

sub do_US_entry{
    my $i = shift;
    if ( grep(/$i/,@chains) )
    {
        print "$i already exists in chains.\n\n";
    }
    else
    {
        my $e = "\# $i\n";
        my $f = "iptables \-A INPUT \-p tcp \--dport 25 \-s $i \-j LOG \--log-level debug \--log-prefix \"as\-US: \"\;\n";
        my $g = "iptables \-A INPUT \-p tcp \--dport 25 \-s $i \-j DROP\;\n";
        my $usentry = "$e" . "$f" . "$g";
        print "$usentry";
        push ( @chains, $usentry);
    }
}

sub finish{
    open (FILE, ">$chains");
    foreach ( @chains ){
        print FILE "$_";
    }
    close(FILE);
}
