=pod =head1 NAME HTML::Embperl - einbetten von Perlcode in HTML Dokumente =head1 SYNOPSIS I ist ein Perlmodul welches es erlaubt beliebigen Perlcode in HTML Dokumente einzufügen. =head1 Aufrufen/Konfigurieren von Embperl =head2 mod_perl Konfiguration Um I als content handler unter I laufen zu lassen, sind folgende Zeilen in der Apache Konfigurationsdatei F nötig: Beipiel für Apache B: SetEnv EMBPERL_DEBUG 2285 SetHandler perl-script PerlHandler HTML::Embperl Options ExecCGI Diese Konfiguration bewirkt, dass I I für alle Dateien, die im Unterverzeichnis, das mittels der URI /embperl/x angesprochen wird, liegen, als content handler aufruft. I kann dann die Datei entsprechend bearbeiten und das Ergebnis zum Browser schicken. Eine andere Möglichkeit ist, alle Dateien mit einer bestimmten Endung von Embperl bearbeiten zu lassen. Eine Konfiguration dafür würde wie folgt aussehen: SetEnv EMBPERL_DEBUG 2285 SetHandler perl-script PerlHandler HTML::Embperl Options ExecCGI AddType text/html .epl B: Wenn I mit C übersetzt ist, darf I B beim Starten des Server geladen werden! =head2 Andere Arten Embperl zu nutzen Embperl kann ebenso von der Befehlszeile aus aufgerufen werden oder als normales CGI Skript ausgeführt werden. Weiterhin können andere Perlprogramme oder -module es direkt aufrufen. Der Aufruf von der Befehlszeile sieht folgendermaßen aus (erste Zeile Unix, zweite Zeile Windows): C C =over 4 =item B Datei welche von Embperl bearbeitet werden soll. =item B Optional. Hat die selbe Bedeutung wie die Umgebungsvariable B eines CGI Skripts. B beinhaltet alles nach dem ersten "?" in der URL. B sollte URL kodiert sein. Default ist kein query_string. =item B<-o outputfile> Optional. Gibt den Dateinamen an, in den das Ergebnis geschrieben wird. Default ist die Standardausgabe. =item B<-l logfile> Optional. Name der Logdatei. Default ist C. =item B<-d debugflags> Optional. Gibt an, welche Debuginformationen in die Logdatei geschrieben werden. (siehe L<"EMBPERL_DEBUG"> für mögliche Werte) =back Um I als B zu nutzen, müssen Sie die Datei C (bzw. C unter Windows) in Ihr CGI Verzeichnis kopieren (oft C). Zum Aufrufen verwenden Sie die URL http://www.domain.de/cgi-bin/embpcgi.pl/uri/ihres/embperl/dokuments Die extra Pfadinformationen die C übergeben werden, geben dabei den Ort des Embperl Dokuments an. Unter Apache kann C auch als Handler definiert werden: Action text/html /cgi-bin/embperl/embpcgi.pl B Die Datei embpexec.pl darf aus Sicherheitsgründen nicht mehr als CGI Skript genutzt werden! B: Um die Sicherheit von CGI Skripten sicher zustellen, empfiehlt es sich mittels L den Zugriff zu beschränken. =head2 Embperl aus Embperl Dokumenten oder anderen Perl Programmen/Modulen aufrufen Die Funktion C kann genutzt werden, um I aus anderen Perlmodulen oder -programmen aufzurufen. Ebenso ist es möglich andere Dokumente (z.B. Kopf- oder Fußzeilen) in Embperlseiten einzufügen. Die Kurzform müssen lediglich Dateinamen und ggf. Parameter für das aufzurufende Dokument als Argumente angegeben werden: Execute ($filename, @params) ; Die Langform erwartet eine Referenz auf einen Hash als Argument: Execute (\%params) ; Die Kurzform entspricht folgendem Aufruf in der Langform: Execute ({inputfile => $filename, param => \@params}) ; Parameter für die Langform sind: =over 4 =item B Mittels C wird die Datei angegeben, die von I bearbeitet werden soll. Ist der Parameter C ebenso vorhanden, sollte C einen eindeutigen Namen spezifizieren. Jedesmal wenn I den selben Namen sieht, geht es davon aus, daß die Quelle die selbe ist und verwendet den selben Packagenamen, sowie compiliert die Perlteile nur wenn C sich ändert oder undefiniert ist. =item B Ruft die durch diesen Parameter angegebene Funktion auf (siehe auch [$ B<"sub"> $]). Momentan muß die Funktion entweder in der selben Embperldatei definiert sein oder die Embperldatei muß vorher importiert worden sein. =item B Referenz auf einen Skalar, welcher den Quellentext enthält. B sollte ebenso angegeben werden, um die Quelle zu benennen. Der Name kann dabei beliebiger Text sein. =item B Zeitpunkt der letzten Änderung des Quellentextes. Der Quellentext wird nur dann neu übersetzt, wenn sich B ändert oder wenn B C ist. =item B Datei, in die die Ausgabe geschrieben wird. Ist keine Datei angegeben, wird die Standardausgabe benutzt. =item B Referenz auf einen Skalar, in welchen die Ausgabe geschrieben werden soll. =item B Ein Wert von Null veranlasst I die Seite nicht auszuführen, sondern alle darin enthaltenen Funktionen zu definieren. Dies ist nötig, um sie mittels des B Parameters der Execute Funktion aufrufen zu können oder als Vorbereitung für einen späteren Import. Ein Wert von Eins veranlasst I die Seite nicht auszuführen, sondern alle darin enthaltenen Funktionen zu definieren B diese in das aktuelle Package zu importieren. Siehe auch C<[$ sub $]> Metacommand. =item B Dieser Wert gibt an, ob and wann das "Cleanup" des Packages ausgeführt werden soll. (Siehe auch L<"Variablen Gültigkeitsbereich und Cleanup">) =over 4 =item B Es wird kein Cleanup ausgeführt. =item B oder nicht spezifiziert Unter I wird das Cleanup erst ausgeführt, B die Verbindung zum Client beendet wurde, auch wenn C mehrfach während eines Request aufgerufen wird. In allen anderen Fällen wird das Cleanup sofort ausgeführt. =item B Cleanup wird sofort ausgeführt. =back =item B Eine Referenz auf ein Array, um dem aufgerufenen Dokument Parameter zu übergeben. Beispiel: HTML::Embperl::Execute(..., param => [1, 2, 3]) ; HTML::Embperl::Execute(..., param => \@parameters) ; Über das Array C<@param> kann die aufgerufene Seite auf die Parameter zugreifen. Siehe F aus der Embperl Distribution für ein detailliertes Beispiel. =item B Kann benutzt werden, um die beiden Embperlvariablen L<@ffld> und L<%fdat> zu setzen. =item B Gibt die erste Zeilennummer der Quellendatei an (Default: 1) =item B Wie L<"EMBPERL_OPTIONS"> (siehe unten), außer für Cleanup. B B sollte gesetzt werden, wenn die Formulardaten eines B Request bereits von der Standardeingabe eingelesen wurden, ansonsten versucht C die Daten ein zweites Mal einzulesen, was dazu führt, das der Request hängt. =item B Wie L<"EMBPERL_DEBUG"> (siehe unten). =item B Wie L<"EMBPERL_ESCMODE"> (siehe unten). =item B Wie L<"EMBPERL_PACKAGE"> (siehe unten). =item B Wie L<"EMBPERL_VIRTLOG"> (siehe unten). Wenn B gleich B ist, wird die Embperl Logdatei gesendet. =item B Wie L<"EMBPERL_ALLOW"|"EMBPERL_ALLOW (ab 1.2b10)"> (siehe unten) =item B Wie L<"EMBPERL_PATH"|"EMBPERL_PATH (ab 1.3b1)"> (siehe unten) =item B Die URI des Request. Wird nur für Virtlog Feature benötigt. =item B Wie L<"EMBPERL_COMPARTMENT"> (siehe unten). =item B Wie L<"EMBPERL_INPUT_FUNC"> (siehe unten). Zusätzlich ist es möglich eine Codereferenz anzugeben, die entsprechende Funktion wird dann als Eingabefunktion aufgerufen. Ebenso ist die Angabe einer Arrayreferenz möglich, wobei das erste Element dann die Codereferenz enthält und alle weiteren Elemente als Parameter der Funktion übergeben werden. =item B Wie L<"EMBPERL_OUTPUT_FUNC"> (siehe unten). Zusätzlich ist es möglich eine Codereferenz anzugeben, die entsprechende Funktion wird dann als Ausgabefunktion aufgerufen. Ebenso ist die Angabe einer Arrayreferenz möglich, wobei das erste Element dann die Codereferenz enthält und alle weiteren Elemente als Parameter der Funktion übergeben werden. =item B Wie L<"EMBPERL_COOKIE_NAME"> (siehe unten). =item B Wie L<"EMBPERL_COOKIE_PATH"> (siehe unten). =item B Wie L<"EMBPERL_COOKIE_DOMAIN"> (siehe unten). =item B Wie L<"EMBPERL_COOKIE_EXPIRES"> (siehe unten). =item B Erwartet eine Referenz auf ein Array. Nach der Rückkehr der Funktion enthält das Array alle Fehlermeldungen der aufgerufenen Seite, soweit welche aufgetreten sind. =back =head2 Hilfsfunktionen für Execute =over 4 =item B Diese Funktion dient dazu, die Logdatei sowie die Debugflags, die für die folgenden Aufrufe von C genutzt werden, zu setzen. Es kann immer nur eine Logdatei existieren, der Pfad kann jedoch jederzeit geändert werden. =item B Durchsucht alle Umgebungsvariablen (B<%ENV>) und setzt B<%params> für die Benutzung von C. Alle Embperl Konfigurationsvariablen, außer EMBPERL_LOG, werden erkannt. =back =head2 Beispiele für Execute: # Quellentext steht unter /pfad/zu/seite.html und # das Ergebnis wird in /pfad/zu/ausgabe.html geschrieben HTML::Embperl::Execute ({ inputfile => '/pfad/zu/seite.html', outputfile => '/pfad/zu/ausgabe.html'}) ; # Quellentext steht in einem Skalar und das Ergebnis wird auf der # Standardausgabe ausgegeben # Vergessen Sie nicht, mtime zu ändern wenn $src sich ändert $src = 'Seite [+ $no +]' ; HTML::Embperl::Execute ({ inputfile => 'irgendein name', input => \$src, mtime => 1 }) ; # Quellentext steht in einem Skalar und das Ergebnis wird in # einen zweiten Skalar geschrieben my $src = 'Seite [+ $no +]' ; my $out ; HTML::Embperl::Execute ({ inputfile => 'anderer name', input => \$src, mtime => 1, output => \$out }) ; print $out ; # Einfügen eines gemeinsammen Kopfes in eine Embperlseite # der sich in /pfad/zu/kopf.html befindet [- Execute ('/pfad/zu/kopf.html') -] =head1 Runtime Konfiguration Die Runtimekonfiguration wird mittels Umgebungsvariablen eingestellt, entweder auf der Befehlszeile oder in der Webserverkonfigurationsdatei. Die meisten HTTP Server verstehen SetEnv Wenn Sie I und I nutzen, funktioniert auch PerlSetEnv Der Vorteil von C gegenüber C ist, daß unterschiedliche Werte für verschiedene Verzeichnisse oder virtuelle Hosts gesetzt werden kann. =head2 EMBPERL_FILESMATCH Wenn vorhanden, werden von I nur Dateien bearbeitet, die der angegebenen B entsprechen. Alle anderen Dateien werden an den Standard Apachehandler weitergereicht. Dies ist nütztlich, um Embperl Dokumente und Nicht-Embperl Dokumente (z.B. Gifs) in einem Verzeichnis abzulegen. EMBPERL_FILESMATCH funktioniert nur unter I. Beispiel: # Nur Dateien mit der Endung .htm werden von Embperl bearbeitet PerlSetEnv EMBPERL_FILESMATCH \.htm$ =head2 EMBPERL_ALLOW (ab 1.2b10) Wenn vorhanden, werden von I nur Dateien bearbeitet, die der angegebenen B entsprechen. Die Bearbeitung anderer Dateien wird mit dem Fehlercode FORBIDDEN verweigert. Dies ist vorallem in CGI Mode nützlich, um die Serversicherheit zu erhöhen. =head2 EMBPERL_PATH (ab 1.3b1) Hier kann eine durch Semikolon (unter Unix auch Doppelpunkte) getrennte Liste von Verzeichnissen angegeben werden, die I durchsucht, wenn eine Datei verabeitet werden soll und die Datei keine Pfadangaben enthält. =head2 EMBPERL_COMPARTMENT Gibt dem Namen des Compartments für die Opcodemaske an. (Siehe L<"(Sichere-)Namensräume und Opcode Restriktionen"> für Details.) =head2 EMBPERL_ESCMODE Gibt den Anfangswert für L<"$escmode"> an (siehe unten). =head2 EMBPERL_LOG Pfad für die Embperl Logdatei. Diese enthält Informationen darüber, wie Embperl den eingebetteten Perlcode ausführt. Wieviele Informationen geschrieben werden hängt von der Einstellung der Debugflags ab (siehe L<"EMBPERL_DEBUG">). Default ist F. B Unter I muß C mittels C gesetzt werden, damit es schon bei Serverstart wahrgenommen wird. =head2 EMBPERL_PACKAGE Name des Packages in dem der Code ausgeführt wird. Wenn kein Package angegeben ist, erzeugt Embperl für jede Datei einen eindeutigen Packagenamen. Dies verhindert, dass globale Variablen zweier Skripts miteinander in Konflikt geraten. =head2 EMBPERL_VIRTLOG Gibt eine URI an, unter der die Embperl Logdatei mittels des Browsers abgerufen werden kann. Dieses Feature ist gesperrt, wenn C nicht gesetzt ist. Siehe auch L<"EMBPERL_DEBUG"> und L<"dbgLogLink"> für ein Beispiel, wie dies in Webserverkonfiguration eingestellt werden kann. =head2 EMBPERL_OPTIONS Diese Bitmaske gibt diverse Optionen für die Ausführung von Embperl an. Damit können bestimmte Features von I gesperrt oder freigegeben sowie das Verhalten von Embperl beeinfluß werden. Um mehrere Optionen anzugeben sind die Werte zu addieren. =over 4 =item optDisableVarCleanup = 1 Cleanup wird nicht nach jedem Request ausgeführt. =item optDisableEmbperlErrorPage = 2 Führt dazu, dass I im Fehlerfall nicht seine eigene Fehlerseite anzeigt, sondern so viel wie möglich der Seite. Fehler werden lediglich in die Logdatei geschrieben. Ohne diese Option sendet I seine eigne Fehlerseite, die alle Fehler, die aufgetreten sind, anzeigt. Wenn L<"dbgLogLink"> gesetzt ist,werden alle Fehler als Links auf die Logdatei dargestellt. Diese Option hat keinen Effekt, wenn L<"optReturnError"> gesetzt ist. =item optReturnError = 262144 Wenn diese Option gesetzt ist, sendet Embperl keine Fehlerseite, sondern liefert den Fehlercode an Apache oder das aufrufende Programm zurück. Unter I ermöglicht dies die C Anweisung zu benutzen, um eine eigene Fehlerseite anzuzeigen. =item optSafeNamespace = 4 Veranlasst I den Code in einem sicheren Namensraum auszuführen. Dadurch ist es nicht mehr möglich auf Daten außerhalb des Packages zuzugreifen. (Siehe L<"(Sichere-)Namensräume und Opcode Restriktionen"> für Details.) =item optOpcodeMask = 8 Veranlasst I eine Operator Maske anzuwenden. Dadurch ist es möglich, bestimmte, unsichere, Opcodes zu sperren. (Siehe L<"(Sichere-)Namensräume und Opcode Restriktionen"> für Details.) =item optRawInput = 16 Veranlasst I den Quellentext unangetastet zu lassen, lediglich Return-Zeichen werden entfernt, da Perl 5.004 dies nicht akzeptiert. Diese Option sollte aufjeden Fall gesetzt werden, wenn Sie Ihren Quellentext mit einem Ascii Editor schreiben. Wenn Sie jedoch einen (WYSIWYG) HTML-Editor benutzen, welcher unerwünschte HTML Tags in den Perlcode einfügt und spezielle Zeichen HTML-Kodiert (z.B. '<' als <), dann sollten Sie diese Option B setzen. I konvertiert dann das HTML automatisch in den Perlcode zurück, wie Sie ihn im Editor eingegeben haben. =item optEarlyHttpHeader = 64 Normalerweise werden die HTTP Header von I gesendet, nachdem der Request bearbeitet wurde. Dies ermöglicht, während der Bearbeitung des Dokuments beliebige Header zu setzen und Embperl kann den C Header berechnen. Außerdem erzeugt Embperl eine Fehlerseite, statt des Dokuments, falls Fehler auftreten. Um dies zu erreichen, wird die Ausgabe zwischengespeichert bis der Request abgearbeitet wurde, dann werden zuerst die HTTP Header und danach das Dokument gesendet. Dieses Flag führt dazu, das die Header sofort, vor der Ausführung des Dokuments, gesendet werden und die Ausgabe nicht gepuffert ist. =item optDisableChdir = 128 Ohne diese Option setzt I das aktuelle Verzeichnis entsprechend dem Verzeichnis, in dem das ausgeführte Skript steht. Dies ermöglicht es innerhalb der Embperlseite relative Pfadnamen zu benutzen. Da der Verzeichniswechsel, u.U. einige Zeit in Anspruch nimmt, kann er mit dieser Option verhindert werden. =item optDisableFormData = 256 Diese Option verhindert das Setzen von %fdat und @Z<>ffld. I ignoriert die gesendeten Formulardaten vollständig. =item optDisableHtmlScan = 512 Wenn gesetzt, verhindet diese Option das Bearbeiten B HTML Tags vollständig. I sucht dann nur noch nach <[+/-/!/$ ... $/!/-/+]> Blöcken. Dies schaltet dynamische Tabellen, Formularbearbeitung usw. ab. =item optDisableInputScan = 1024 Verhindert die Bearbeitung aller Eingabe Tags. ( Das C