Hi Leute,
ich habe mir gestern ein relativ triviales CGI-Skript in Perl geschrieben, welches
- eine Datei einliest,
- die Zeilenreihenfolge umkehrt und
- die Datei mit <PRE> formatiert ausgibt.
(Sinn der Sache: Ich will die letzte Änderung
einer sehr großen, hinten verlängerten
Protokolldatei - nämlich dem Apache-Log -
gleich als erstes sehen können.)
Standalone mit Perl aufgerufen funktioniert das
Skript *tadellos*. (access_log ist 160 kb groß.)
Aktiviere ich es aber via CGI über den Webserver, dann gibt es ungefähr 150 Zeilen aus und bricht dann mitten in der Zeile (reproduzierbar an derselben Stelle) ab.
Der Effekt tritt mit jeder von vier verschiedenen ASCII-Dateien auf (drei Apache-Logs, eine eigene ähnliche Log-Datei).
Ich verwende Apache 1.3.6 auf SUN OS; andere (eigene) CGI-Anwendungen funktionieren tadellos
(produzieren aber auch weniger Ausgabedaten).
An der Standardkonfiguration habe ich nichts
Wesentliches gedreht, eigentlich nur mir ein
CGI-Verzeichnis eingerichtet und mit ScriptLog
den CGI-Trace eingeschaltet.
Hat vielleicht irgendjemand eine Idee, was ich da verkehrt mache?
Es riecht ein wenig nach irgendeinem Pufferüberlauf oder so etwas ... es kommt aber
auch *gar* keine Fehlermeldung im Apache-ErrorLog, nicht mal in der CGI-Trace-Datei ...
Das Perl-Skript:
#! /usr/local/bin/perl
umgekehrt sortierte Anzeige einer Protokolldatei
use strict;
use CGI;
use FindBin;
my $local = $FindBin::Bin;
my $shared = "$local/../shared";
my $ApacheLog = "$local/../../../apache/logs";
(zum Adressieren der Protokolldateien)
require "$shared/html.pl";
(Schmacko-Funktionen für HTML-Kopf und -Ende)
CGI-Parameter auswerten
my $cgi_param = new CGI;
my $type = $cgi_param->param ("type");
my $pathname = "???";
my $file = "???";
my $text = "???";
if ($type eq "ApacheAccess")
{
$file = "Apache-Dokumentzugriffe";
$text = "Hier vermerkt der <CITE>Apache</CITE>-Webserver jeden Zugriff auf eine von ihm gelieferte Seite.";
$pathname = "$ApacheLog/access_log"
};
... dasselbe für andere Werte ebenfalls ...
#-------------------------------------------------
Dokumentkopf ausgeben
html::head ($file);
print "<H1>$file</H1>\n";
print "<P><SMALL>$text</SMALL></P>\n";
#------------------------------------------------
Wurde via CGI ein passender Typ angegeben?
if ($file eq "???")
{
#--------------------------------------
# Fehlermeldung ausgeben
print "<P>Ungültiger Parameterwert <TT>type='$type'</TT></P>\n"
#--------------------------------------
}
else
{
#--------------------------------------
# Inhalt der Protokolldatei einlesen
open (LOGFILE, "<$pathname");
my @inhalt = <LOGFILE>;
close (LOGFILE);
#--------------------------------------
# Inhalt der Datei umgekehrt ausgeben
print "<PRE>\n";
foreach my $zeile (reverse @inhalt)
{ print "$zeile"; }
print "</PRE>\n";
#---------------------------------------
}
#-------------------------------------------------
Dokumentende ausgeben
html::tail ();
#=================================================