3 # ncsa.pm was patched to support wn-server by M. Feenstra on 20/09/2001
7 use vars qw(%DATAFIELDS);
10 use Yaala::Parser::WebserverTools qw#%MONTH_NUMBERS detect_referer detect_browser
11 detect_os extract_data#;
12 use Yaala::Data::Persistent qw#init#;
14 @Yaala::Parser::EXPORT_OK = qw(parse extra %DATAFIELDS);
15 @Yaala::Parser::ISA = ('Exporter');
17 our $LASTDATE = init ('$LASTDATE', 'scalar');
18 our $EXTRA = init ('$EXTRA', 'hash');
20 if (!$$LASTDATE) { $$LASTDATE = 0; }
21 if (!defined ($EXTRA->{'total'})) { $EXTRA->{'total'} = 0; }
22 if (!defined ($EXTRA->{'days'} )) { $EXTRA->{'days'} = {}; }
23 if (!defined ($EXTRA->{'search_terms'} )) { $EXTRA->{'search_terms'} = {}; }
32 status => 'key:numeric',
42 # This needs to be done at runtime, since Data uses Setup which relies on
43 # %DATAFIELDS to be defined -octo
44 require Yaala::Data::Core;
45 import Yaala::Data::Core qw#store#;
47 my $VERSION = '$Id: Wnserver.pm,v 1.9 2003/12/07 16:48:59 octo Exp $';
48 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
54 my $line = shift or return undef;
56 if ($line =~ /^(\S+) (\S+) (\S+) \[([^\]]+)\] "([^"]+)" (\d+) (\d+) <[^>]*><([^>]*)> <([^>]*)> <([^>]*)> <([^>]*)>$/)
58 # Initialize the variables that we can get out of
60 my ($host, $ident, $user, $date, $request, $status,
61 $bytes, $browser, $referer, $cookie, $virtual) =
62 ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
64 # And now initialize all the variables we will use
65 # to get more information out of each field..
66 my ($day, $month, $year, $hour, $minute, $second) =
67 $date =~ m#(\d\d)/(\w{3})/(\d{4}):(\d\d):(\d\d):(\d\d)#;
69 $month = $MONTH_NUMBERS{$month};
70 $date = sprintf("%04u-%02u-%02u", $year, $month, $day);
73 my $tmp = int (sprintf ("%04u%02u%02u%02u%02u%02u",
74 $year, $month, $day, $hour, $minute, $second));
76 if ($tmp < $$LASTDATE)
78 print STDERR $/, __FILE__, ": Skipping.. ($tmp < $$LASTDATE)" if ($::DEBUG & 0x0200);
81 else { $$LASTDATE = $tmp; }
84 my ($method, $file, $params);
85 if ($request =~ m#(\S+) ([^ \?]+)\??(\S*)#)
89 $params = (defined ($3) ? $3 : '');
93 print STDERR $/, __FILE__, ": Malformed request: ``$request''." if ($::DEBUG);
97 if (($user ne '-') and ($status >= 400) and ($status < 500))
102 if ($user eq '-') { $user = '*UNKNOWN*'; }
103 if ($bytes eq '-') { $bytes = 0; }
106 if ($host =~ m/\.([a-z]{2,})$/i)
112 $tld = '*UNRESOLVED*';
115 my $os = detect_os ($browser);
116 my $browser_name = detect_browser ($browser);
117 my @search_terms = extract_data ($referer);
118 if ($referer eq '-') { $referer = ''; }
121 $EXTRA->{'days'}{$date}++;
123 if (scalar @search_terms)
125 print $/, __FILE__, ": Search Terms: ",
126 join (' ', @search_terms)
127 if ($::DEBUG & 0x1000);
129 $EXTRA->{'search_terms'}{$_}++ for (@search_terms);
137 'browser' => $browser_name,
141 'referer' => $referer,
144 'virtualhost' => $virtual,
152 print STDERR $/, __FILE__, ": Unable to parse: ``$line''";
158 my ($average, $days) = (0, 0);
160 $days = scalar (keys (%{$EXTRA->{'days'}}));
161 return (0) unless ($days);
163 $average = sprintf ("%.1f", ($EXTRA->{'total'} / $days));
165 $::EXTRA->{'Total requests'} = $EXTRA->{'total'};
166 $::EXTRA->{'Average requests per day'} = $average;
167 $::EXTRA->{'Reporting period'} = "$days days";
169 my @sorted_terms = sort
170 { $EXTRA->{'search_terms'}{$b} <=> $EXTRA->{'search_terms'}{$a} }
171 (keys %{$EXTRA->{'search_terms'}});
175 my $max = $EXTRA->{'search_terms'}{$sorted_terms[0]};
176 my @scalar_terms = ();
178 while (@sorted_terms and
179 ($EXTRA->{'search_terms'}{$sorted_terms[0]} / $max) > 0.1)
181 $_ = shift (@sorted_terms);
185 $_, $EXTRA->{'search_terms'}{$_})
188 $::EXTRA->{'Search terms used'} = join ("<br />\n ", @scalar_terms);
192 my $skipped = scalar (@sorted_terms);
193 $::EXTRA->{'Search terms used'} .= "<br />\n $skipped more skipped";