Andres Freund: Script aus Script II.(präziser ;-))

Hi

Ich habe schon vor 2 Tagen einen Thread gestartet der zwar interresant war, aber einerseits wegen meiner nicht ganz präzisen Beschreibung nicht ganz den erwünschten Erfolg brachte, andererseits wegen mein durch Ferienjob eng begrenzte Zeit im Archiv landete. Daher ein neuer Versuch mit einer genaueren Definition des Problems.

Das Ziel:

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.

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?

Vielen Dank (nach dem vielen lesen auch sehr gerechtfertigt *g*)

Andres Freund

  1. 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

    1. Hallo,

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

      Was ist daran "bescheiden?;-), ist doch praktisch, oder? Ist ja nur ein Feature das, nach meiner Meinung nützlich ist. Ich hab den Rest nicht alles hier hingeschrieben weil ich da weiß wie ich es mache.

      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.

      Vielen Dank, sollte ich noch Fragen haben werde ich nochmal posten.

      mfg

      Andres Freund