#!/usr/bin/perl #----------------------------------------------------------------------------- # GeoIp Maxmind AWStats plugin # This plugin allow you to get country report with countries detected # from a Geographical database (GeoIP internal database) instead of domain # hostname suffix. # Need the country database from Maxmind (free). #----------------------------------------------------------------------------- # Perl Required Modules: Geo::IP or Geo::IP::PurePerl #----------------------------------------------------------------------------- # $Revision: 1.31 $ - $Author: eldy $ - $Date: 2010/08/04 12:38:02 $ # <----- # ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES use vars qw/ $type /; $type='geoip'; if (!eval ('require "Geo/IP.pm";')) { $error1=$@; $type='geoippureperl'; if (!eval ('require "Geo/IP/PurePerl.pm";')) { $error2=$@; $ret=($error1||$error2)?"Error:\n$error1$error2":""; $ret.="Error: Need Perl module Geo::IP or Geo::IP::PurePerl"; return $ret; } } # -----> #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="5.4"; my $PluginHooksFunctions="GetCountryCodeByAddr GetCountryCodeByName ShowInfoHost"; my $PluginName = "geoip"; my $LoadedOverride=0; my $OverrideFile=""; my %TmpDomainLookup; # -----> # <----- # IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. use vars qw/ $gi /; # -----> #----------------------------------------------------------------------------- # PLUGIN FUNCTION: Init_pluginname #----------------------------------------------------------------------------- sub Init_geoip { my $InitParams=shift; my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); # <----- # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS debug(" Plugin $PluginName: InitParams=$InitParams",1); my ($mode,$tmpdatafile)=split(/\s+/,$InitParams,2); my ($datafile,$override)=split(/\+/,$tmpdatafile,2); if (! $datafile) { $datafile="$PluginName.dat"; } else { $datafile =~ s/%20/ /g; } if ($type eq 'geoippureperl') { if ($mode eq '' || $mode eq 'GEOIP_MEMORY_CACHE') { $mode=Geo::IP::PurePerl::GEOIP_MEMORY_CACHE(); } else { $mode=Geo::IP::PurePerl::GEOIP_STANDARD(); } } else { if ($mode eq '' || $mode eq 'GEOIP_MEMORY_CACHE') { $mode=Geo::IP::GEOIP_MEMORY_CACHE(); } else { $mode=Geo::IP::GEOIP_STANDARD(); } } if ($override){$OverrideFile=$override;} %TmpDomainLookup=(); debug(" Plugin $PluginName: GeoIP initialized type=$type mode=$mode override=$override",1); if ($type eq 'geoippureperl') { $gi = Geo::IP::PurePerl->open($datafile, $mode); } else { $gi = Geo::IP->open($datafile, $mode); } # Fails on some GeoIP version # debug(" Plugin geoip: GeoIP initialized database_info=".$gi->database_info()); # -----> return ($checkversion?$checkversion:"$PluginHooksFunctions"); } #----------------------------------------------------------------------------- # PLUGIN FUNCTION: GetCountryCodeByAddr_pluginname # UNIQUE: YES (Only one plugin using this function can be loaded) # GetCountryCodeByAddr is called to translate an ip into a country code in lower case. #----------------------------------------------------------------------------- sub GetCountryCodeByAddr_geoip { my $param="$_[0]"; # <----- if (! $param) { return ''; } my $res= TmpLookup_geoip($param); if (! $res) { $res=lc($gi->country_code_by_addr($param)) || 'unknown'; $TmpDomainLookup{$param}=$res; if ($Debug) { debug(" Plugin $PluginName: GetCountryCodeByAddr for $param: [$res]",5); } } elsif ($Debug) { debug(" Plugin $PluginName: GetCountryCodeByAddr for $param: Already resolved to [$res]",5); } # -----> return $res; } #----------------------------------------------------------------------------- # PLUGIN FUNCTION: GetCountryCodeByName_pluginname # UNIQUE: YES (Only one plugin using this function can be loaded) # GetCountryCodeByName is called to translate a host name into a country code in lower case. #----------------------------------------------------------------------------- sub GetCountryCodeByName_geoip { my $param="$_[0]"; # <----- if (! $param) { return ''; } my $res = TmpLookup_geoip($param); if (! $res) { $res=lc($gi->country_code_by_name($param)) || 'unknown'; $TmpDomainLookup{$param}=$res; if ($Debug) { debug(" Plugin $PluginName: GetCountryCodeByName for $param: [$res]",5); } } elsif ($Debug) { debug(" Plugin $PluginName: GetCountryCodeByName for $param: Already resolved to [$res]",5); } # -----> return $res; } #----------------------------------------------------------------------------- # 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 "