IP # Abbildung Monatsnamen => Nummer $mon = array( "Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4, "May" => 5, "Jun" => 6, "Jul" => 7, "Aug" => 8, "Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12, ); #------------------------------------------------------------------------------- # Über alle Namen USERS die letzten Zeilen TAILS von Logfile INPUT nach dem # Schlüssel SEARCH durchsuchen und Datum + Uhrzeit + IP-Adresse + Loginnamen # extrahieren. Dies für immer längere Enden von Logfile INPUT wiederholen, # bis etwas gefunden wurde oder im max. Bereich nichts gefunden wurde. # Ergebnis umformen und nach TMP speichern. Eingabeformat (Common Log Format): # 212.114.236.193 - home10 [13/Oct/2004:14:42:34 +0200] "GET /dslcheck.html HTTP/1.0" 200 51 # ^^^^^^^^^^^^^^^ ^^^^^^ ^^ ^^^ ^^^^ ^^^^^^^^ # \1 \2 \3 \4 \5 \6 # umformen in Zwischenformat: # Sep 13 2004 14:42:34 212.114.236.193 home10 # \4 \3 \5 \6 \1 \2 #------------------------------------------------------------------------------- # In dieser Schleife immer größere Logging-Bereiche vom Ende her lesen foreach ($TAILS as $TAIL) { # Log-Dateiende der Länge TAIL lesen $size = filesize($INPUT); if (!($fi = fopen($INPUT, "r"))) die("cannot open $INPUT for reading"); $offset = $size - $TAIL; if ($offset < 0) $offset = 0; fseek($fi, $offset); # In dieser Schleife letzten passenden Eintrag im akt. Logging-Bereich finden while ($entry = fgets($fi, 1000)) { foreach ($USERS as $USER) { if (!ereg($SEARCH, $entry) || !ereg($USER, $entry)) continue; $INFO = preg_replace( '@^([0-9.]*) - ([^ ]*) \\[([0-9]*)/([A-Za-z]*)/([0-9]*):([0-9:]*) .*@s', "\$4 \$3 \$5 \$6 \$1 \$2", $entry ); #------------------------------------------------------------------------------- # Zwischenformat: # Sep 13 2004 14:42:34 212.114.236.193 home10 # $1 $2 $3 $4 $5 $6 # umformen in Endformat # 20030913 14:42:34 212.114.236.193 home10 # $3 $1$2 $4 $5 $6 #------------------------------------------------------------------------------- if (isset($INFO) and $INFO != "") { $match = split(" ", $INFO); $DYNIP[$USER] = sprintf("%4d%02d%02d %s %s %s", $match[2], $mon[$match[0]], $match[1], $match[3], $match[4], $match[5]); } } } fclose($fi); # Für USER mit gefundenem Logging-Eintrag keine neue Suche mehr durchführen $MISSING = array(); foreach ($USERS as $KEY => $USER) { if (!array_key_exists($USER, $DYNIP)) array_push($MISSING, $USER); } $USERS = $MISSING; # Für alle Benutzer einen Logging-Eintrag gefunden? -> Fertig if (count($USERS) == 0) break; } echo "
"; # User mit NICHT gefundenen IPs ausgeben foreach ($USERS as $KEY => $USER) echo "NOTFOUND $USER\n"; # User mit gefundenen IPs ausgeben foreach ($DYNIP as $KEY => $VAL) echo "$VAL\n"; echo "";