]> git.ipfire.org Git - thirdparty/AWStats.git/commitdiff
New parameter: Option to add WhoIs link on IP addresses.
authoreldy <>
Sat, 30 Mar 2002 14:04:13 +0000 (14:04 +0000)
committereldy <>
Sat, 30 Mar 2002 14:04:13 +0000 (14:04 +0000)
docs/awstats_changelog.txt
docs/awstats_config.html
wwwroot/cgi-bin/awstats.model.conf
wwwroot/cgi-bin/awstats.pl

index 6e678aaf33434727215a212613c7353273c1e430..3e9d8d95175661193b545ec464c1d97c81fa5186 100644 (file)
@@ -16,17 +16,22 @@ AWStats Changelog
 - New feature: Added average files size in Pages/URL report chart.
 - New feature: You can put dynamic environnement variables into config file.
 - New feature: Keyphrases list can be viewed entirely (not only most used).
-- New parameter: ValidHTTPCodes
-- New parameter: StyleSheet
 - New parameter: WrapperScript
 - New parameter: CreateDirDataIfNotExists
+- New parameter: ValidHTTPCodes
+- New parameter: MaxRowsInHTMLOutput
+- New parameter: ShowLinksToWhoIs
+- New parameter: LinksToWhoIs
+- New parameter: StyleSheet
 - New tool: A log format converter common2combined.pl
 - New option: -staticlinks to build static links in report page (to use
   AWStats with no web servers).
 - Fixed: wrong size of bar in "average" report when average value was < 1.
 - Fixed: pb of "Error: Not same number of records" when using some version
   of mod_perl.
+- Fixed: pb in logresolvemerge.pl
 - No more need to use \. to say . in config file.
+- Documentation seriously updated.
 
 
 3.2
@@ -54,9 +59,9 @@ AWStats Changelog
   http://mysite/sameurl?param=x of http://mysite/sameurl?param=y
 - New feature: ShowFlagLinks can now accept list of all wanted flags for
   translation link.
-- New feature: Add logresolvemerge tool to merge split log files
-  from a load balancing web server before running awstats.
 - New feature: Support standard ISA server log format.
+- New tool: Add logresolvemerge tool to merge split log files
+  from a load balancing web server before running awstats.
 - New parameter: HTMLHeadSection allows you to add HTML code in header report.
 - New parameter: NbOfLinesForCorruptedLog.
 - Fixed: no more warning/error messages when runned with option perl -w.
@@ -159,7 +164,7 @@ AWStats Changelog
 - Setup instructions are cleaner
 
 
-2.22
+2.1
 
 - AWStats considers myserver and www.myserver as the same, even if "HostAliases" setup is wrong.
 - Fixed a bug making unique visitors counter too high.
@@ -167,21 +172,15 @@ AWStats Changelog
 - Make difference between unknown browsers and unknown OS.
 - Robots stats are isolated from the rest of visitors.
 - Better keywords detection algorithm.
-- Code a little bit cleaner and faster.
-- Images are in .png format.
-- Added Spanish language (now 4 different languages supported).
-- 252 domains/countries, 40 browsers database, 22 OS, 250 robots, 32 search engines.
-
-
-2.1
-
 - Added last time connection for each hosts
 - Added list of URL for HTTP Error 404
 - Added pages, hits and KB for each statistics
 - Added colors and links
 - Works also with IIS
-- 3 languages: English, French and Dutch
-- 250 domains/countries, 38 browsers (more with all versions), 19 OS, 186 robots, 24 search engines.
+- Code a little bit cleaner and faster.
+- Images are in .png format.
+- 4 languages: English, French, Dutch, Spanish
+- 252 domains/countries, 40 browsers database, 22 OS, 250 robots, 32 search engines.
 
 
 1.0
index da32d54ac1624dc0fc3ef039e223e647afbd2ce5..69e39c5b4ebc372a9c432692fd2349ac6c320176 100644 (file)
@@ -89,6 +89,7 @@ it with its value when reading it), follow the example:<br>
 
 <br><b>OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features)</b><br>
 <ul>
+<li><a href="#MaxRowsInHTMLOutput">MaxRowsInHTMLOutput</a>
 <li><a href="#Lang">Lang</a>
 <li><a href="#DirLang">DirLang</a>
 <li><a href="#Show">ShowHeader</a>
@@ -128,6 +129,8 @@ it with its value when reading it), follow the example:<br>
 <li><a href="#ShowFlagLinks">ShowFlagLinks</a>
 <li><a href="#ShowLinksOnUrl">ShowLinksOnUrl</a>
 <li><a href="#MaxLengthOfURL">MaxLengthOfURL</a>
+<li><a href="#ShowLinksToWhoIs">ShowLinksToWhoIs</a>
+<li><a href="#LinksToWhoIs">LinksToWhoIs</a>
 <li><a href="#HTMLHeadSection">HTMLHeadSection</a>
 <li><a href="#HTMLEndSection">HTMLEndSection</a>
 <li><a href="#Bar">BarWidth</a>
