Script aus Script II.(präziser ;-))
Andres Freund
- perl
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
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
- eine Session Id beinhalten soll, da ich keine Cookies
mag und ich diese User identifizieren will.- 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:
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
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