Michael Schröpl: (PERL)(Apache) Ausgabe eines CGI-Skripts bricht ab

Beitrag lesen

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 ();
#=================================================