5 use vars qw(%DATAFIELDS);
8 use Yaala::Parser::WebserverTools qw#%MONTH_NUMBERS detect_referer detect_browser
9 detect_os extract_data#;
10 use Yaala::Data::Persistent qw#init#;
12 @Yaala::Parser::EXPORT_OK = qw(parse extra %DATAFIELDS);
13 @Yaala::Parser::ISA = ('Exporter');
15 our $LASTDATE = init ('$LASTDATE', 'scalar');
16 our $EXTRA = init ('$EXTRA', 'hash');
18 if (!$$LASTDATE) { $$LASTDATE = 0; }
19 if (!defined ($EXTRA->{'total'})) { $EXTRA->{'total'} = 0; }
20 if (!defined ($EXTRA->{'days'} )) { $EXTRA->{'days'} = {}; }
21 if (!defined ($EXTRA->{'search_terms'} )) { $EXTRA->{'search_terms'} = {}; }
30 status => 'key:numeric',
39 # This needs to be done at runtime, since Data uses Setup which relies on
40 # %datafields to be defined -octo
41 require Yaala::Data::Core;
42 import Yaala::Data::Core qw#store#;
44 my $VERSION = '$Id: Ncsa.pm,v 1.10 2003/12/07 15:40:35 octo Exp $';
45 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
51 my $line = shift or return undef;
53 #if ($line =~ m#^(\S+)\s(\S+)\s(\S+)\s\[([^\]]+)\]\s"([^"]+)"\s(\d+)\s(\S+)\s"([^"]+)"\s"([^"]+)"(?:\s"([^"]+)")?$#)
54 if ($line =~ m#^(\S+) (\S+) (\S+) \[([^\]]+)\] "([^"]+)" (\d+) (\S+) "([^"]+)" "([^"]+)"(?: "([^"]+)")?$#)
56 # Initialize the variables that we can get out of
58 my ($host, $ident, $user, $date, $request, $status,
59 $bytes, $referer, $browser, $cookie) =
60 ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);
62 # And now initialize all the variables we will use
63 # to get more information out of each field..
64 my ($day, $month, $year, $hour, $minute, $second) =
65 $date =~ m#(\d\d)/(\w{3})/(\d{4}):(\d\d):(\d\d):(\d\d)#;
67 $month = $MONTH_NUMBERS{$month};
68 $date = sprintf("%04u-%02u-%02u", $year, $month, $day);
71 my $tmp = int (sprintf ("%04u%02u%02u%02u%02u%02u",
72 $year, $month, $day, $hour, $minute, $second));
74 if ($tmp < $$LASTDATE)
76 print STDERR $/, __FILE__, ": Skipping.. ($tmp < $$LASTDATE)" if ($::DEBUG & 0x0200);
79 else { $$LASTDATE = $tmp; }
82 my ($method, $file, $params);
83 if ($request =~ m#(\S+) ([^ \?]+)\??(\S*)#)
87 $params = (defined ($3) ? $3 : '');
91 print STDERR $/, __FILE__, ": Malformed request: ``$request''." if ($::DEBUG);
95 if (($user ne '-') and ($status >= 400) and ($status < 500))
100 if ($user eq '-') { $user = '*UNKNOWN*'; }
101 if ($bytes eq '-') { $bytes = 0; }
104 if ($host =~ m/\.([a-z]{2,})$/i)
110 $tld = '*UNRESOLVED*';
113 my $os = detect_os ($browser);
114 my $browser_name = detect_browser ($browser);
115 my @search_terms = extract_data ($referer);
116 if ($referer eq '-') { $referer = ''; }
119 $EXTRA->{'days'}{$date}++;
121 if (scalar @search_terms)
123 print $/, __FILE__, ": Search Terms: ",
124 join (' ', @search_terms)
125 if ($::DEBUG & 0x1000);
127 $EXTRA->{'search_terms'}{$_}++ for (@search_terms);
135 'browser' => $browser_name,
139 'referer' => $referer,
149 print STDERR $/, __FILE__, ": Unable to parse: '$line'";
155 my ($average, $days) = (0, 0);
157 $days = scalar (keys (%{$EXTRA->{'days'}}));
158 return (0) unless ($days);
160 $average = sprintf ("%.1f", ($EXTRA->{'total'} / $days));
162 $::EXTRA->{'Total requests'} = $EXTRA->{'total'};
163 $::EXTRA->{'Average requests per day'} = $average;
164 $::EXTRA->{'Reporting period'} = "$days days";
166 my @sorted_terms = sort
167 { $EXTRA->{'search_terms'}{$b} <=> $EXTRA->{'search_terms'}{$a} }
168 (keys %{$EXTRA->{'search_terms'}});
172 my $max = $EXTRA->{'search_terms'}{$sorted_terms[0]};
173 my @scalar_terms = ();
175 while (@sorted_terms and
176 ($EXTRA->{'search_terms'}{$sorted_terms[0]} / $max) > 0.1)
178 $_ = shift (@sorted_terms);
182 $_, $EXTRA->{'search_terms'}{$_})
185 $::EXTRA->{'Search terms used'} = join ("<br />\n ", @scalar_terms);
189 my $skipped = scalar (@sorted_terms);
190 $::EXTRA->{'Search terms used'} .= "<br />\n $skipped more skipped";