New features/improvments:
- Added a 'Screen Size' report.
- Group OS by families. Added a detailed OS version chart.
-- Better 404 errors management. URLs are always cleaned from their
- parameter to build '404 not found' URLs list (because parameters are not
- interesting as they can't have effect as page is not found). Referrer
- URLs list for '404 not found' URLs are kept with parameters only if
- URLReferrerWithQuery is set to 1. This make this report more useful.
+- Better 404 errors management. URLs are always cleaned from their parameter
+ to build '404 not found' URLs list (because parameters are not interesting
+ as they can't have effect as page is not found). Referrer URLs list for '404
+ not found' URLs are kept with parameters only if URLReferrerWithQuery is set
+ to 1. This make this report more useful.
- Added 'geoipfree' plugin (same than 'geoip' plugin but using the free
Perl module Geo::IPfree).
-- 'geoip' plugin can works with Perl module Geo::IP but also with Perl
- module Geo::IP::PurePerl).
+- 'geoip' plugin can works with Perl module Geo::IP but also with Perl module
+ Geo::IP::PurePerl).
+- Added 'userinfo' plugin to add information from a text file (like lastname,
+ office department,...) in authenticated user chart.
- month parameter can accept format -month=D, not only -month=DD
- Optimized code size.
- Optimized HTML output report size.
- Added plugin ipv6 to fully support IPv6 (included reverse DNS lookup).
-- Split month summary chart and days of month chart in two different
- charts in main page. This also means that ShowDaysOfMonthStats and
+- Split month summary chart and days of month chart in two different charts in
+ main page. This also means that ShowDaysOfMonthStats and
AddDataArrayShowDaysOfMonthStats parameters were added.
- Added -staticlinksext to build static pages with another extension than
default .html
Other/Documentation:
- Added Isle of Man, Monserat, and Palestinian flag icon.
-- Added "local network host" and "Satellite access host" in label of
- possible countries and icons (They appears when using geoip plugins).
-- Better management of parsed lines counting. The last line number is
- also stored in history file, for a future use.
+- Added "local network host" and "Satellite access host" in label of possible
+ countries and icons (They appears when using geoip plugins).
+- Better management of parsed lines counting. The last line number is also
+ stored in history file, for a future use.
- Removed LogFormat=5 option for ISA log file because I am fed up of
supporting bugged and non standard MS products. Sorry but this takes me too
many times. To use AWStats with an ISA server, just use now a preprocessor
#
#LoadPlugin="tooltips"
-# Plugin: HashFiles
-# Perl modules required: Storable
-# 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"
-
-# Plugin: TimeHiRes
-# Perl modules required: Time::HiRes
-# Time reported by -showsteps option is in millisecond. For debug purpose.
-#
-#LoadPlugin="timehires"
-
-# Plugin: TimeZone
-# Perl modules required: Time::Local
-# Allow AWStats to correct a bad timezone for user of some IIS that use
-# GMT date in its log instead of local server time.
-# This module is useless for Apache and most IIS version.
-# This plugin reduces AWStats speed of 40% !!!!!!!
+# Plugin: IPv6
+# Perl modules required: Net::IP and Net::DNS
+# This plugin gives AWStats capability to make reverse DNS lookup on IPv6
+# addresses.
+# Note: If you are interesting in having country report, you should use the
+# geoipfree (or geoip) plugin instead of enabled reverse DNS lookup.
#
-#LoadPlugin="timezone +2"
+#LoadPlugin="ipv6"
# Plugin: GeoIPfree
# Perl modules required: Geo::IPfree version 0.2+ (from Graciliano M.P.)
#
#LoadPlugin="urlalias"
+# Plugin: UserInfo
+# Perl modules required: None
+# Add a text (Firtname, Lastname, Office Department, ...) in authenticated user
+# reports for each login value.
+# A text file called userinfo.myconfig.txt, with two fields (first is login,
+# second is text to show) separated by a tab char. must be created in plugins
+# directory.
+#
+LoadPlugin="userinfo"
+
+# Plugin: HashFiles
+# Perl modules required: Storable
+# 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"
+
+# Plugin: TimeHiRes
+# Perl modules required: Time::HiRes
+# Time reported by -showsteps option is in millisecond. For debug purpose.
+#
+#LoadPlugin="timehires"
+
+# Plugin: TimeZone
+# Perl modules required: Time::Local
+# Allow AWStats to correct a bad timezone for user of some IIS that use
+# GMT date in its log instead of local server time.
+# This module is useless for Apache and most IIS version.
+# This plugin reduces AWStats speed of 40% !!!!!!!
+#
+#LoadPlugin="timezone +2"
+
# Plugin: Graph3D
# Perl modules required: None
# Supported charts are built by a nice 3D graphic applet.
# Output: None
# Return: 1 Ok, 0 at least one error (tmp files are removed)
#--------------------------------------------------------------------
-sub Rename_All_Tmp_History()
-{
+sub Rename_All_Tmp_History {
my $pid=$$;
my $renameok=1;
#------------------------------------------------------------------------------
# Function: Converts an UTF8 binary string
#------------------------------------------------------------------------------
-sub Utf8_To_Ascii
-{
+sub Utf8_To_Ascii {
my $string = shift;
my $format = $ENV{"UCFORMAT"}||('%lx');
$string =~ s/([\xC0-\xDF])([\x80-\xBF])/sprintf ("%c", hex(sprintf($format,unpack("c",$1)<<6&0x07C0|unpack("c",$2)&0x003F)))/ge;
#--------------------------------------------------------------------
# Function: Encode a binary string into a non binary string
#--------------------------------------------------------------------
-sub EncodeString
-{
+sub EncodeString {
my $string = shift;
# use bytes;
$string =~ s/([\x2B\x80-\xFF])/sprintf ("%%%2x", ord($1))/eg;
return "$dateformat";
}
-#--------------------------------------------------------------------
-# Function: Write a HTML cell with a WhoIs link to parameter
-# Parameters: Key to used as WhoIs target
-# Input: $LinksToWhoIs $LinksToIPWhoIs
-# Output: None
-# Return: None
-#--------------------------------------------------------------------
-sub ShowWhoIsCell {
- my $keyurl=shift;
- my $keyforwhois;
- my $linkforwhois;
- if ($keyurl =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { # IPv4 address
- $keyforwhois=$keyurl;
- $linkforwhois=2;
- }
- elsif ($keyurl =~ /^[0-9A-F]*:/i) { # IPv6 address
- $keyforwhois=$keyurl;
- $linkforwhois=2;
- }
- else { # Hostname
- $keyurl =~ /([-\w]+\.[-\w]+\.(au|uk|jp|nz))$/ or $keyurl =~ /([-\w]+\.[-\w]+)$/;
- $keyforwhois=$1;
- $linkforwhois=1;
- }
- print "<td>";
- if ($keyforwhois && $linkforwhois) { print "<a href=\"javascript:neww('$keyforwhois',$linkforwhois)\">?</a>"; }
- else { print " " }
- print "</td>";
-}
-
#--------------------------------------------------------------------
# Function: Return 1 if string contains only ascii chars
# Parameters: string
# Output: None
# Return: Int
#--------------------------------------------------------------------
-sub Convert_IP_To_Decimal() {
+sub Convert_IP_To_Decimal {
my ($IPAddress) = @_;
my @ip_seg_arr = split(/\./,$IPAddress);
my $decimal_ip_address = 256 * 256 *256 * $ip_seg_arr[0] + 256 * 256 * $ip_seg_arr[1] + 256 * $ip_seg_arr[2] + $ip_seg_arr[3];
# Output: None
# Return: 1 There is at least one not null value, 0 else
#--------------------------------------------------------------------
-sub AtLeastOneNotNull() {
+sub AtLeastOneNotNull {
debug(" Call to AtLeastOneNotNull (".join('-',@_).")",3);
foreach my $val (@_) { if ($val) { return 1; } }
return 0;
# Output: HTML Form
# Return: None
#--------------------------------------------------------------------
-sub ShowFormFilter() {
+sub ShowFormFilter {
my $fieldfiltername=shift;
my $fieldfiltervalue=shift;
if (! $StaticLinks) {
}
#--------------------------------------------------------------------
-# Function: Write URL with HTML link or not
+# Function: Write Host info
+# Parameters: Key to used as WhoIs target
+# Input: $ShowLinksToWhoIs
+# Output: None
+# Return: None
+#--------------------------------------------------------------------
+sub ShowHostInfo {
+ if ($ShowLinksToWhoIs) {
+ my $keyurl=shift;
+ my $keyforwhois;
+ my $linkforwhois;
+ if ($keyurl =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { # IPv4 address
+ $keyforwhois=$keyurl;
+ $linkforwhois=2;
+ }
+ elsif ($keyurl =~ /^[0-9A-F]*:/i) { # IPv6 address
+ $keyforwhois=$keyurl;
+ $linkforwhois=2;
+ }
+ else { # Hostname
+ $keyurl =~ /([-\w]+\.[-\w]+\.(au|uk|jp|nz))$/ or $keyurl =~ /([-\w]+\.[-\w]+)$/;
+ $keyforwhois=$1;
+ $linkforwhois=1;
+ }
+ print "<td>";
+ if ($keyforwhois && $linkforwhois) { print "<a href=\"javascript:neww('$keyforwhois',$linkforwhois)\">?</a>"; }
+ else { print " " }
+ print "</td>";
+ }
+}
+
+#--------------------------------------------------------------------
+# Function: Write URL info (with plugins info)
# Parameters: $url
# Input: %Aliases $MaxLengthOfURL $ShowLinksOnUrl $SiteDomain $UseHTTPSLinkForUrl
# Output: URL link
# Return: None
#--------------------------------------------------------------------
-sub ShowURL() {
+sub ShowURLInfo {
my $url=shift;
my $nompage=CleanFromCSSA($url);
- # Call to plugins' function ReplaceURL
- foreach my $pluginname (keys %{$PluginsLoaded{'ReplaceURL'}}) {
- my $function="ReplaceURL_$pluginname('$url')";
+ # Call to plugins' function ShowInfoURL
+ foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoURL'}}) {
+ my $function="ShowInfoURL_$pluginname('$url')";
eval("$function");
}
}
}
+#--------------------------------------------------------------------
+# Function: Write other user info
+# Parameters: $user
+# Input: %Aliases $MaxLengthOfURL $ShowLinksOnUrl $SiteDomain $UseHTTPSLinkForUrl
+# Output: URL link
+# Return: None
+#--------------------------------------------------------------------
+sub ShowUserInfo {
+ my $user=shift;
+ # Call to plugins' function ShowInfoUser
+ foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoUser'}}) {
+ my $function="ShowInfoUser_$pluginname('$user')";
+ eval("$function");
+ }
+}
+
#--------------------------------------------------------------------
# Function: Define value for PerlParsingFormat (used for regex log record parsing)
# Parameters: -
# Output: @fieldlib
# Return: -
#--------------------------------------------------------------------
-sub DefinePerlParsingFormat() {
+sub DefinePerlParsingFormat {
# Log records examples:
# Apache combined: 62.161.78.73 user - [dd/mmm/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
# Apache combined (408 error): my.domain.com - user [09/Jan/2001:11:38:51 -0600] "OPTIONS /mime-tmp/xxx file.doc HTTP/1.1" 408 - "-" "-"
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); }
+ ShowHostInfo($key);
if ($ShowHostsStats =~ /P/i) { print "<TD>".($_host_p{$key}?$_host_p{$key}:" ")."</TD>"; }
if ($ShowHostsStats =~ /H/i) { print "<TD>$_host_h{$key}</TD>"; }
if ($ShowHostsStats =~ /B/i) { print "<TD>".Format_Bytes($_host_k{$key})."</TD>"; }
$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=\"#$color_other\">$Message[2]</font></TD>";
- if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell(''); }
+ ShowHostInfo('');
if ($ShowHostsStats =~ /P/i) { print "<TD>".($rest_p?$rest_p:" ")."</TD>"; }
if ($ShowHostsStats =~ /H/i) { print "<TD>$rest_h</TD>"; }
if ($ShowHostsStats =~ /B/i) { print "<TD>".Format_Bytes($rest_k)."</TD>"; }
foreach my $key (@keylist) {
my $host=CleanFromCSSA($key);
print "<tr><td CLASS=AWL>$host</td>";
- if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); }
+ ShowHostInfo($key);
if ($ShowHostsStats =~ /P/i) { print "<TD>".($_host_p{$key}?$_host_p{$key}:" ")."</TD>"; }
if ($ShowHostsStats =~ /H/i) { print "<TD>$_host_h{$key}</TD>"; }
if ($ShowHostsStats =~ /B/i) { print "<TD>".Format_Bytes($_host_k{$key})."</TD>"; }
$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=\"#$color_other\">$Message[82]</font></TD>";
- if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell(''); }
+ ShowHostInfo('');
if ($ShowHostsStats =~ /P/i) { print "<TD>".($rest_p?$rest_p:" ")."</TD>"; }
if ($ShowHostsStats =~ /H/i) { print "<TD>$rest_h</TD>"; }
if ($ShowHostsStats =~ /B/i) { print "<TD>".Format_Bytes($rest_k)."</TD>"; }
if ($HTMLOutput{'lastlogins'}) { $title.="$Message[9]"; }
&tab_head("$title",19);
print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[94] : ".(scalar keys %_login_h)."</TH>";
+ ShowUserInfo('');
if ($ShowAuthenticatedUsers =~ /P/i) { print "<TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH>"; }
if ($ShowAuthenticatedUsers =~ /H/i) { print "<TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH>"; }
if ($ShowAuthenticatedUsers =~ /B/i) { print "<TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH>"; }
if ($HTMLOutput{'lastlogins'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_login_h,\%_login_l); }
foreach my $key (@keylist) {
print "<TR><TD CLASS=AWL>$key</TD>";
+ ShowUserInfo($key);
if ($ShowAuthenticatedUsers =~ /P/i) { print "<TD>".($_login_p{$key}?$_login_p{$key}:" ")."</TD>"; }
if ($ShowAuthenticatedUsers =~ /H/i) { print "<TD>$_login_h{$key}</TD>"; }
if ($ShowAuthenticatedUsers =~ /B/i) { print "<TD>".Format_Bytes($_login_k{$key})."</TD>"; }
$rest_k=$TotalBytes-$total_k;
if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other logins and/or anonymous
print "<TR><TD CLASS=AWL><font color=\"#$color_other\">$Message[125]</font></TD>";
+ ShowUserInfo('');
if ($ShowAuthenticatedUsers =~ /P/i) { print "<TD>".($rest_p?$rest_p:" ")."</TD>"; }
if ($ShowAuthenticatedUsers =~ /H/i) { print "<TD>$rest_h</TD>"; }
if ($ShowAuthenticatedUsers =~ /B/i) { print "<TD>".Format_Bytes($rest_k)."</TD>"; }
}
foreach my $key (@keylist) {
print "<TR><TD CLASS=AWL>";
- &ShowURL($key);
+ &ShowURLInfo($key);
print "</TD>";
my $bredde_p=0; my $bredde_e=0; my $bredde_x=0; my $bredde_k=0;
if ($max_p > 0) { $bredde_p=int($BarWidth*($_url_p{$key}||0)/$max_p)+1; }
if ($TotalRefererPages) { $p_p=int($_pagesrefs_p{$key}/$TotalRefererPages*1000)/10; }
if ($TotalRefererHits) { $p_h=int($_pagesrefs_h{$key}/$TotalRefererHits*1000)/10; }
print "<TR><TD CLASS=AWL>";
- &ShowURL($key);
+ &ShowURLInfo($key);
print "</TD>";
print "<TD>".($_pagesrefs_p{$key}?$_pagesrefs_p{$key}:' ')."</TD><TD>".($_pagesrefs_p{$key}?"$p_p %":' ')."</TD>";
print "<TD>".($_pagesrefs_h{$key}?$_pagesrefs_h{$key}:' ')."</TD><TD>".($_pagesrefs_h{$key}?"$p_h %":' ')."</TD>";
foreach my $key (@keylist) {
print "<TR>";
print "<TD CLASS=AWL>$key</TD>";
- if ($ShowLinksToWhoIs && $LinksToWhoIs) { ShowWhoIsCell($key); }
+ ShowHostInfo($key);
if ($ShowHostsStats =~ /P/i) { print "<TD>".($_host_p{$key}||" ")."</TD>"; }
if ($ShowHostsStats =~ /H/i) { print "<TD>$_host_h{$key}</TD>"; }
if ($ShowHostsStats =~ /B/i) { print "<TD>".Format_Bytes($_host_k{$key})."</TD>"; }
if ($ShowAuthenticatedUsers =~ /L/i) { $title.=" - <a href=\"".($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks?"$AWScript?${NewLinkParams}output=lastlogins":"$PROG$StaticLinks.lastlogins.$StaticExt")."\"$NewLinkTarget>$Message[9]</a>"; }
&tab_head("$title",19);
print "<TR bgcolor=\"#$color_TableBGRowTitle\"><TH>$Message[94] : ".(scalar keys %_login_h)."</TH>";
+ ShowUserInfo('');
if ($ShowAuthenticatedUsers =~ /P/i) { print "<TH bgcolor=\"#$color_p\" width=80>$Message[56]</TH>"; }
if ($ShowAuthenticatedUsers =~ /H/i) { print "<TH bgcolor=\"#$color_h\" width=80>$Message[57]</TH>"; }
if ($ShowAuthenticatedUsers =~ /B/i) { print "<TH bgcolor=\"#$color_k\" width=80>$Message[75]</TH>"; }
if ($max_h > 0) { $bredde_h=int($BarWidth*$_login_h{$key}/$max_h)+1; }
if ($max_k > 0) { $bredde_k=int($BarWidth*$_login_k{$key}/$max_k)+1; }
print "<TR><TD CLASS=AWL>$key</TD>";
+ ShowUserInfo($key);
if ($ShowAuthenticatedUsers =~ /P/i) { print "<TD>".($_login_p{$key}?$_login_p{$key}:" ")."</TD>"; }
if ($ShowAuthenticatedUsers =~ /H/i) { print "<TD>$_login_h{$key}</TD>"; }
if ($ShowAuthenticatedUsers =~ /B/i) { print "<TD>".Format_Bytes($_login_k{$key})."</TD>"; }
$rest_k=$TotalBytes-$total_k;
if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other logins
print "<TR><TD CLASS=AWL><font color=\"#$color_other\">$Message[125]</font></TD>";
+ ShowUserInfo('');
if ($ShowAuthenticatedUsers =~ /P/i) { print "<TD>".($rest_p?$rest_p:" ")."</TD>"; }
if ($ShowAuthenticatedUsers =~ /H/i) { print "<TD>$rest_h</TD>"; }
if ($ShowAuthenticatedUsers =~ /B/i) { print "<TD>".Format_Bytes($rest_k)."</TD>"; }
}
foreach my $key (@keylist) {
print "<TR><TD CLASS=AWL>";
- &ShowURL($key);
+ &ShowURLInfo($key);
print "</TD>";
my $bredde_p=0; my $bredde_e=0; my $bredde_x=0; my $bredde_k=0;
if ($max_p > 0) { $bredde_p=int($BarWidth*($_url_p{$key}||0)/$max_p)+1; }
&BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_pagesrefs_h,\%_pagesrefs_p);
foreach my $key (@keylist) {
print "<TR><TD CLASS=AWL>- ";
- &ShowURL($key);
+ &ShowURLInfo($key);
print "</TD>";
print "<TD>".($_pagesrefs_p{$key}?$_pagesrefs_p{$key}:'0')."</TD>";
print "<TD>$_pagesrefs_h{$key}</TD>";
--- /dev/null
+#!/usr/bin/perl
+#-----------------------------------------------------------------------------
+# UserInfo AWStats plugin
+# This plugin allow you to add information on authenticated users chart from
+# a text file. Like full user name and lastname.
+# You must create a file called userinfo.configvalue.txt and store it in
+# plugin directory that contains 2 columns separated by a tab char.
+# First column is authenticated user login and second column is text
+# you want add.
+#-----------------------------------------------------------------------------
+# Perl Required Modules: None
+#-----------------------------------------------------------------------------
+# $Revision$ - $Author$ - $Date$
+
+
+# <-----
+# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES.
+# ----->
+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.5";
+my $PluginHooksFunctions="ShowInfoUser";
+# ----->
+
+# <-----
+# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE.
+use vars qw/
+$userinfoloaded
+%UserInfo
+/;
+# ----->
+
+
+
+#-----------------------------------------------------------------------------
+# PLUGIN FUNCTION: Init_pluginname
+#-----------------------------------------------------------------------------
+sub Init_userinfo {
+ my $InitParams=shift;
+ my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion);
+
+ # <-----
+ # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS
+ debug(" InitParams=$InitParams",1);
+ $userinfoloaded=0;
+ %UserInfo=();
+ # ----->
+
+ return ($checkversion?$checkversion:"$PluginHooksFunctions");
+}
+
+
+
+#-----------------------------------------------------------------------------
+# PLUGIN FUNCTION: ShowInfoUser_pluginname
+# UNIQUE: NO (Several plugins using this function can be loaded)
+# Function called to add additionnal information for Users in users' report.
+# Parameters: URL
+#-----------------------------------------------------------------------------
+sub ShowInfoUser_userinfo {
+ # <-----
+ if (! $userinfoloaded) {
+ # Load userinfo file
+ my $filetoload='';
+ if ($SiteConfig && open(USERINFOFILE,"$PluginDir/userinfo.$SiteConfig.txt")) { $filetoload="$PluginDir/userinfo.$SiteConfig.txt"; }
+ elsif (open(USERINFOFILE,"$PluginDir/userinfo.txt")) { $filetoload="$PluginDir/userinfo.txt"; }
+ else { error("Couldn't open UserInfo file \"$PluginDir/userinfo.txt\": $!"); }
+ # This is the fastest way to load with regexp that I know
+ %UserInfo = map(/^([^\t]+)\t+([^\t]+)/o,<USERINFOFILE>);
+ close USERINFOFILE;
+ debug("UserInfo file loaded: ".(scalar keys %UserInfo)." entries found.");
+ $userinfoloaded=1;
+ }
+ my $userinfotoreplace="$_[0]";
+ if ($UserInfo{$userinfotoreplace}) { print "<TD>$UserInfo{$userinfotoreplace}</TD>"; }
+ else { print "<TD> </TD>"; }
+ return 1;
+ # ----->
+}
+
+
+1; # Do not remove this line