#!/usr/bin/perl
#-----------------------------------------------------------------------------
# HostInfo AWStats plugin
# This plugin allow you to add information on hosts, like whois fields.
#-----------------------------------------------------------------------------
# Perl Required Modules: XWhois
#-----------------------------------------------------------------------------


# <-----
# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES
push @INC, "${DIR}/plugins";
# ----->
#use strict;
no strict "refs";



#-----------------------------------------------------------------------------
# PLUGIN VARIABLES
#-----------------------------------------------------------------------------
# <-----
# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN
# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE.
my $PluginNeedAWStatsVersion="6.0";
my $PluginHooksFunctions="ShowInfoHost";
my $DataFile="";
# ----->

# <-----
# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE.
use vars qw/
/;
# ----->



#-----------------------------------------------------------------------------
# PLUGIN FUNCTION: Init_pluginname
#-----------------------------------------------------------------------------
sub Init_qqhostinfo {
	my $InitParams=shift;
	my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion);

	# <-----
	# ENTER HERE CODE TO DO INIT PLUGIN ACTIONS
	debug(" Plugin qqhostinfo: InitParams=$InitParams",1);
	$DataFile=$InitParams;
	# ----->

	return ($checkversion?$checkversion:"$PluginHooksFunctions");
}


#-----------------------------------------------------------------------------
# PLUGIN FUNCTION: ShowInfoHost_pluginname
# UNIQUE: NO (Several plugins using this function can be loaded)
# Function called to add additionnal columns to the Hosts report.
# This function is called when building rows of the report (One call for each
# row). So it allows you to add a column in report, for example with code :
#   print "<TD>This is a new cell for $param</TD>";
# Parameters: Host name or ip
#-----------------------------------------------------------------------------
sub ShowInfoHost_qqhostinfo {
    my $param="$_[0]";
	# <-----
	if ($param eq '__title__') {
		print "<th width=\"80\">Location</th>";	
	}
	elsif ($param) {
		print "<td>";
		print ipwhere("$param");
		#print $param;
		print "</td>";
	}
	else {
		print "<td>&nbsp;</td>";
	}
	return 1;
	# ----->
}


#-------------------
#雷傲论坛
#http://www.ieasy.org/download/qqwry.pl
#-------------------
sub ipwhere {
    my $ipbegin,$ipend,$ipData1,$ipData2,$DataSeek,$ipFlag;
    
    my $ip=shift;
    my @ip=split(/\./,$ip);
    my $ipNum = $ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];

    my $ipfile=$DataFile;
    open(FILE,"$ipfile");
    binmode(FILE);
    sysread(FILE,$ipbegin,4);
    sysread(FILE,$ipend,4);
     $ipbegin=unpack("L",$ipbegin);
     $ipend=unpack("L",$ipend);
    my $ipAllNum = ($ipend-$ipbegin)/7+1;

    my $BeginNum=0;
    my $EndNum=$ipAllNum;

    Bgn:
    my $Middle= int(($EndNum+$BeginNum)/2);

    seek(FILE,$ipbegin+7*$Middle,0);
    read(FILE,$ipData1,4);
    my $ip1num=unpack("L",$ipData1);
    if ($ip1num > $ipNum) {
        $EndNum=$Middle;
        goto Bgn;
    }

    read(FILE,$DataSeek,3);
    $DataSeek=unpack("L",$DataSeek."\0");
    seek(FILE,$DataSeek,0);
    read(FILE,$ipData2,4);
    my $ip2num=unpack("L",$ipData2);
    if ($ip2num < $ipNum) {
        goto nd if ($Middle==$BeginNum);
        $BeginNum=$Middle;
        goto Bgn;
    }

    $/="\0";
    read(FILE,$ipFlag,1);
    if ($ipFlag eq "\1") {
        my $ipSeek;
        read(FILE,$ipSeek,3);
        $ipSeek = unpack("L",$ipSeek."\0");
        seek(FILE,$ipSeek,0);
        read(FILE,$ipFlag,1);
    }
    if ($ipFlag eq "\2") {
        my $AddrSeek;
        read(FILE,$AddrSeek,3);
        read(FILE,$ipFlag,1);
        if($ipFlag eq "\2") {
            my $AddrSeek2;
            read(FILE,$AddrSeek2,3);
            $AddrSeek2 = unpack("L",$AddrSeek2."\0");
            seek(FILE,$AddrSeek2,0);
        }
        else {
            seek(FILE,-1,1);
        }
        $ipAddr2=<FILE>;
        $AddrSeek = unpack("L",$AddrSeek."\0");
        seek(FILE,$AddrSeek,0);
        $ipAddr1=<FILE>;
    }
    else {
        seek(FILE,-1,1);
        $ipAddr1=<FILE>;
        read(FILE,$ipFlag,1);
        if($ipFlag eq "\2") {
            my $AddrSeek2;
            read(FILE,$AddrSeek2,3);
            $AddrSeek2 = unpack("L",$AddrSeek2."\0");
            seek(FILE,$AddrSeek2,0);
        }
        else {
            seek(FILE,-1,1);
        }
        $ipAddr2=<FILE>;
    }

    nd:
    chomp($ipAddr1,$ipAddr2);
    $/="\n";
    close(FILE);
    
    $ipAddr2="" if($ipAddr2=~/http/i);
    my $ipaddr="$ipAddr1 $ipAddr2";
    $ipaddr =~ s/CZ88\.NET//isg;
    $ipaddr="未知地区" if ($ipaddr=~/未知|http/i || $ipaddr eq "");
    return $ipaddr;
}


1;	# Do not remove this line