#!/usr/local/bin/perl ############################################################ # # LOCAL_COUNTER.CGI # Kulisics, Joseph D. # 31 July 2001 # ############################################################ ############################## # # PACKAGES # ############################## use strict; use Socket; use CGI; ############################## # # GLOBAL VARIABLES # ############################## my $WWW="www"; my $HOME="/u/gs1/kulisics"; my $MAIL="/usr/ucb/mail"; my $MAILTO="kulisics\@cs.ucla.edu"; my $MAILFROM="-r kulisics\@cs.ucla.edu"; my $DB; my $DBNAME; my $COUNTERDATA; my $COUNTERSTAMP; my $VISITCOUNT=0; my $HOSTCOUNT=0; my $LOCALCGI=new CGI; my $SILENT; my $USERCLASS; ############################## # # IMMEDIATE DOCUMENTS # ############################## my $PREAMBLE= <<'PREAMBLE'; Hit Data PREAMBLE my $CONCLUSION= <<'CONCLUSION'; CONCLUSION ############################## # # FUNCTIONS # ############################## sub setup_variables { if(defined $LOCALCGI->param('silent')){ $SILENT=$LOCALCGI->param('silent'); } if(defined $LOCALCGI->param('db')){ $DB=$LOCALCGI->param('db'); $DBNAME="$HOME/$WWW/data/$DB"; $COUNTERDATA="$HOME/$WWW/data/$DB.data"; $COUNTERSTAMP="$HOME/$WWW/data/$DB.stamp"; }else{ $DB="counter"; $DBNAME="$HOME/$WWW/data/$DB"; $COUNTERDATA="$HOME/$WWW/data/$DB.data"; $COUNTERSTAMP="$HOME/$WWW/data/$DB.stamp"; } if(defined $LOCALCGI->param('silent')){ $SILENT=$LOCALCGI->param('silent'); } if(defined $LOCALCGI->param('userclass')){ $USERCLASS=$LOCALCGI->param('userclass'); }else{ $USERCLASS="adornment"; } $PREAMBLE=~s/userclass/$USERCLASS/g; } sub hashed_update_data { my %DBHASH; my @KEYSTRUCT; my $NAME; my $KEY; $NAME=gethostbyaddr(inet_aton($ENV{REMOTE_ADDR}),AF_INET); $KEY="$ENV{REMOTE_ADDR}:$NAME:$ENV{HTTP_FROM}:$ENV{HTTP_USER_AGENT}"; dbmopen(%DBHASH,$DBNAME,0666) or die "Cannot open DBM file\n"; @KEYSTRUCT=keys(%DBHASH); if($DBHASH{$KEY}){ $VISITCOUNT=scalar(@KEYSTRUCT); ++$DBHASH{$KEY}; $HOSTCOUNT=$DBHASH{$KEY}; if(open(MAIL,"|$MAIL $MAILFROM -s \"REPEAT VISIT: $DB from address $ENV{REMOTE_ADDR} name ($NAME)\" $MAILTO")){ print MAIL "DB:\t$DB\n"; print MAIL "HOST:\t($NAME)\n"; print MAIL "IP:\t$ENV{REMOTE_ADDR}\n"; print MAIL "CLIENT:\t$ENV{HTTP_USER_AGENT}\n"; print MAIL "USER:\t$ENV{REMOTE_USER}\n"; print MAIL "REF:\t$ENV{HTTP_REFERER}\n"; print MAIL "VISIT:\t$HOSTCOUNT\n"; close(MAIL); } }else{ $VISITCOUNT=scalar(@KEYSTRUCT)+1; $HOSTCOUNT=1; $DBHASH{$KEY}=1; if(open(MAIL,"|$MAIL $MAILFROM -s \"NEW VISIT: $DB from address $ENV{REMOTE_ADDR} name ($NAME)\" $MAILTO")){ print MAIL "DB:\t$DB\n"; print MAIL "HOST:\t($NAME)\n"; print MAIL "IP:\t$ENV{REMOTE_ADDR}\n"; print MAIL "CLIENT:\t$ENV{HTTP_USER_AGENT}\n"; print MAIL "USER:\t$ENV{REMOTE_USER}\n"; print MAIL "REF:\t$ENV{HTTP_REFERER}\n"; close(MAIL); } } dbmclose(%DBHASH); return 0; } sub print_header { print $LOCALCGI->header; return 0; } sub print_output { my $FILE=$_[0]; my $NUMBER=$_[1]; my @STATS; my $TIME; if(-e $FILE){ @STATS=stat($FILE); }else{ open(FHIN,">$FILE"); close(FHIN); @STATS=stat($FILE); } $TIME=localtime($STATS[9]); print "\n"; print "

Hit Counter Information

\n"; print "Hit Trail Start Time: $TIME
\n"; print "Hit Count: $NUMBER\n"; print "\n"; return 0; } sub print_userdata { my $HOSTCOUNT=$_[0]; my $NAME; $NAME=gethostbyaddr(inet_aton($ENV{REMOTE_ADDR}),AF_INET); print "\n"; print "

Access Information

\n"; print "Remote Address: $ENV{REMOTE_ADDR}
\n"; print "Remote Host: $NAME
\n"; print "Remote Host Visits: $HOSTCOUNT\n"; print "\n"; return 0; } ############################## # # MAIN # ############################## &setup_variables; &hashed_update_data; if(!$SILENT){ &print_header; print $PREAMBLE; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; print_output $COUNTERSTAMP,$VISITCOUNT; print "\n"; print_userdata $HOSTCOUNT; print "
\n"; print $CONCLUSION; }