#!/sw/bin/perl -w use strict; no strict "vars"; use Date::DateCalc qw(:all); #$logfile = '/u/sb/access.log'; #$logfile = '/opt/var/w3s/log/access.log'; # sunbi1 $logfile = '/sw/var/w3s/log/apache.access.log'; # en3 $layout = "index.shtml"; $keywords = 'Date|Calc|gen|tree|Bit|Vector|Flag|Welt|Math|Matrix|Real|Bool|Data|Location|Shift|Reg|Tie|Handle|DFA|Kleene|Graph|Kruskal|Set|Integer|Fast|Range|join'; print "Content-type: text/html\n\n"; unless (open(FILE, "<$logfile")) { error("Can't read file '$logfile': $!"); } $infinity = calc_days(3000,1,1) - 1; $mindate = $infinity; $maxdate = 0; while () { next if (m!^(?:(?:world|www|en1|en3)\.engelschall\.com|sunti5\.sdm\.de|izb\.)!i); if (m!\bGET\s+/(?:[A-Za-z0-9\._-]+/)*([A-Za-z0-9\._-]+\.(?:tar\.gz|sea\.bin))\b!i) { $name = $1; if ($name =~ /$keywords/io) { $name =~ tr/_/-/; $namecount{$name}++; if (m!\[(\d?\d/[A-Za-z]{3}/\d\d(?:\d\d)?):!) { $date = $1; if (($yy,$mm,$dd) = decode_date($date)) { $date = calc_days($yy,$mm,$dd) - 1; $mindate = $date if ($date < $mindate); $maxdate = $date if ($date > $maxdate); unless (defined $datecount{$date}) { $datecount{$date} = { }; } $datecount{$date}->{$name}++; } } } } } close(FILE); unless (open(LAYOUT, "<$layout")) { error("Can't read file '$layout': $!"); } while () { if (m%%) { $left = $`; $file = $1; $right = $'; print $left; if ($file =~ m!^/u/sb/!) { if ($file !~ m!^/u/sb/\.www/!) { $file =~ s!^/u/sb/!/u/sb/.www/!; } } if ($file eq 'LAST_MODIFIED') { $date = `/bin/date`; $date =~ s!\n+$!!; print $date; } elsif ($file eq 'URL_COUNT') { print "1"; } elsif ($file eq 'index.body') { print "
\n";
            &body();
            print "
\n"; } else { if (open(FILE, "<$file")) { while () { print; } close(FILE); } else { print "Can't read file '$file': $!"; } } print $right; } else { print; } } close(LAYOUT); exit; sub body { if (($mindate < $infinity) && ($mindate <= $maxdate) && ($maxdate > 0)) { $date = date_to_short(calc_new_date(1,1,1,$mindate)); print "Starting with $date:\n"; print "\nHit List (total):\n\n"; foreach $_ (sort alphanum keys(%namecount)) { printf("%-40s : %5d\n",$_,$namecount{$_}); } print "\nAlphabetic List (total):\n\n"; foreach $_ (sort ignore_case keys(%namecount)) { printf("%-40s : %5d\n",$_,$namecount{$_}); } #foreach $day (sort { $a <=> $b } (keys(%datecount))) for ( $day = $maxdate-2; $day <= $maxdate; $day++ ) { if (defined $datecount{$day}) { $name = $datecount{$day}; $date = date_to_short(calc_new_date(1,1,1,$day)); print "\nHit List $date:\n\n"; foreach $_ (sort alphanum2 keys(%{$name})) { printf("%-40s : %5d\n",$_,$name->{$_}); } print "\nAlphabetic List $date:\n\n"; foreach $_ (sort ignore_case keys(%{$name})) { printf("%-40s : %5d\n",$_,$name->{$_}); } } } } else { print "No entries.\n"; } } sub alphanum { my($result); $result = ( $namecount{$b} <=> $namecount{$a} ); if ($result == 0) { $result = ( lc($b) cmp lc($a) ); } return($result); } sub ignore_case { return( lc($a) cmp lc($b) ); } sub alphanum2 { my($result); $result = ( $name->{$b} <=> $name->{$a} ); if ($result == 0) { $result = ( lc($b) cmp lc($a) ); } return($result); } sub error { my($message) = shift; print <<"VERBATIM"; Error

Error:

$message
VERBATIM exit; } __END__