alliance/dev/cvslargo/www/cgi-bin/czo/hit/hitcfg.pl

216 lines
5.6 KiB
Perl
Executable File

#! /usr/local/bin/perl
#
# HITCFG.PL
# File maintenance module required by HITMATIC
#
# Filename: hitcfg.pl
# Last revised: July 08, 1998
# Copyright: 1997,1998 by Joe DePasquale
# E-Mail: crypt@getcruising.com
# Website: http://www.GetCruising.com
#
########################################################################
# #
# This script and accompanying files may be distributed freely #
# and modified, provided this header with my name, E-Mail address and #
# this notice remain intact. Ownership rights remain with me. You may #
# not sell this script without my approval. #
# #
# This script comes with no guarantee or warranty except for my good #
# intentions. By using this code you agree to indemnify me from any #
# liability that might arise from it's use. #
# #
# There is no technical support for this script, neither am I a #
# professional programmer. Refer to 'HELPME.TXT' for further guidance. #
# #
########################################################################
sub checkCfg # Maintain hit.log, hitx.dat and hit.cfg
{
open (CFG,"+<$HITCFG") || &endIt;
flock (CFG,2); seek (CFG,0,0);
$cfgFile = <CFG>;
($logDay,$datMonth,$cntMonth,$cntFlag,$eol) = split (/\|/,$cfgFile);
# If not done since midnight ...
# If new day, add daily hits to month file
if ($logDay != $dayStamp)
{ &newDay;
}
# If new month, empty last year's month file and update cfg
if ($datMonth+0 != $month)
{ &newMonth;
}
# If new count, recount hits since cntMonth
if ($cntFlag eq 'Y')
{ require "./hitxbm.pl";
&newCount;
}
close (CFG);
} # end checkCfg
sub newDay
{
$HITDAT = "$HITMON$datMonth.dat";
@dyinMon = (0,31,28,31,30,31,30,31,31,30,31,30,31);
$dyinMon = $dyinMon[$datMonth];
open (DAT,"+<$HITDAT") || &endIt;
flock (DAT,2); seek (DAT,0,0);
@hitDat = <DAT>;
# Backup monthly data if trigger
if ($bakFlag eq 'Y' && ($jDate % $bakTime ==0) && !-e $HITBAK)
{ &backUp (@hitDat);
}
# add this month's hits to Tbl hash
foreach $hitLine (@hitDat)
{ @hits = split (/\|/,$hitLine);
$page = $hits[0];
$Tbl{$page}[0] = $page;
for $day (1..$dyinMon)
{ $Tbl{$page}[$day] += $hits[$day];
}
$Index{$page} = 'Y';
}
# Read log file
open (LOG1,"+<$HITLOG1") || &endIt;
flock (LOG1,2); seek (LOG1,0,0);
@logFile = <LOG1>;
# add yesterday's hits to Tbl hash
foreach $logLine (@logFile)
{ @log = split (/\|/,$logLine,3);
$page = $log[1];
# must create new line if no previous hits
if (!$Tbl{$page}[0])
{ $Tbl{$page}[0] = $page;
for $day (1..$dyinMon)
{ $Tbl{$page}[$day] +=0;
}
$Index{$page} = 'Y';
}
$Tbl{$page}[$logDay]++;
# Count unique ip visitors per group on logday
# $group,$foo = split (/\+/,$page);
# if (!$Ip{$ENV{'REMOTE_ADDR'}}{$group}
# { $Ip{$ENV{'REMOTE_ADDR'}}{$group} = 'Y';
# $Tbl{"~IP\+$group"}[$logDay] ++;
# }
#
}
# write updated Tbl back to file
seek (DAT,0,0);
foreach $page (sort {uc($a) cmp uc($b)} keys %Index)
{ $line = '';
for $day (0..$dyinMon)
{ $line .= "$Tbl{$page}[$day]\|";
}
print DAT "$line\n";
}
truncate (DAT,tell(DAT)); close (DAT);
open (LOG2,">$HITLOG2") || &endIt;
flock (LOG2,2); seek (LOG2,0,0);
print (LOG2 @logFile);
truncate (LOG2,tell(LOG2)); close (LOG2);
truncate (LOG1,0); close (LOG1);
$logDay = $dayStamp;
&changeCfg;
} # end newDay
sub newMonth
{
# Empty last year's month file and update cfg if new month
$datMonth = $month;
$HITDAT = "$HITMON$datMonth.dat";
open (DAT,">$HITDAT") || &endIt;
flock (DAT,2);
truncate (DAT,0); close (DAT);
&changeCfg;
} # end newMonth
sub newCount
{
foreach $x (1..12)
{ if (($cntMonth <= $monthStamp && $x >= $cntMonth && $x <= $monthStamp)
|| ($cntMonth > $monthStamp && ($x <= $monthStamp || $x >= $cntMonth)))
{
$HITDAT = "$HITMON$x.dat";
open (DAT,"<$HITDAT") || &endIt;
flock (DAT,1); seek (DAT,0,0);
while ($hitLine = <DAT>)
{ @hits = split (/\|/,$hitLine);
$page = $hits[0];
foreach $day (1..31)
{ $PageTtl{$page} += $hits[$day];
}
}
close (DAT);
}
}
# Create a new hit.cnt file with this data
while (($pagecode,$pagecount) = each %PageTtl)
{ $addLine = join ("\|",$pagecount,$pagecode,"\n");
push @inFile, $addLine;
}
@outFile = sort {($b =~ /(\d+)/)[0] <=> ($a =~ /(\d+)/)[0]} @inFile;
open (CNT,">$HITCNT") || &endIt;
flock (CNT,2); seek (CNT,0,0);
print (CNT @outFile);
truncate (CNT,tell(CNT));
close (CNT);
if ($monthStamp >= $cntMonth)
{ $year = $yearStamp +0;
} else
{ $year = $yearStamp -1;
}
&makeXbm ("$cntMonth".substr("$year",2,2),4,"$hitmatDir/$SINCEXBM");
$cntFlag = '';
&changeCfg;
} # end newCount
sub changeCfg # update hit cfg file
{
$cfgFile = join ("\|",$logDay,$datMonth,$cntMonth,$cntFlag,$eol);
seek (CFG,0,0);
print (CFG $cfgFile);
truncate (CFG,tell(CFG));
} # end changeCfg
sub backUp # Backup data and delete old backups
{
@bakData = @_;
open (BAK,">$HITBAK") || &endIt;
print (BAK @bakData);
close (BAK);
chmod 0666, $HITBAK;
opendir (BAKDIR,$bakDir);
@bakFiles = grep (/hit\d{3}\.bak/, readdir(BAKDIR));
closedir (BAKDIR);
foreach $bakFile (@bakFiles)
{ if (-M "$bakDir/$bakFile" > $bakMax) { unlink "$bakDir/$bakFile"; }
}
} # end backup
1; # return true