Christian Kruse: Script aus Script II.(präziser ;-))

Beitrag lesen

Hallo,

Ich möchte mit Perl ein CGI-Script programieren (das unter
allen Betriebsystemen laufen soll), in dem ein weiteres
Script gestartet wird, das entweder direkt als Textdatei
(wie normal) vorliegt oder in einer DB liegt. Dieses Scipt
kann (meistens) nicht von mir beeinflusst werden und muss
daher irgendwie die erforderlichen Daten die mit Get oder
Post, die leider (aber logischerweise) an das
übergeordnete Script übergeben werden, bekommen.
Dazu kommt noch, das der Output der "Untergeordneten"
Script verändert werden muss, da diese

  1. eine Session Id beinhalten soll, da ich keine Cookies
    mag und ich diese User identifizieren will.
  2. Die Links des untergeordneten Scripts sollen wieder das
    Programm starten (nur mit Parametern, dass der Output
    des/der "Untergeordneten" Sripte angezeigt werden soll)
    da ich keine Frames benutzen will, aber nicht immer in
    alle Scripte das aussehen der restlichen Seite schreiben
    will (abgesehen davon das ich nicht alle Scripte
    geschreieben habe und Einfluss darauf habe).
    Das ganze soll also eine Art CMS werden.

Nunja. Das mit dem Script halte ich fuer absolut bescheiden,
aber egal :)

Mein bisheriger Lösungsansatz:

Ich führe das untergeordnete Script mittels eval() aus und
übergebe die für das untergeordnete Programm bestimmten
Parameter in dem ich Lokal den Hash ENV manipuliere (für
Get Daten). Das funktioniert auch gut, aber die Post Daten
muss das "Untergeordnete" Script ja auch bekommen. Bisher
habe ich diese Daten einfach mit den Get Daten
übermittelt, was bei einigermaßen intelligenten kein
Problem ist, aber einige der Scripte sind leider so
geschrieben dass sie nur POST benutzen. Hätte dafür jemand
eine Idee?
Zweites Problem ist, das ich den in deen "Untergeordneten)
progrämmchen mit print (STDOUT)  ausgegebenen Text noch
aus den oben genannten Gründen verändern muss. Dafür habe
ich bisher noch keinen Lösungsansatz. Kann man STDOUT
eventuell in eine Variable umleiten? Wenn ja, wie?

Interessantes Problem. Dir koennte vielleicht 'perldoc
perlipc' weiterhelfen. Da wird ein Konstrukt vorgestellt:

my $pid = open(PID_TO_WRITE,'|-');
die "argh! could not fork!" unless defined $pid;

if($pid) {
  print PID_TO_WRITE @some_data;
  close(PID_TO_WRITE) || warn "child exited with $?\n";
}
else {
  open(FILE,">/safe/file") or die "can't open: $!";
  while(<STDIN>) {
    print FILE;
  }
  close FILE;
  exit;
}

Das koenntest du nutzen. Beispiel:

ENV-Manipulationen des query strings

my $pid = open(CHLD,'|-');
die "Hey, I could not fork! Error was: $!" unless defined $pid;

if($pid) {
  if($ENV{REQUEST_METHOD} eq 'POST') {
    print CHLD $data; # $data sind die eingelesenen Daten
  }

while(<CHLD>) {
    # Transformationen des Outputs
    print;
  }
}
else {
  my $cgi = new CGI;
  # blahr, blub

print "some data!\n";
  exit; # nicht vergessen! Wichtig!
}

Damit solltest du deine Probleme eigentlich loesen koennen.

Gruesse,
 CK