Hi an alle! So nun folgt ein längerer Text:
Heute nachmittag habe ich schoneinmal gepostet. das hat mir aber nur insofern geholfen, dass ich erfahren habe, dass ich auf dem holzweg war … also:
ich versuche nun schon seit längerer Zeit, squid 2.5STABLE10 (welcher bei SUSE 10.0 dabei war) mit squidalyser auf - wie geschrieben - SUSE 10.0 ans laufen zu bringen. erfolgserlebnisse hatte ich aber nur mit squid selber, bei squidalyser hab ich folgende probleme:
nachdem ich den webserver apache fertig eingerichtet hatte und das squidalyser script auch läuft hapert es nun mit dem einbinden der access.log in die sql datenbank „squid“. squid speichert die access.log entweder im 1. native log format (squid logfile format) oder im 2. common log format:
1158654217.171 755 192.168.10.174 TCP\_MISS/200 276 GET http://toolbarqueries.google.de/search? schmidt DIRECT/72.14.221.104 text/html
wobei die zahlen zu beginn die zeit im utc format sind.
192.168.10.174 - schmidt [19/Sep/2006:16:41:34 +0200] "GET http://toolbarqueries.google.de/search? HTTP/1.0" 200 276 TCP\_MISS:smiley:IRECT
So, nun gibt es bei squidalyser ein perl-script, welches die access.log auswerten und in eine sql datenbank namens squid leserlich einfügen soll!
Bisher funktioniert das bei mir nur, wenn squid die access.log im squid logfile format abspeichert. wäre ja auch schön und gut, nur das datum bzw die uhrzeit werden nicht übernommen. Es wird jeder Zugriff auf den 26.April 1970 18:46:40 Uhr gemünzt, welches im UTC einer 1000000000 (GMT+1)… entspricht. ich habe schon versucht, manuell in der logfile das datum umzuwandeln, was ohne erfolg war.
Ich bin leider sehr unerfahren, was programmierung im allgemeinen angeht. es wäre echt nett, wenn mir jemand helfen könnte. Bisher habe ich erfolglos rumprobiert… Hier ist das Script, welches die logdatei einbindet (ich entschuldige mich wegen der länge, aber ich weiß nicht, was wichtig ist und was nicht):
squidparse.pl
#!/usr/bin/perl
use strict;
use DBI;
use Time::stuck\_out\_tongue:arseDate;
my $t0 = time;
my (%conf, $dbh);
open (CONF, ") {
chomp($line);
$line =~ /^\#/ and next;
$line =~ /^$/ and next;
my ($varname, $varvalue) = split(/\s+/, $line);
$conf{$varname} = $varvalue;
}
close CONF;
my $now = localtime();
print qq|
Running $0 at $now
DB Name: $conf{dbname}
DB Host: $conf{dbhost}
DB User: $conf{dbuser}
Squidlog: $conf{squidlog}
|;
dbconnect($conf{dbhost}, $conf{dbname}, $conf{dbuser}, $conf{dbpass});
my $query = 'SELECT MAX(time) FROM logfile';
my $sth = $dbh-\>prepare($query);
$sth-\>execute;
my $lastrun = $sth-\>fetchrow;
$sth-\>finish;
$query = qq|
INSERT INTO logfile (remotehost,rfc931,authuser,request,status,bytes,time)
VALUES ( ? , ? , ? , ? , ?, ? , ? )
|;
$sth = $dbh-\>prepare($query);
my $count;
open (LOG, ") {
my $seconds;
if ($line =~ /\s+\[(\d{2,2}.\*?)\]\s+/) {
$seconds = parsedate($1);
} else {
$line =~ /^(\d{10,10})\.\d{3,3}/;
$seconds = $1;
}
if ($seconds \>= $lastrun) {
my ($remhost, $rfc931, $date, $request, $status, $bytes) = parseline($line);
insertinlog($remhost, $rfc931, $date, $request, $status, $bytes, $line);
$lastrun = $seconds;
$count++;
}
}
&expire\_db;
&dbdisconnect;
my $t1 = time;
my $elapsed = $t1 - $t0;
print qq|Took $elapsed seconds to process $count records.\n|;
exit 0;
sub insertinlog {
my ($remhost, $rfc931, $date, $request, $status, $bytes, $line) = @\_;
$bytes = 0 unless ($bytes =~ /\d+/);
$status = 0 unless ($status =~ /\d+/);
$sth-\>execute($remhost,$rfc931,'-',$request,$status,$bytes, $date) or do {
print $line;
print $query;
die $!;
};
$sth-\>finish;
return;
}
sub parseline {
my $line = shift or return;
my @f = split(/\s+/, $line);
if ($line =~ /^(\d{10,}\.\d{3,3})/) {
# squid logfile format
my $sec = $1;
my $sta = $1 if ($line =~ /TCP.\*?\/(\d{3,3})/);
# If we're using NTLM authentication, we have username in DOMAIN\User format,
# so split domain and user (authuser) at \ and store username back in $f[7].
# Patch submitted by Neil M. and hacked a bit by me :smile: I don't use NTLM so if
# you spot an error with this one let me know.
if ($f[7] =~ /\\/) {
my ($domain, $user) = split(/\\/,$f[7]);
if ($conf{include\_domain} eq 'y') {
$f[7] = qq|$domain:blush:user|;
} else {
$f[7] = $user;
}
}
return ($f[2], $f[7], $sec, $f[6], $sta, $f[4]);
} else {
# http logfile format
my $date = "$f[3] $f[4]";
$date =~ s/\[|\]//g;
my $sec = parsedate($date);
$f[6] =~ s/"//g;
print $f[0];
print $f[1];
return ($f[0], $f[1], $sec, $f[6], $f[8], $f[9]);
} else {
# http logfile format
my $date = "$f[3] $f[4]";
$date =~ s/\[|\]//g;
my $sec = parsedate($date);
$f[6] =~ s/"//g;
print $f[0];
print $f[1];
return ($f[0], $f[1], $sec, $f[6], $f[8], $f[9]);
}
}
sub expire\_db {
my ($exp\_val, $exp\_unit) = split(/\_/, $conf{expire});
unless ($exp\_val \> 0) {
print qq|Error in config file: `expire $conf{expire}'.\nNo records expired from database.|;
return;
}
if ($exp\_unit eq 'h') {
$conf{factor} = 3600;
} elsif ($exp\_unit eq 'd') {
$conf{factor} = 86400
} elsif ($exp\_unit eq 'w') {
$conf{factor} = 604800;
}
my $nowsec = parsedate($now);
my $expire\_before = $nowsec - ($conf{factor} \* $exp\_val);
my $query = qq|DELETE FROM logfile WHERE time prepare($query);
$sth-\>execute or do {
print $query;
die $!;
};
my $rows = $sth-\>rows;
print qq|\nExpired $rows records from the database.\n|;
}
sub dbconnect {
my ($dbhost, $dbname, $dbuser, $dbpass) = @\_;
$dbh = DBI-\>connect("DBI:mysql:blush:dbname:blush:dbhost",$dbuser,$dbpass) or die (DBI::errstr);
}
sub dbdisconnect {
$sth and $sth-\>finish;
($dbh and $dbh-\>disconnect) or die (DBI::errstr);
}