@@ -159,6 +162,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="LogFile"><b>LogFile</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># "LogFile" contains the web server logfile to analyze.
 <br># You can use a full path or relative path from awstats.pl directory.
 <br># Example: "/var/log/apache/access.log"
@@ -182,6 +186,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="LogFormat"><b>LogFormat</b></a><br>
+<b>Version : </b>2.1 +<br>
 <br># Put here your log format (Must agree with your web server. See setup
 <br># instructions in README.txt to know how to configure your web server to have
 <br># the required log format).
@@ -227,6 +232,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DNSLookup"><b>DNSLookup</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># If you want to have informations on domains/countries visitors, you must ask
 <br># AWStats to make reverse DNS lookup (if not already done in your log file).
 <br># If you set DNSLookup to 1, don't forget that reverse DNS lookup decrease
@@ -242,6 +248,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DirData"><b>DirData</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># When AWStats updates its statistics, it stores results of its analysis in 
 <br># files (AWStats database). All those files are written in the directory
 <br># defined by the "DirData" parameter. Set this value to the directory where
@@ -259,6 +266,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DirCgi"><b>DirCgi</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Relative or absolute web URL of your awstats.pl directory.
 <br># This parameter is used only when AWStats is runned from command line
 <br># with -output option (to generate links in HTML reported page).
@@ -269,6 +277,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DirIcons"><b>DirIcons</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Relative or absolute web URL of all icons subdirectories.
 <br># Default: "/icon" (means you must copy icon directories in "/mywwwroot/icon")
 <br>#
@@ -277,6 +286,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="SiteDomain"><b>SiteDomain</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># "SiteDomain" must contain the main domain name or the main intranet web
 <br># server name used to reach the web site.
 <br># This parameter is only used to generate full URLs links when ShowLinksOnUrl
@@ -291,6 +301,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="Hostaliases"><b>Hostaliases</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Put here all other possible domain names, addresses or virtual host aliases
 <br># someone can use to access your site. Try to keep only the minimum number of
 <br># possible names/adresses to have the best performances.
@@ -306,6 +317,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="AllowToUpdateStatsFromBrowser"><b>AllowToUpdateStatsFromBrowser</b></a><br>
+<b>Version : </b>3.0 +<br>
 <br># When this parameter is set to 1, AWStats add a button on report page to
 <br># allow to "update" statistics from a web browser. Warning, when "update" is
 <br># made from a browser, AWStats is runned as a CGI by the web server user
@@ -353,6 +365,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="PurgeLogFile"><b>PurgeLogFile</b></a><br>
+<b>Version : </b>2.23 +<br>
 <br># AWStats can purge log after processing it. By this way, the next time you
 <br># launch AWStats, log file will be smaller and processing time will be better.
 <br># IMPORTANT !!!
@@ -371,6 +384,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="ArchiveLogRecords"><b>ArchiveLogRecords</b></a><br>
+<b>Version : </b>2.1 +<br>
 <br># When PurgeLogFile is setup to 1, AWStats will clean your log file after
 <br># processing it. You can however keep an archive file (saved in "DirData") of
 <br># all processed log records by setting this to 1 (For example if you want to
@@ -400,6 +414,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DefaultFile"><b>DefaultFile</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Index page name for your web server.
 <br># Example: "default.htm"
 <br># Default: "index.html"
@@ -409,6 +424,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="SkipHosts"><b>SkipHosts</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Do not include access from clients that match following criteria.
 <br># If your log file contains IP adresses in host field, you must put here
 <br># matching IP adresses criteria.
@@ -424,6 +440,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="SkipDNSLookupFor"><b>SkipDNSLookupFor</b></a><br>
+<b>Version : </b>3.0 +<br>
 <br># You can specify specific IP addresses that should NOT be looked up in
 <br>#  the DNS. You may specify partial addresses (ie 163.85. for everything
 <br>#  behind the usual firewall setup, etc)...
@@ -437,6 +454,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="SkipFiles"><b>SkipFiles</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Use SkipFiles to ignore access to URLs that match one of following entries.
 <br># You can, with this option, add a list of not important frame pages (like 
 <br># menus, etc...) to exclude them from statistics.
@@ -454,6 +472,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="OnlyFiles"><b>OnlyFiles</b></a><br>
+<b>Version : </b>3.0 +<br>
 <br># Include in stats, only accesses to URLs that match one of following entries.
 <br># For example, if you want AWStats to filter access to keep only stats that
 <br># match a particular string, like a particular directory, you can add this
@@ -470,6 +489,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="NotPageList"><b>NotPageList</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># Add here a list of kind of url (file extension) that must be counted as
 <br># "Hit only" and not as a "Hit" and "Page viewed". You can set here all images
 <br># extensions as they are hit downloaded that must be counted but they are not
@@ -569,6 +589,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="NbOfLinesForCorruptedLog"><b>NbOfLinesForCorruptedLog</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># To help you to detect if your log format is good, AWStats report an error
 <br># if the first NbOfLinesForCorruptedLog lines have all a format that does not
 <br># match the LogFormat parameter.
