From: eldy <> Date: Sat, 16 Nov 2002 15:04:59 +0000 (+0000) Subject: Added geoip plugin. X-Git-Tag: AWSTATS_5_2_RELEASE~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27ddb37e80dfd2140fba6c5448d0e9c0f9661d10;p=thirdparty%2FAWStats.git Added geoip plugin. --- diff --git a/wwwroot/cgi-bin/awstats.model.conf b/wwwroot/cgi-bin/awstats.model.conf index c2f32eb2..80ab571d 100644 --- a/wwwroot/cgi-bin/awstats.model.conf +++ b/wwwroot/cgi-bin/awstats.model.conf @@ -108,17 +108,18 @@ LogFormat=1 LogSeparator=" " -# If you want to have information on domains/countries visitors, you must ask -# AWStats to make reverse DNS lookup (if not already done in your log file). +# If you want to have hosts reported by name instead of ip address, AWStats +# need to make reverse DNS lookups (if not already done in your log file). # With DNSLookup to 0, all hosts will be reported by their IP addresses and -# not by the full hostname of visitors. Domain/Country chart will also report -# all visitors from a domain/country "Unknown". -# If you need to set DNSLookup to 1, don't forget that this will reduce +# not by the full hostname of visitors. +# If you want to set DNSLookup to 1, don't forget that this will reduce # dramatically AWStats update process speed. Do not use on large web sites. +# Note: Country detection can works without reverse DNS lookup if plugin +# 'geoip' is enabled (faster and more accurate than reverse DNS lookup). # Possible values: # 0 - No DNS Lookup # 1 - DNS Lookup is fully enabled -# 2 - DNS Lookup is made only from DNS cache files +# 2 - DNS Lookup is made only from DNS cache files (if exist) # Default: 2 # DNSLookup=2 @@ -478,11 +479,11 @@ ValidSMTPCodes="1" URLNotCaseSensitive=0 -# In URL links, "?" char is used to add parameters list in URLs. Syntax is: -# /mypage.html?param1=value1¶m2=value2 +# In URL links, "?" char is used to add parameter's list in URLs. Syntax is: +# /mypage.html?param1=value1 # However, some servers/sites have also others chars to isolate dynamic part of -# their URLs. You can complete this list with this parameter. -# Example: "?" +# their URLs. You can complete this list with all such characters. +# Example: "?;," # Default: "?;" # URLQuerySeparators="?;" @@ -514,7 +515,7 @@ URLWithQuery=0 # /mypage.cgi?p=abc&id=Yo4UomP9d and /mypage.cgi?p=abc&id=Mu8fdxl3r # will be reported as 2 hits on /mypage.cgi?p=abc # This parameter is not used when URLWithQuery is 0. -# Example: "PHPSESSID" +# Example: "PHPSESSID jsessionid" # Default: "" # URLWithQueryWithoutFollowingParameters="" @@ -928,16 +929,10 @@ color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2 # modules required by the plugin are installed. # -# Plugin: Graph3D -# Perl modules required: Graph3D -# Some reported charts are nice 3D graphics. -# -#LoadPlugin="graph3d" # !!! NOT YET AVAILABLE !!! - # Plugin: HashFiles # Perl modules required: Storable -# AWStats data files are read/saved as native hash files. This increase -# data file loading speed, above all for very large web sites. +# AWStats DNS cache files are read/saved as native hash files. This increase +# DNS cache files loading speed, above all for very large web sites. # #LoadPlugin="hashfiles" @@ -956,6 +951,20 @@ color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2 # #LoadPlugin="timezone +2" +# Plugin: GeoIP +# Perl modules required: Geo::IP +# Country chart is built from an Internet IP-Country database. Do not use this +# plugin for an intranet. +# This plugin reduces AWStats speed of 10% !!!!!!! +# +#LoadPlugin="geoip" + +# Plugin: Graph3D +# Perl modules required: Graph3D +# Some reported charts are nice 3D graphics. +# +#LoadPlugin="graph3d" # !!! NOT YET AVAILABLE !!! + #----------------------------------------------------------------------------- diff --git a/wwwroot/cgi-bin/awstats.pl b/wwwroot/cgi-bin/awstats.pl index 089a8d4d..acebeff6 100644 --- a/wwwroot/cgi-bin/awstats.pl +++ b/wwwroot/cgi-bin/awstats.pl @@ -27,6 +27,7 @@ $VERSION="5.2 (build $REVISION)"; use vars qw/ $DEBUGFORCED $NBOFLINESFORBENCHMARK $FRAMEWIDTH $TOOLTIPWIDTH $NBOFLASTUPDATELOOKUPTOSAVE $LIMITFLUSH $VISITTIMEOUT $NOTSORTEDRECORDTOLERANCE $MAXDIFFEXTRA +$WIDTHCOLICON /; $DEBUGFORCED=0; # Force debug level to log lesser level into debug.log file (Keep this value to 0) $NBOFLINESFORBENCHMARK=5000; # Benchmark info are printing every NBOFLINESFORBENCHMARK lines @@ -37,6 +38,7 @@ $LIMITFLUSH=4000; # Nb of records in data arrays after how we need to flush $VISITTIMEOUT=10000; # Laps of time to consider a page load as a new visit. 10000 = 1 hour (Default = 10000) $NOTSORTEDRECORDTOLERANCE=10000; # Laps of time to accept a record if not in correct order. 10000 = 1 hour (Default = 10000) $MAXDIFFEXTRA=500; +$WIDTHCOLICON=32; # Plugins variable use vars qw/ %PluginsLoaded /; %PluginsLoaded=(); @@ -245,7 +247,8 @@ use vars qw/ @PluginsToLoad = (); # ---------- Init hash arrays -------- use vars qw/ -%DomainsHashIDLib %BrowsersHereAreGrabbers %BrowsersHashIcon %BrowsersHashIDLib +%DomainsHashIDLib +%BrowsersHereAreGrabbers %BrowsersHashIcon %BrowsersHashIDLib %OSHashID %OSHashLib %RobotsHashIDLib %SearchEnginesHashIDLib %SearchEnginesKnownUrl @@ -1298,7 +1301,7 @@ sub Read_Ref_Data { } if (! $FilePath{$file}) { my $filetext=$file; $filetext =~ s/\.pm$//; $filetext =~ s/_/ /g; - &warning("Warning: Can't read file \"$file\" ($filetext detection will not work correctly).\nCheck if file is in ".($PossibleLibDir[0])." directory and is readable."); + &warning("Warning: Can't read file \"$file\" ($filetext detection will not work correctly).\nCheck if file is in \"".($PossibleLibDir[0])."\" directory and is readable."); } } # Sanity check. @@ -1691,24 +1694,24 @@ sub Read_Plugins { $pluginfile =~ /([^\/\\]*)$/; my $pluginname=$1; if ($pluginname) { - if (! $PluginsLoaded{"init"}{"$pluginname"}) { # Plugin already loaded + if (! $PluginsLoaded{'init'}{"$pluginname"}) { # Plugin already loaded foreach my $dir (@PossiblePluginsDir) { my $searchdir=$dir; if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } my $pluginpath="${searchdir}${pluginfile}.pm"; if (-s "$pluginpath") { if ($Debug) { debug(" Try to init plugin '$pluginname' ($pluginpath) with param '$pluginparam'",1); } - my $initreq=require "$pluginpath"; - if (! $initreq || $initreq =~ /^error/i) { + my $loadret=require "$pluginpath"; + if (! $loadret || $loadret =~ /^error/i) { # Load failed, we stop here - &error("Plugin load for plugin '$pluginname' failed with return code: $initreq"); + &error("Plugin load for plugin '$pluginname' failed with return code: $loadret"); } my $ret; # To get init return my $initfunction="\$ret=Init_$pluginname('$pluginparam')"; my $initret=eval("$initfunction"); if (! $initret || $initret =~ /^error/i) { # Init function failed, we stop here - &error("Plugin init for plugin '$pluginname' failed with return code: $initret"); + &error("Plugin init for plugin '$pluginname' failed with return code: ".($initret?"$initret":"$@ (A module required by plugin might be missing).")); } # Plugin load and init successfull foreach my $elem (split(/\s+/,$initret)) { @@ -1725,13 +1728,13 @@ sub Read_Plugins { } $PluginsLoaded{"$elem"}{"$pluginname"}=1; } - $PluginsLoaded{"init"}{"$pluginname"}=1; + $PluginsLoaded{'init'}{"$pluginname"}=1; if ($Debug) { debug(" Plugin '$pluginname' now hooks functions '$initret'",1); } last; } } - if (! $PluginsLoaded{"init"}{"$pluginname"}) { - &error("Can't open plugin file \"$pluginfile.pm\" for read.\nCheck if file is in ".($PossiblePluginsDir[0])." directory and is readable."); + if (! $PluginsLoaded{'init'}{"$pluginname"}) { + &error("Can't open plugin file \"$pluginfile.pm\" for read.\nCheck if file is in \"".($PossiblePluginsDir[0])."\" directory and is readable."); } } else { @@ -3549,7 +3552,7 @@ sub Read_DNS_Cache { if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } if (-f "${searchdir}$dnscachefile$filesuffix$dnscacheext") { $filetoload="${searchdir}$dnscachefile$filesuffix$dnscacheext"; } # Plugin call : Change filetoload - if ($PluginsLoaded{"SearchFile"}{"hashfiles"}) { SearchFile_hashfiles($searchdir,$dnscachefile,$filesuffix,$dnscacheext,$filetoload); } + if ($PluginsLoaded{'SearchFile'}{'hashfiles'}) { SearchFile_hashfiles($searchdir,$dnscachefile,$filesuffix,$dnscacheext,$filetoload); } if ($filetoload) { last; } # We found a file to load } @@ -3559,7 +3562,7 @@ sub Read_DNS_Cache { } # Plugin call : Load hashtoload - if ($PluginsLoaded{"LoadCache"}{"hashfiles"}) { LoadCache_hashfiles($filetoload,$hashtoload); } + if ($PluginsLoaded{'LoadCache'}{'hashfiles'}) { LoadCache_hashfiles($filetoload,$hashtoload); } if (! scalar keys %$hashtoload) { open(DNSFILE,"$filetoload") or error("Error: Couldn't open DNS Cache file \"$filetoload\": $!"); # This is the fastest way to load with regexp that I know @@ -3567,7 +3570,7 @@ sub Read_DNS_Cache { close DNSFILE; if ($savetohash) { # Plugin call : Save hash file (all records) with test if up to date to save - if ($PluginsLoaded{"SaveHash"}{"hashfiles"}) { SaveHash_hashfiles($filetoload,$hashtoload,1,0); } + if ($PluginsLoaded{'SaveHash'}{'hashfiles'}) { SaveHash_hashfiles($filetoload,$hashtoload,1,0); } } } if ($Debug) { debug(" Loaded ".(scalar keys %$hashtoload)." items from $filetoload in ".(time()-$timetoload)." seconds.",1); } @@ -3602,7 +3605,7 @@ sub Save_DNS_Cache_File { if ($dnscachefile =~ s/(\.\w+)$//) { $dnscacheext=$1; } $filetosave="$dnscachefile$filesuffix$dnscacheext"; # Plugin call : Save hash file (only $NBOFLASTUPDATELOOKUPTOSAVE records) with no test if up to date - if ($PluginsLoaded{"SaveHash"}{"hashfiles"}) { SaveHash_hashfiles($filetosave,$hashtosave,0,$nbofelemtosave,$nbofelemsaved); } + if ($PluginsLoaded{'SaveHash'}{'hashfiles'}) { SaveHash_hashfiles($filetosave,$hashtosave,0,$nbofelemtosave,$nbofelemsaved); } if (! $nbofelemsaved) { $filetosave="$dnscachefile$filesuffix$dnscacheext"; debug(" Save data ".($nbofelemtosave?"($nbofelemtosave records max)":"(all records)")." into file $filetosave"); @@ -3640,7 +3643,7 @@ sub GetDelaySinceStart { if (shift) { $StartSeconds=0; } # Reset counter my ($newseconds, $newmicroseconds)=(time(),0); # Plugin call : Return seconds and milliseconds - if ($PluginsLoaded{"GetTime"}{"timehires"}) { GetTime_timehires($newseconds, $newmicroseconds); } + if ($PluginsLoaded{'GetTime'}{'timehires'}) { GetTime_timehires($newseconds, $newmicroseconds); } if (! $StartSeconds) { $StartSeconds=$newseconds; $StartMicroseconds=$newmicroseconds; } return (($newseconds-$StartSeconds)*1000+int(($newmicroseconds-$StartMicroseconds)/1000)); } @@ -4947,7 +4950,7 @@ if ($UpdateStats && $FrameName ne 'index' && $FrameName ne 'mainleft') { # Updat # Create $timerecord like YYYYMMDDHHMMSS # Plugin call : Convert a @datepart into another @datepart - if ($PluginsLoaded{"ChangeTime"}{"timezone"}) { @dateparts=ChangeTime_timezone(\@dateparts); } + if ($PluginsLoaded{'ChangeTime'}{'timezone'}) { @dateparts=ChangeTime_timezone(\@dateparts); } my $yearmonthdayrecord=sprintf("$dateparts[2]%02i%02i",$dateparts[1],$dateparts[0]); my $timerecord=((int("$yearmonthdayrecord")*100+$dateparts[3])*100+$dateparts[4])*100+$dateparts[5]; my $yearrecord=int($dateparts[2]); @@ -5242,18 +5245,30 @@ if ($UpdateStats && $FrameName ne 'index' && $FrameName ne 'mainleft') { # Updat if ($Debug) { debug(" No DNS lookup asked.",4); } } - # Analyze: Top-level domain - #-------------------------- + # Analyze: Country (Top-level domain) + #------------------------------------ my $Domain='ip'; + # Resolve Domain from hostname if ($HostResolved eq '*') { # $Host is an IP address and is not resolved or resolution gives an IP address $_ = $Host; + # Resolve Domain from plugin + if ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoip'}) { + $Domain=$_; # We store hostname or ip to resolve it into country + GetCountryCodeByAddr_geoip($Domain); + } } else { # $Host has been resolved or was already a host name $_ = lc($HostResolved?$HostResolved:$Host); - if (/\.(\w+)$/) { $Domain=$1; } + # Resolve Domain from plugin + if ($PluginsLoaded{'GetCountryCodeByName'}{'geoip'}) { + $Domain=$_; # We store hostname or ip to resolve it into country + GetCountryCodeByName_geoip($Domain); + } + elsif (/\.(\w+)$/) { $Domain=$1; } } + # Store country if ($PageBool) { $_domener_p{$Domain}++; } $_domener_h{$Domain}++; $_domener_k{$Domain}+=int($field[$pos_size]); @@ -6554,7 +6569,7 @@ EOF } if ($HTMLOutput eq 'urldetail' || $HTMLOutput eq 'urlentry' || $HTMLOutput eq 'urlexit') { # Call to plugin function ShowPagesFilter - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesFilter"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesFilter'}}) { my $function="ShowPagesFilter_$pluginname()"; eval("$function"); } @@ -6581,7 +6596,7 @@ EOF if ($ShowPagesStats =~ /E/i) { print "$Message[104]"; } if ($ShowPagesStats =~ /X/i) { print "$Message[116]"; } # Call to plugin function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesAddField"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { my $function="ShowPagesAddField_$pluginname('title')"; eval("$function"); } @@ -6614,7 +6629,7 @@ EOF if ($ShowPagesStats =~ /E/i) { print "".($_url_e{$key}?$_url_e{$key}:" ").""; } if ($ShowPagesStats =~ /X/i) { print "".($_url_x{$key}?$_url_x{$key}:" ").""; } # Call to plugin function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesAddField"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { my $function="ShowPagesAddField_$pluginname('$key')"; eval("$function"); } @@ -6642,7 +6657,7 @@ EOF if ($ShowPagesStats =~ /E/i) { print "".($rest_e?$rest_e:" ").""; } if ($ShowPagesStats =~ /X/i) { print "".($rest_x?$rest_x:" ").""; } # Call to plugin function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesAddField"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { my $function="ShowPagesAddField_$pluginname('')"; eval("$function"); } @@ -7259,7 +7274,7 @@ EOF if ($Debug) { debug("ShowHoursStats",2); } print "$Center 
\n"; my $title="$Message[20]"; - if ($PluginsLoaded{"GetTimeZoneTitle"}{"timezone"}) { $title.=" (GMT ".(GetTimeZoneTitle_timezone()>=0?"+":"").int(GetTimeZoneTitle_timezone()).")"; } + if ($PluginsLoaded{'GetTimeZoneTitle'}{'timezone'}) { $title.=" (GMT ".(GetTimeZoneTitle_timezone()>=0?"+":"").int(GetTimeZoneTitle_timezone()).")"; } &tab_head("$title",19); print "
\n"; $max_h=$max_k=1; @@ -7346,8 +7361,9 @@ EOF if ($ShowDomainsStats) { if ($Debug) { debug("ShowDomainsStats",2); } print "$Center 
\n"; - &tab_head("$Message[25]",19); - print ""; + my $title="$Message[25] ($Message[77] $MaxNbOfDomain)"; + &tab_head("$title",19); + print ""; if ($ShowDomainsStats =~ /P/i) { print ""; } if ($ShowDomainsStats =~ /H/i) { print ""; } if ($ShowDomainsStats =~ /B/i) { print ""; } @@ -7366,11 +7382,12 @@ EOF if ($_domener_h{$key} && $bredde_h==1) { $bredde_h=2; } if ($max_k > 0) { $bredde_k=int($BarWidth*($_domener_k{$key}||0)/$max_k)+1; } if ($_domener_k{$key} && $bredde_k==1) { $bredde_k=2; } - if ($key eq 'ip' || ! $DomainsHashIDLib{$key}) { - print ""; + my $newkey=lc($key); + if ($newkey eq 'ip' || ! $DomainsHashIDLib{$newkey}) { + print ""; } else { - print ""; + print ""; } if ($ShowDomainsStats =~ /P/i) { print ""; } if ($ShowDomainsStats =~ /H/i) { print ""; } @@ -7379,7 +7396,8 @@ EOF if ($ShowDomainsStats =~ /P/i) { print "\"$Message[56]:
\n"; } if ($ShowDomainsStats =~ /H/i) { print "\"$Message[57]:
\n"; } if ($ShowDomainsStats =~ /B/i) { print "\"$Message[75]:"; } - print "\n"; + print ""; + print "\n"; $total_p += $_domener_p{$key}; $total_h += $_domener_h{$key}; $total_k += $_domener_k{$key}||0; @@ -7389,7 +7407,7 @@ EOF $rest_h=$TotalHits-$total_h; $rest_k=$TotalBytes-$total_k; if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other domains (known or not) - print ""; + print ""; if ($ShowDomainsStats =~ /P/i) { print ""; } if ($ShowDomainsStats =~ /H/i) { print ""; } if ($ShowDomainsStats =~ /B/i) { print ""; } @@ -7404,9 +7422,13 @@ EOF if ($ShowHostsStats) { if ($Debug) { debug("ShowHostsStats",2); } print "$Center 
\n"; - &tab_head("$Message[81] ($Message[77] $MaxNbOfHostsShown)   -   $Message[80]   -   $Message[9]   -   $Message[45]",19); - if ($MonthRequired ne 'year') { print ""; } - else { print ""; } + my $title="$Message[81] ($Message[77] $MaxNbOfHostsShown)   -   $Message[80]   -   $Message[9]   -   $Message[45]"; + &tab_head("$title",19); + print ""; +# print ""; + print ""; } + else { print "$Message[81] : ".(scalar keys %_host_h).""; } if ($ShowLinksToWhoIs && $LinksToWhoIs) { print ""; } if ($ShowHostsStats =~ /P/i) { print ""; } if ($ShowHostsStats =~ /H/i) { print ""; } @@ -7417,14 +7439,25 @@ EOF my $count=0; &BuildKeyList($MaxNbOfHostsShown,$MinHitHost,\%_host_h,\%_host_p); foreach my $key (@keylist) { - print ""; - print ""; + print ""; + # Add flag for IP if geoip plugin enabled +# if ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoip'}) { +# my $countrycode=$key; # We store hostname or ip to resolve it into country +# GetCountryCodeByAddr_geoip($countrycode); +# if ($DomainsHashIDLib{$countrycode}) { +# print ""; +# } +# else { +# print ""; +# } +# } + print ""; if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); } if ($ShowHostsStats =~ /P/i) { print ""; } if ($ShowHostsStats =~ /H/i) { print ""; } if ($ShowHostsStats =~ /B/i) { print ""; } if ($ShowHostsStats =~ /L/i) { print ""; } - print "\n"; + print "\n"; $total_p += $_host_p{$key}; $total_h += $_host_h{$key}; $total_k += $_host_k{$key}||0; @@ -7434,7 +7467,8 @@ EOF $rest_h=$TotalHits-$total_h; $rest_k=$TotalBytes-$total_k; if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) - print ""; + print ""; + print ""; if ($ShowLinksToWhoIs && $LinksToWhoIs) { print ""; } if ($ShowHostsStats =~ /P/i) { print ""; } if ($ShowHostsStats =~ /H/i) { print ""; } @@ -7581,7 +7615,7 @@ EOF if ($ShowPagesStats =~ /E/i) { print ""; } if ($ShowPagesStats =~ /X/i) { print ""; } # Call to plugin function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesAddField"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { my $function="ShowPagesAddField_$pluginname('title')"; eval("$function"); } @@ -7612,7 +7646,7 @@ EOF if ($ShowPagesStats =~ /E/i) { print ""; } if ($ShowPagesStats =~ /X/i) { print ""; } # Call to plugin function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesAddField"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { my $function="ShowPagesAddField_$pluginname('$key')"; eval("$function"); } @@ -7639,7 +7673,7 @@ EOF if ($ShowPagesStats =~ /E/i) { print ""; } if ($ShowPagesStats =~ /X/i) { print ""; } # Call to plugin function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{"ShowPagesAddField"}}) { + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { my $function="ShowPagesAddField_$pluginname('')"; eval("$function"); } @@ -7709,13 +7743,13 @@ EOF foreach my $key (@keylist) { my $p=int($_os_h{$key}/$Total*1000)/10; if ($key eq "Unknown") { - print ""; + print ""; print "\n"; } else { my $newos=$OSHashLib{$key}||$key; my $nameicon=lc($key); $nameicon =~ s/[^\w]+//g; - print ""; + print ""; print "\n"; } $count++; @@ -7742,7 +7776,7 @@ EOF foreach my $key (@keylist) { my $p=int($new_browser_h{$key}/$Total*1000)/10; if ($key eq "Unknown") { - print "\n"; + print "\n"; } else { my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; @@ -7750,7 +7784,7 @@ EOF my $nameicon=$BrowsersHashIcon{$keywithoutcumul}||"notavailable"; if ($libbrowser eq "netscape") { $libbrowser="Netscape ($Message[58])"; } if ($libbrowser eq "msie") { $libbrowser="MS Internet Explorer ($Message[58])"; } - print "\n"; + print "\n"; } $count++; }
$Message[17]$Message[105]
 $Message[17]$Message[56]$Message[57]$Message[75]
\"$Message[0]\"$Message[0]$key
\"$Message[0]\"$Message[0]$newkey
\"$key\"$DomainsHashIDLib{$key}$key
\"$newkey\"$DomainsHashIDLib{$newkey}$newkey$_domener_p{$key}$_domener_h{$key}
$Message[2]
 $Message[2]$rest_p$rest_h".Format_Bytes($rest_k)."
$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]
$Message[81] : ".(scalar keys %_host_h)."
"; + if ($MonthRequired ne 'year') { print "$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]$Message[114]$Message[56]$Message[57]
$key
\"".$DomainsHashIDLib{$countrycode}."\"   $key".($_host_p{$key}||" ")."$_host_h{$key}".Format_Bytes($_host_k{$key})."".($_host_l{$key}?Format_Date($_host_l{$key},1):"-")."
$Message[2]
$Message[2] $rest_p$rest_h$Message[104]$Message[116]".($_url_e{$key}?$_url_e{$key}:" ")."".($_url_x{$key}?$_url_x{$key}:" ")."".($rest_e?$rest_e:" ")."".($rest_x?$rest_x:" ")."
\"$Message[0]\"$Message[0]$_os_h{$key}
\"$Message[0]\"$Message[0]$_os_h{$key}$p %
\"\"$newos$_os_h{$key}
\"\"$newos$_os_h{$key}$p %
\"$Message[0]\"$Message[0]?$_browser_h{$key}$p%
\"$Message[0]\"$Message[0]?$_browser_h{$key}$p%
\"\"$libbrowser".($BrowsersHereAreGrabbers{$key}?"$Message[112]":"$Message[113]")."$new_browser_h{$key}$p %
\"\"$libbrowser".($BrowsersHereAreGrabbers{$key}?"$Message[112]":"$Message[113]")."$new_browser_h{$key}$p %