@@ -582,6 +603,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="SplitSearchString"><b>SplitSearchString</b></a><br>
+<b>Version : </b>2.24 +<br>
 <br># Search engines keywords reported are full search string or separate keywords
 <br># Possible values:
 <br># 0 - Search keywords reported are full search string (ie: "town maps")
@@ -629,7 +651,18 @@ it with its value when reading it), follow the example:<br>
 
 <br><br><hr>
 
+<a name="MaxRowsInHTMLOutput"><b>MaxRowsInHTMLOutput</b></a><br>
+<b>Version : </b>4.0 +<br>
+<br># To avoid too large web pages, you can ask AWStats to limit number of rows of
+<br># all reported charts to this number when no other limit apply.
+<br># Default: 1000
+<br>#
+<br>MaxRowsInHTMLOutput=1000
+
+<br><br><hr>
+
 <a name="Lang"><b>Lang</b></a><br>
+<b>Version : </b>2.1 +<br>
 <br># Set your primary language.
 <br># Possible value:
 <br>#  Bosnian=ba, Chinese (Taiwan)=tw, Chinese (Traditional)=cn, Czech=cz,
@@ -645,6 +678,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DirLang"><b>DirLang</b></a><br>
+<b>Version : </b>2.1 +<br>
 <br># Set the location of language files.
 <br># Example: "/opt/awstats/lang"
 <br># Default: "./lang" (means lang directory is in same location than awstats.pl)
@@ -654,6 +688,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="Show"><b>Show...</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># You choose here which summary report you want to see in the main page.
 <br># Whatever is your setup here, all detailed reports are still available.
 <br># So if you setup to 1 only ShowHeader, ShowMenu and ShowMonthDayStats, all
@@ -683,6 +718,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="Max"><b>Max...</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># This value can be used to choose maximum number of lines shown for each 
 <br># particular reporting.
 <br>#
@@ -710,6 +746,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="FirstDayOfWeek"><b>FirstDayOfWeek</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># Choose if you want week to start on sunday or monday
 <br># Possible values:
 <br># 0 - Week start on sunday
@@ -721,6 +758,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="DetailedReportsOnNewWindows"><b>DetailedReportsOnNewWindows</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># This parameter ask your browser to open detailed reports into a different
 <br># window than the main page.
 <br># Possible values: 1 or 0
@@ -731,6 +769,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="ShowFlagLinks"><b>ShowFlagLinks</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># List of visible flags with link to other language translations.
 <br># If you don't want any flag link, set ShowFlagLinks to "".
 <br># This parameter is used only if ShowHeader is set to 1.
@@ -742,6 +781,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="ShowLinksOnUrl"><b>ShowLinksOnUrl</b></a><br>
+<b>Version : </b>3.1 +<br>
 <br># Each URL shown in stats report views are links you can click.
 <br># Possible values: 1 or 0
 <br># Default: 1
@@ -751,6 +791,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="MaxLengthOfURL"><b>MaxLengthOfURL</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Maximum length of URL shown on stats page (number of characters). This
 <br># affects only URL visible text, link still work.
 <br># Default: 72
@@ -759,7 +800,34 @@ it with its value when reading it), follow the example:<br>
 
 <br><br><hr>
 
+<a name="ShowLinksToWhoIs"><b>ShowLinksToWhoIs</b></a><br>
+<b>Version : </b>4.0 +<br>
+<br># AWStats can include a link to WhoIs database on all hostnames. For this, you
+<br># must set ShowLinksToWhoIs to 1. Warning, a such feature depends on next
+<br># parameter (LinksForWhoIs) and on WhoIs server exhaustivity and availability.
+<br># For this reason, this feature can't be a reliable feature.
+<br># Possible values: 1 or 0
+<br># Default: 0
+<br>#
+<br>ShowLinksToWhoIs=0
+
+<br><br><hr>
+
+<a name="LinksToWhoIs"><b>LinksToWhoIs</b></a><br>
+<b>Version : </b>4.0 +<br>
+<br># Set here the link used to point to Internet WhoIs database.
+<br># This parameter is not used if ShowLinksToWhoIs is 0.
+<br># Default: "http://www.whois.net/search.cgi2?str="
+<br># Example: "http://www.netsol.com/cgi-bin/whois/whois?SearchType=all&STRING="
+<br># Example: "http://www.ripe.net/perl/whois?form_type=simple&searchtext="
+<br># Example: "http://www.arin.net/cgi-bin/whois.pl?queryinput="
+<br>#
+<br>LinksToWhoIs="http://www.whois.net/search.cgi2?str="
+
+<br><br><hr>
+
 <a name="HTMLHeadSection"><b>HTMLHeadSection</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># You can put here HTML code that will be added at the top of AWStats reports.
 <br># Default: ""
 <br>#
@@ -768,6 +836,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="HTMLEndSection"><b>HTMLEndSection</b></a><br>
+<b>Version : </b>3.2 +<br>
 <br># You can put here HTML code that will be added at the end of AWStats reports.
 <br># Great to add advert ban.
 <br># Default: ""
@@ -777,6 +846,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="Bar"><b>Bar...</b></a><br>
+<b>Version : </b>1.0 +<br>
 <br># Value of maximum bar width/heigth for horizontal/vertical graphics bar
 <br># Default: 260/180
 <br>#
@@ -786,7 +856,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="Logo"><b>Logo...</b></a><br>
-<b>Version : </b>3.1<br>
+<b>Version : </b>3.1 +<br>
 <br># You can set Logo and LogoLink to use your own logo.
 <br># Logo must be the name of image file (must be in $DirIcons/other directory).
 <br># LogoLink is the expected URL when clicking on Logo.
@@ -798,7 +868,7 @@ it with its value when reading it), follow the example:<br>
 <br><br><hr>
 
 <a name="StyleSheet"><b>StyleSheet</b></a><br>
-<b>Version : </b>4.0+<br>
+<b>Version : </b>4.0 +<br>
 <br># You can ask AWStats to use a particular CSS (Cascading Style Sheet) to
 <br># change its look.
 <br># Example: "/css/awstats.css"
index 3814389efd75565affc6e958250a901a63c96e61..22979e39bcbe130e6877506ae218318d2899ca65 100644 (file)
@@ -369,6 +369,12 @@ LevelForRefererAnalyze=1   # 0 will increase AWStats speed by 6%.
 # OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features)
 #-----------------------------------------------------------------------------
 
+# To avoid too large web pages, you can ask AWStats to limit number of rows of
+# all reported charts to this number when no other limit apply.
+# Default: 1000
+#
+MaxRowsInHTMLOutput=1000
+
 # Set your primary language.
 # Possible value:
 #  Bosnian=ba, Chinese (Taiwan)=tw, Chinese (Traditional)=cn, Czech=cz,
@@ -472,6 +478,24 @@ ShowLinksOnUrl=1
 #
 MaxLengthOfURL=72
 
+# AWStats can include a link to WhoIs database on all hostnames. For this, you
+# must set ShowLinksToWhoIs to 1. Warning, a such feature depends on next
+# parameter (LinksForWhoIs) and on WhoIs server exhaustivity and availability.
+# For this reason, this feature can't be a reliable feature.
+# Possible values: 1 or 0
+# Default: 0
+#
+ShowLinksToWhoIs=0
+
+# Set here the link used to point to Internet WhoIs database.
+# This parameter is not used if ShowLinksToWhoIs is 0.
+# Default: "http://www.whois.net/search.cgi2?str="
+# Example: "http://www.netsol.com/cgi-bin/whois/whois?SearchType=all&STRING="
+# Example: "http://www.ripe.net/perl/whois?form_type=simple&searchtext="
+# Example: "http://www.arin.net/cgi-bin/whois.pl?queryinput="
+#
+LinksToWhoIs="http://www.whois.net/search.cgi2?str="
+
 # You can put here HTML code that will be added at the top of AWStats reports.
 # Default: ""
 #
index 7d521467c85e7a49abf0af415536c495247233e1..e733ddae2bcb471ddeab407c9a720df76c5101b6 100644 (file)
@@ -21,7 +21,7 @@ use vars qw(%DomainsHashIDLib @RobotsSearchIDOrder_list1 @RobotsSearchIDOrder_li
 #-------------------------------------------------------
 # Defines
 #-------------------------------------------------------
-my $VERSION="4.0 (build 57)";
+my $VERSION="4.0 (build 58)";
 
 # ---------- Init variables -------
 my $Debug=0;
@@ -71,9 +71,10 @@ $MinHitLogin, $MinHitRefer, $MinHitRobot,
 $NbOfLinesRead, $NbOfLinesDropped, $NbOfLinesCorrupted, $NbOfOldLines, $NbOfNewLines,
 $NowNewLinePhase, $NbOfLinesForCorruptedLog, $PurgeLogFile,
 $ShowAuthenticatedUsers, $ShowCompressionStats, $ShowFileSizesStats,
-$ShowDropped, $ShowCorrupted, $ShowUnknownOrigin, $SplitSearchString, $StartSeconds, $StartMicroseconds,
+$ShowDropped, $ShowCorrupted, $ShowUnknownOrigin, $ShowLinksToWhoIs,
+$SplitSearchString, $StartSeconds, $StartMicroseconds,
 $StaticLinks, $UpdateStats, $URLWithQuery)=
-(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
 my ($AllowToUpdateStatsFromBrowser, $ArchiveLogRecords, $DetailedReportsOnNewWindows,
 $FirstDayOfWeek, $SaveDatabaseFilesWithPermissionsForEveryone,
 $LevelForRobotsDetection, $LevelForBrowsersDetection, $LevelForOSDetection,
@@ -83,11 +84,13 @@ $ShowHoursStats, $ShowDomainsStats, $ShowHostsStats,
 $ShowRobotsStats, $ShowPagesStats, $ShowFileTypesStats,
 $ShowBrowsersStats, $ShowOSStats, $ShowOriginStats, $ShowKeyphrasesStats,
 $ShowKeywordsStats,  $ShowHTTPErrorsStats,
-$ShowFlagLinks, $ShowLinksOnUrl, $WarningMessages)=
+$ShowFlagLinks, $ShowLinksOnUrl,
+$WarningMessages)=
 (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
 my ($ArchiveFileName, $DayRequired, $DefaultFile, $FileConfig, $FileSuffix,
 $HTMLHeadSection, $HTMLEndSection, $HTMLOutput, $Host,
-$LastUpdate, $LogFile, $LogFormat, $LogFormatString, $Logo, $LogoLink,
+$LastUpdate, $LinksToWhoIs,
+$LogFile, $LogFormat, $LogFormatString, $Logo, $LogoLink,
 $MonthRequired, $PageCode, $PerlParsingFormat, $QueryString,
 $SiteConfig, $SiteDomain, $SiteToAnalyze, $SiteToAnalyzeWithoutwww,
 $StyleSheet, $WrapperScript,
@@ -584,11 +587,6 @@ sub Read_Config_File {
                if ($param =~ /^ShowKeywordsStats/)      { $ShowKeywordsStats=$value; next; }
                if ($param =~ /^ShowCompressionStats/)   { $ShowCompressionStats=$value; next; }
                if ($param =~ /^ShowHTTPErrorsStats/)    { $ShowHTTPErrorsStats=$value; next; }
-               if ($param =~ /^FirstDayOfWeek/)        { $FirstDayOfWeek=$value; next; }
-               if ($param =~ /^DetailedReportsOnNewWindows/) { $DetailedReportsOnNewWindows=$value; next; }
-               if ($param =~ /^ShowFlagLinks/)         { $ShowFlagLinks=$value; next; }
-               if ($param =~ /^ShowLinksOnUrl/)        { $ShowLinksOnUrl=$value; next; }
-               if ($param =~ /^MaxLengthOfURL/)        { $MaxLengthOfURL=$value; next; }
                if ($param =~ /^MaxRowsInHTMLOutput/)   { $MaxRowsInHTMLOutput=$value; next; }  # Not used yet
                if ($param =~ /^MaxNbOfDomain/)         { $MaxNbOfDomain=$value; next; }
                if ($param =~ /^MaxNbOfHostsShown/)     { $MaxNbOfHostsShown=$value; next; }
@@ -603,6 +601,13 @@ sub Read_Config_File {
                if ($param =~ /^MinHitRefer/)           { $MinHitRefer=$value; next; }
                if ($param =~ /^MaxNbOfKeywordsShown/)  { $MaxNbOfKeywordsShown=$value; next; }
                if ($param =~ /^MinHitKeyword/)         { $MinHitKeyword=$value; next; }
+               if ($param =~ /^FirstDayOfWeek/)        { $FirstDayOfWeek=$value; next; }
+               if ($param =~ /^DetailedReportsOnNewWindows/) { $DetailedReportsOnNewWindows=$value; next; }
+               if ($param =~ /^ShowFlagLinks/)         { $ShowFlagLinks=$value; next; }
+               if ($param =~ /^ShowLinksOnUrl/)        { $ShowLinksOnUrl=$value; next; }
+               if ($param =~ /^MaxLengthOfURL/)        { $MaxLengthOfURL=$value; next; }
+               if ($param =~ /^ShowLinksToWhoIs/)      { $ShowLinksToWhoIs=$value; next; }
+               if ($param =~ /^LinksToWhoIs/)          { $LinksToWhoIs=$value; next; }
                if ($param =~ /^HTMLHeadSection/)       { $HTMLHeadSection=$value; next; }
                if ($param =~ /^HTMLEndSection/)        { $HTMLEndSection=$value; next; }
                if ($param =~ /^BarWidth/)              { $BarWidth=$value; next; }
@@ -828,6 +833,7 @@ sub Check_Config {
        if ($LevelForRefererAnalyze !~ /^[\d]+/)                        { $LevelForRefererAnalyze=1; }
        if ($LevelForKeywordsDetection !~ /^[\d]+/)             { $LevelForKeywordsDetection=1; }
        # Optional appearance setup section
+       if ($MaxRowsInHTMLOutput !~ /^[\d]+/ || $MaxRowsInHTMLOutput<1)     { $MaxRowsInHTMLOutput=1000; }
        if ($ShowHeader !~ /[0-1]/)                     { $ShowHeader=1; }
        if ($ShowMenu !~ /[0-1]/)                       { $ShowMenu=1; }
        if ($ShowMonthDayStats !~ /[0-1]/)              { $ShowMonthDayStats=1; }
@@ -847,7 +853,6 @@ sub Check_Config {
        if ($ShowKeywordsStats !~ /[0-1]/)              { $ShowKeywordsStats=1; }
        if ($ShowCompressionStats !~ /[0-1]/)           { $ShowCompressionStats=1; }
        if ($ShowHTTPErrorsStats !~ /[0-1]/)            { $ShowHTTPErrorsStats=1; }
-       if ($ShowLinksOnUrl !~ /[0-1]/)                 { $ShowLinksOnUrl=1; }
        if ($MaxNbOfDomain !~ /^[\d]+/ || $MaxNbOfDomain<1)                     { $MaxNbOfDomain=25; }
        if ($MaxNbOfHostsShown !~ /^[\d]+/ || $MaxNbOfHostsShown<1)             { $MaxNbOfHostsShown=25; }
        if ($MinHitHost !~ /^[\d]+/ || $MinHitHost<1)                                   { $MinHitHost=1; }
@@ -861,14 +866,15 @@ sub Check_Config {
        if ($MinHitRefer !~ /^[\d]+/ || $MinHitRefer<1)                         { $MinHitRefer=1; }
        if ($MaxNbOfKeywordsShown !~ /^[\d]+/ || $MaxNbOfKeywordsShown<1)       { $MaxNbOfKeywordsShown=25; }
        if ($MinHitKeyword !~ /^[\d]+/ || $MinHitKeyword<1)                     { $MinHitKeyword=1; }
-       if ($MaxRowsInHTMLOutput !~ /^[\d]+/ || $MaxRowsInHTMLOutput<1)     { $MaxRowsInHTMLOutput=1000; }
-       if ($MaxLengthOfURL !~ /^[\d+]/ || $MaxLengthOfURL<1) { $MaxLengthOfURL=72; }
        if ($FirstDayOfWeek !~ /[0-1]/)                 { $FirstDayOfWeek=1; }
        if ($DetailedReportsOnNewWindows !~ /[0-1]/)    { $DetailedReportsOnNewWindows=1; }
-       if ($BarWidth !~ /^[\d]+/ || $BarWidth<1)               { $BarWidth=260; }
-       if ($BarHeight !~ /^[\d]+/ || $BarHeight<1)             { $BarHeight=180; }
+       if ($ShowLinksOnUrl !~ /[0-1]/)                 { $ShowLinksOnUrl=1; }
+       if ($MaxLengthOfURL !~ /^[\d+]/ || $MaxLengthOfURL<1) { $MaxLengthOfURL=72; }
+       if ($ShowLinksToWhoIs !~ /[0-1]/)               { $ShowLinksToWhoIs=0; }
        if (! $Logo)                                            { $Logo="awstats_logo1.png"; }
        if (! $LogoLink)                                        { $LogoLink="http://awstats.sourceforge.net"; }
+       if ($BarWidth !~ /^[\d]+/ || $BarWidth<1)               { $BarWidth=260; }
+       if ($BarHeight !~ /^[\d]+/ || $BarHeight<1)             { $BarHeight=180; }
        $color_Background =~ s/#//g; if ($color_Background !~ /^[0-9|A-Z]+$/i)           { $color_Background="FFFFFF";  }
        $color_TableBGTitle =~ s/#//g; if ($color_TableBGTitle !~ /^[0-9|A-Z]+$/i)       { $color_TableBGTitle="CCCCDD"; }
        $color_TableTitle =~ s/#//g; if ($color_TableTitle !~ /^[0-9|A-Z]+$/i)           { $color_TableTitle="000000"; }
@@ -1002,6 +1008,7 @@ sub Check_Config {
        if (! $Message[111]) { $Message[111]="Grabber"; }
        if (! $Message[112]) { $Message[112]="Yes"; }
        if (! $Message[113]) { $Message[113]="No"; }
+       if (! $Message[114]) { $Message[114]="WhoIs info"; }
        # Check if DirData is OK
        if (! -d $DirData) {
                if ($CreateDirDataIfNotExists) {
@@ -2005,6 +2012,23 @@ sub Format_Date {
        return "$dateformat";
 }
 
+#--------------------------------------------------------------------
+# Function:     Write a HTML cell with a WhoIs link to parameter
+# Parameter:    Key to used as WhoIs target
+# Input:        $LinksToWhoIs
+#--------------------------------------------------------------------
+sub ShowWhoIsCell {
+       my $keyurl=shift;
+       my $keyforwhois;
+       if ($keyurl =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) {
+               # $keyforwhois=$key;
+       }
+       else { $keyurl =~ /(\w+\.\w+)$/; $keyforwhois=$1; }
+       print "<td>";
+       if ($keyforwhois) { print "<a href=\"$LinksToWhoIs$keyforwhois\" target=whois>?</a>"; }
+       print "</td>";
+}
+
 #--------------------------------------------------------------------
 # Function:     Return 1 if string contains only ascii chars
 # Input:        String
@@ -3551,6 +3575,7 @@ EOF
                        print "<td class=AWL>";
                        if ($ShowDomainsStats)           { print "<a href=\"#DOMAINS\">$Message[17]</a> &nbsp; "; }
                        if ($ShowHostsStats)             { print "<a href=\"#VISITOR\">".ucfirst($Message[81])."</a> &nbsp; "; }
+                       if ($ShowHostsStats)             { print "<a href=\"".($ENV{"GATEWAY_INTERFACE"} || !$StaticLinks?"$AWScript?${NewLinkParams}output=allhosts":"$PROG$FileSuffix.lasthosts.html")."\">$Message[80]</a> &nbsp;\n"; }
                        if ($ShowHostsStats)             { print "<a href=\"".($ENV{"GATEWAY_INTERFACE"} || !$StaticLinks?"$AWScript?${NewLinkParams}output=lasthosts":"$PROG$FileSuffix.lasthosts.html")."\">$Message[9]</a> &nbsp;\n"; }
                        if ($ShowHostsStats)             { print "<a href=\"".($ENV{"GATEWAY_INTERFACE"} || !$StaticLinks?"$AWScript?${NewLinkParams}output=unknownip":"$PROG$FileSuffix.unknownip.html")."\">$Message[45]</a> &nbsp;\n"; }
                        if ($ShowAuthenticatedUsers) { print "<a href=\"#LOGIN\">$Message[94]</a> &nbsp; "; }
@@ -3590,14 +3615,17 @@ EOF
        if ($QueryString =~ /output=allhosts/i) {
                print "$CENTER<a name=\"HOSTSLIST\">&nbsp;</a><BR>";
                &tab_head($Message[81],19);
-               if ($MonthRequired ne "year") { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n"; }
-               else { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : ".(scalar keys %_hostmachine_h)."</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n"; }
+               if ($MonthRequired ne "year") { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]</TH>"; }
+               else { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : ".(scalar keys %_hostmachine_h)."</TH>"; }
+               if ($ShowLinksToWhoIs && $LinksToWhoIs) { print "<TH width=80>$Message[114]</TH>"; }
+               print "<TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n";
                $total_p=$total_h=$total_k=0;
                my $count=0;
                &BuildKeyList($MaxRowsInHTMLOutput,$MinHitHost,\%_hostmachine_h,\%_hostmachine_p);
                foreach my $key (@keylist) {
                        my $host=CleanFromCSSA($key);
                        print "<tr><td CLASS=AWL>".($_robot_l{$key}?"<b>":"")."$host".($_robot_l{$key}?"</b>":"")."</td>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); }
                        print "<TD>".($_hostmachine_p{$key}?$_hostmachine_p{$key}:"&nbsp;")."</TD><TD>$_hostmachine_h{$key}</TD><TD>".Format_Bytes($_hostmachine_k{$key})."</TD>";
                        if ($_hostmachine_l{$key}) { print "<td>".Format_Date($_hostmachine_l{$key},1)."</td>"; }
                        else { print "<td>-</td>"; }
@@ -3612,7 +3640,9 @@ 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 "<TR><TD CLASS=AWL><font color=blue>$Message[2]</font></TD><TD>$rest_p</TD><TD>$rest_h</TD><TD>".Format_Bytes($rest_k)."</TD><TD>&nbsp;</TD></TR>\n";
+                       print "<TR><TD CLASS=AWL><font color=blue>$Message[2]</font></TD>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell(""); }
+                       print "<TD>$rest_p</TD><TD>$rest_h</TD><TD>".Format_Bytes($rest_k)."</TD><TD>&nbsp;</TD></TR>\n";
                }
                &tab_end;
                &html_end;
@@ -3621,14 +3651,17 @@ EOF
        if ($QueryString =~ /output=lasthosts/i) {
                print "$CENTER<a name=\"HOSTSLIST\">&nbsp;</a><BR>";
                &tab_head($Message[9],19);
-               if ($MonthRequired ne "year") { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n"; }
-               else { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : ".(scalar keys %_hostmachine_h)."</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n"; }
+               if ($MonthRequired ne "year") { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]</TH>"; }
+               else { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : ".(scalar keys %_hostmachine_h)."</TH>"; }
+               if ($ShowLinksToWhoIs && $LinksToWhoIs) { print "<TH width=80>$Message[114]</TH>"; }
+               print "<TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n";
                $total_p=$total_h=$total_k=0;
                my $count=0;
                &BuildKeyList($MaxRowsInHTMLOutput,$MinHitHost,\%_hostmachine_h,\%_hostmachine_l);
                foreach my $key (@keylist) {
                        my $host=CleanFromCSSA($key);
                        print "<tr><td CLASS=AWL>".($_robot_l{$key}?"<b>":"")."$host".($_robot_l{$key}?"</b>":"")."</td>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); }
                        print "<TD>".($_hostmachine_p{$key}?$_hostmachine_p{$key}:"&nbsp;")."</TD><TD>$_hostmachine_h{$key}</TD><TD>".Format_Bytes($_hostmachine_k{$key})."</TD>";
                        if ($_hostmachine_l{$key}) { print "<td>".Format_Date($_hostmachine_l{$key},1)."</td>"; }
                        else { print "<td>-</td>"; }
@@ -3643,7 +3676,9 @@ 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 "<TR><TD CLASS=AWL><font color=blue>$Message[2]</font></TD><TD>$rest_p</TD><TD>$rest_h</TD><TD>".Format_Bytes($rest_k)."</TD><TD>&nbsp;</TD></TR>\n";
+                       print "<TR><TD CLASS=AWL><font color=blue>$Message[2]</font></TD>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell(""); }
+                       print "<TD>$rest_p</TD><TD>$rest_h</TD><TD>".Format_Bytes($rest_k)."</TD><TD>&nbsp;</TD></TR>\n";
                }
                &tab_end;
                &html_end;
@@ -3652,13 +3687,16 @@ EOF
        if ($QueryString =~ /output=unknownip/i) {
                print "$CENTER<a name=\"UNKOWNIP\">&nbsp;</a><BR>";
                &tab_head($Message[45],19);
-               print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>".(scalar keys %_hostmachine_h)." $Message[1]</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH>\n";
+               print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>".(scalar keys %_hostmachine_h)." $Message[1]</TH>";
+               if ($ShowLinksToWhoIs && $LinksToWhoIs) { print "<TH width=80>$Message[114]</TH>"; }
+               print "<TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n";
                $total_p=$total_h=$total_k=0;
                my $count=0;
                &BuildKeyList($MaxRowsInHTMLOutput,$MinHitHost,\%_hostmachine_h,\%_hostmachine_p);
                foreach my $key (@keylist) {
                        my $host=CleanFromCSSA($key);
                        print "<tr><td CLASS=AWL>$host</td>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); }
                        print "<TD>".($_hostmachine_p{$key}||"&nbsp")."</TD><TD>$_hostmachine_h{$key}</TD><TD>".Format_Bytes($_hostmachine_k{$key})."</TD>";
                        if ($_hostmachine_l{$key}) { print "<td>".Format_Date($_hostmachine_l{$key},1)."</td>"; }
                        else { print "<td>-</td>"; }
@@ -3673,7 +3711,9 @@ 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 "<TR><TD CLASS=AWL><font color=blue>$Message[82]</font></TD><TD>$rest_p</TD><TD>$rest_h</TD><TD>".Format_Bytes($rest_k)."</TD><TD>&nbsp;</TD></TR>\n";
+                       print "<TR><TD CLASS=AWL><font color=blue>$Message[82]</font></TD>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell(""); }
+                       print "<TD>$rest_p</TD><TD>$rest_h</TD><TD>".Format_Bytes($rest_k)."</TD><TD>&nbsp;</TD></TR>\n";
                }
                &tab_end;
                &html_end;
@@ -4201,13 +4241,18 @@ EOF
                print "$CENTER<a name=\"VISITOR\">&nbsp;</a><BR>";
                $MaxNbOfHostsShown = (scalar keys %_hostmachine_h) if $MaxNbOfHostsShown > (scalar keys %_hostmachine_h);
                &tab_head("$Message[81] ($Message[77] $MaxNbOfHostsShown) &nbsp; - &nbsp; <a href=\"".($ENV{"GATEWAY_INTERFACE"} || !$StaticLinks?"$AWScript?${NewLinkParams}output=allhosts":"$PROG$FileSuffix.allhosts.html")."\">$Message[80]</a> &nbsp; - &nbsp; <a href=\"".($ENV{"GATEWAY_INTERFACE"} || !$StaticLinks?"$AWScript?${NewLinkParams}output=lasthosts":"$PROG$FileSuffix.lasthosts.html")."\">$Message[9]</a> &nbsp; - &nbsp; <a href=\"".($ENV{"GATEWAY_INTERFACE"} || !$StaticLinks?"$AWScript?${NewLinkParams}output=unknownip":"$PROG$FileSuffix.unknownip.html")."\">$Message[45]</a>",19);
-               if ($MonthRequired ne "year") { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n"; }
-               else { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : ".(scalar keys %_hostmachine_h)."</TH><TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n"; }
+               if ($MonthRequired ne "year") { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]</TH>"; }
+               else { print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[81] : ".(scalar keys %_hostmachine_h)."</TH>"; }
+               if ($ShowLinksToWhoIs && $LinksToWhoIs) { print "<TH width=80>$Message[114]</TH>"; }
+               print "<TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH><TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH><TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH><TH width=120>$Message[9]</TH></TR>\n";
                $total_p=$total_h=$total_k=0;
                my $count=0;
                &BuildKeyList($MaxNbOfHostsShown,$MinHitHost,\%_hostmachine_h,\%_hostmachine_p);
                foreach my $key (@keylist) {
-                       print "<tr><td CLASS=AWL>$key</td><TD>".($_hostmachine_p{$key}||"&nbsp")."</TD><TD>$_hostmachine_h{$key}</TD><TD>".Format_Bytes($_hostmachine_k{$key})."</TD>";
+                       print "<tr>";
+                       print "<td CLASS=AWL>$key</td>";
+                       if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); }
+                       print "<TD>".($_hostmachine_p{$key}||"&nbsp")."</TD><TD>$_hostmachine_h{$key}</TD><TD>".Format_Bytes($_hostmachine_k{$key})."</TD>";
                        if ($_hostmachine_l{$key}) { print "<td>".Format_Date($_hostmachine_l{$key},1)."</td>"; }
                        else { print "<td>-</td>"; }
                        print "</tr>\n";