Vortrag: mod_cgi und Pipes Stephan Brumme 19. Juni 2001 Matrikelnr. 702544, 4.Semester. mod_cgi und Pipes



Ähnliche Dokumente
Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Einführung in die Programmierung

Klausur in Programmieren

Fakultät Angewandte Informatik Lehrprofessur für Informatik

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Betriebssysteme: Konzepte, Dienste, Schnittstellen (Betriebssysteme und betriebssystemnahe Programmierung)

Einführung in die Scriptsprache PHP

Themen. Apache Webserver Konfiguration. Verzeichnisse für Web-Applikationen. Server Side Includes

2. Semester, 2. Prüfung, Lösung

Java Kurs für Anfänger Einheit 5 Methoden

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

Einführung in die Programmierung (EPR)

Installation und Inbetriebnahme von Microsoft Visual C Express

Übungen zu C++ Kapitel 1

Vorkurs C++ Programmierung

Prozesse. Stefan Janssen. Alexander Sczyrba

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

FB Informatik. Fehler. Testplan

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

1 Vom Problem zum Programm

HTTP-Server. Frank Wübbeling Universität Münster

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Klausur in Programmieren

Objektbasierte Entwicklung

Angewandte Mathematik und Programmierung

Native Zeichenketten (C-Strings)

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

desk.modul : WaWi- Export

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Zählen von Objekten einer bestimmten Klasse

Adressen der BA Leipzig

CGI Programmierung mit Ha. Markus Schwarz

Installation des GeoShop Redirector für Apache (Stand ) ================================================================

Die Programmiersprache C99: Zusammenfassung

Grundlagen. Kapitel 1

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Informatik Repetitorium SS Volker Jaedicke

TimeMachine. Time CGI. Version 1.5. Stand Dokument: time.odt. Berger EDV Service Tulbeckstr München

Unigraphics Schnittstelle entfernen

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

1 Konfigurationsanleitung Hosted Exchange

Gesicherte Prozeduren

Praktikum IKT 3. Semester

Einführung in die C++ Programmierung für Ingenieure

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Informatik I (D-MAVT)

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Windows Explorer Das unbekannte Tool. Compi-Treff vom 19. September 2014 Thomas Sigg

Lokale Installation von DotNetNuke 4 ohne IIS

Matrix42. Matrix42 Cloud Trial Erste Schritte. Version

X Anmelden am System. X System herunterfahren. X Grundlegendes zur Shell. X Das Hilfesystem. X Dateioperationen. X Bewegen im Verzeichnisbaum

Einführung in die Programmierung

Python SVN-Revision 12

Installation mit Lizenz-Server verbinden

Die Installation des GeoShop Redirector für IIS (Internet Information Server, Version 4.0, 5.0 und 6.0) umfasst folgende Teilschritte:

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Beschreibung Installation SSH Server für sicher Verbindung oder Bedienung via Proxyserver. (Version 5.x)

Modellierung und Programmierung 1

Logging, Threaded Server

B E N U T Z E R D O K U M E N TA T I O N ( A L E P H I N O

Graphic Coding. Klausur. 9. Februar Kurs A

Eine Anwendung mit InstantRails 1.7

Backup-Server einrichten

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Multimedia im Netz Wintersemester 2011/12

Deklarationen in C. Prof. Dr. Margarita Esponda

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Version 0.3. Installation von MinGW und Eclipse CDT

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

PHP-Schwachstellen und deren Ausnutzung

Windows 7 Winbuilder USB Stick

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

12. Dokumente Speichern und Drucken

Einführung in die Programmierung für Wirtschaftsinformatik

e-books aus der EBL-Datenbank

Klausur in Programmieren

Oracle: Abstrakte Datentypen:

Tutorium Rechnerorganisation

Dokumentation HIS WebShop CDShop Modul v1.00 Seite 1/10. CDShop Modul v1.00. Dokumentations-Release

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Applet Firewall und Freigabe der Objekte

Einführung in die Programmierung

Excel Funktionen durch eigene Funktionen erweitern.

Informatik Grundlagen, WS04, Seminar 13

Benachrichtigungsmöglichkeiten in SMC 2.6

Programmierkurs Java

Propädeutikum. Dipl.-Inf. Frank Güttler

Linux Prinzipien und Programmierung

COSA. Portal Client Installation JAVA J2SE / JRE Version 1.4.2_09, Stand Copyright

Programmierung in C. Grundlagen. Stefan Kallerhoff

PC-Kaufmann Supportinformation - Proxy Konfiguration für Elster

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

VPN-Verbindung zur Hochschule Hof Mac OS

Qt-Projekte mit Visual Studio 2005

Java - Webapplikationen

Transkript:

mod_cgi und Pipes Was sind Pipes und wie verwendet man sie? Wie kann man Umgebungsvariablen aus einem C-Programm heraus setzen und abfragen? Welche Prozeduren stellt Apache für die Erzeugung von Prozessen, Setzen und Lesen von Umgebungsvariablen und Schreiben und Lesen auf Pipes wie z.b. StdIO zur Verfügung? Stellen Sie vor diesem Hintergrund das Apache Modul mod_cgi vor. www.stephan-brumme.com Anwendungsanalyse Seite 1 von 16

Pipes ƒ eine Pipe (-line) ist ein Kommunikationskanal zwischen zwei Prozessen, der wie eine Datei behandelt wird ƒ STDIN und STDOUT sind vordefinierte Pipes und stellen i.d.r. eine Verbindung zur Tastatur bzw. zum Monitor her ƒ durch Umleitung der Pipes liefert Apache die Daten per STDIN (bei POST- Anfragen) und erwartet die Ausgabe in STDOUT ƒ in C++ kann man bequem mit cin bzw. cout arbeiten www.stephan-brumme.com Anwendungsanalyse Seite 2 von 16

Environment mod_cgi STDIN CGI- Programm STDOUT www.stephan-brumme.com Anwendungsanalyse Seite 3 von 16

Erzeugung von Prozessen und Zugriff auf Pipes mit Apache ƒ Windows: ƒ mittels ap_bspawn_child kann ein neuer Prozess gestartet werden: API_EXPORT(int) ap_bspawn_child(pool *p, int (*func) (void *, child_info *), void *data, enum kill_conditions kill_how, BUFF **pipe_in, BUFF **pipe_out, BUFF **pipe_err) ƒ die Pipes müssen extra mit CreatePipe erzeugt werden, dabei wird auch ihr Typ festgelegt (Zerstörung mit CloseHandle) ƒ Unix: ƒ über spawn_child_core werden neue Prozesse angelegt (wird indirekt von ap_bspawn_child aufgerufen): static pid_t spawn_child_core(pool *p, int (*func) (void *, child_info *), void *data,enum kill_conditions kill_how, int *pipe_in, int *pipe_out, int *pipe_err) www.stephan-brumme.com Anwendungsanalyse Seite 4 von 16

ƒ Pipes werden als Datentyp BUFF behandelt ƒ in buff.c werden Funktionen zum Umgang mit gepufferten I/O-Zugriffen definiert ƒ Schreiben: int ap_read(buff *fb, void *buf, int nbyte) oder int buff_read(buff *fb, void *buf, int nbyte) ƒ Lesen: int ap_write(buff *fb, const void *buf, int nbyte) oder int buff_write(buff *fb, const void *buf, int nbyte) www.stephan-brumme.com Anwendungsanalyse Seite 5 von 16

Zugriff auf Environment-Variablen mit Standard-C-Funktionen ƒ Einbindung von stdlib.h ƒ die komplette Umgebung ist verfügbar mittels: char** environ; // Microsoft: _environ ƒ Auslesen einer Variablen: char* getenv( const char *varname ); liefert Zeiger auf Wert der Variablen zurück, wenn gefunden sonst NULL Beispiel: cout << getenv( REQUEST_METHOD ); ƒ Schreiben: int putenv( const char *envstring ); // MS: _putenv erzeugt oder modifiziert eine Umgebungsvariable, liefert 0 bei Erfolg zurück Beispiel: putenv( REQUEST_METHOD=GET ); www.stephan-brumme.com Anwendungsanalyse Seite 6 von 16

Vortrag: mod_cgi und Pipes Stephan Brumme // Print all environment variables available to a CGI // output is HTML for all these browsers out there // // author: Stephan Brumme // last changes: 06/13/2001 23:58 #include <iostream> // partially open namespace "std" using std::cout; using std::endl; void main(void) { // common HTTP header followed by HTML header cout << "Content-type: text/html" << endl << endl << "<html><body>" << endl; // print all variables by going through the _environ array cout << "<h1>all environment variables:</h1>" << endl; int nindex = 0; while (_environ[nindex]) cout << _environ[nindex++] << "<br>" << endl; } // finish up HTML cout << "</body></html>" << endl; www.stephan-brumme.com Anwendungsanalyse

Vortrag: mod_cgi und Pipes Stephan Brumme

Zugriff auf die Umgebungsvariablen mit Apache.htaccess mit mod_env: ƒ in.htaccess Umgebungsvariablen für CGI-Skripte und SSI modifizieren, Erweiterungen sind im Modul mod_setenvif verfügbar ƒ Setzen: SetEnv Variable Wert ƒ Löschen: UnsetEnv Variable ƒ explizites Durchreichen einer Variablen von der Shell-Umgebung an ein CGI: PassEnv Variable www.stephan-brumme.com Anwendungsanalyse Seite 9 von 16

In einem CGI-Skript über mod_cgi: ƒ Apache erzeugt eine eigene Umgebung, die nur die Variablen enthält, die für den Webserver-Betrieb notwendig sind (Prinzip der Daten-Kapselung) ƒ in den request_rec des neuen CGI-Child-Prozesses werden die Apachespezifischen Variablen gespeichert: ap_add_common_vars(request_rec *r); ap_add_cgi_vars(*request_rec); ƒ daraus wird die gesamte Umgebung konstruiert: char **env = ap_create_environment (request_rec->pool, request_rec->subprocess_env); ƒ Definition der Funktionen zum Zugriff auf Umgebungsvariablen in util_script: API_EXPORT(char **) ap_create_environment(pool *p, table *t); API_EXPORT(void) ap_add_cgi_vars(request_rec *r); API_EXPORT(void) ap_add_common_vars(request_rec *r); www.stephan-brumme.com Anwendungsanalyse Seite 10 von 16

ƒ allgemeine an das CGI-Skript übergebene Variablen (ap_add_common_vars): - im Request mitgelieferte Informationen, z.b. CONTENT_TYPE - Server-spezifische Informationen, z.b. DOCUMENT_ROOT - eventuell User-Informationen, z.b. REMOTE_USER - Betriebssystem-abhängige Variablen, z.b. WINDIR ƒ CGI-bezogene Variablen (ap_add_cgi_vars): - Datenübergabe, z.b. QUERY_STRING - Skript-Eigenschaften, z.b. SCRIPT_NAME www.stephan-brumme.com Anwendungsanalyse Seite 11 von 16

mod_cgi ƒ Modul zum Ausführen eines CGI-Prozesses ƒ Konfiguration in.htaccess oder httpd.conf möglich ƒ Übergabe der Anfragedaten per STDIN oder Umgebung, Rückgabewerte in STDOUT erwartet ƒ Ausführung von CGI-Prozessen außerhalb des HTML-Verzeichnisbaumes möglich (z.b. ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/) ƒ explizite Freigabe bzw. Sperrung von Verzeichnissen erlaubt: <Directory /> Options +ExecCGI </Directory> www.stephan-brumme.com Anwendungsanalyse Seite 12 von 16

ƒ mod_cgi erzeugt eine Logdatei, die alle fehlgeschlagenen CGI-Aufrufe protokolliert ƒ auf jeden Fall werden festgehalten: %% [time] request-line %% HTTP-status CGI-script-filename ƒ scheiterte bereits der Aufruf des Skriptes, so findet man: %% error error-message ƒ ansonsten: % request % response % stdout % stdin www.stephan-brumme.com Anwendungsanalyse Seite 13 von 16

Vortrag: mod_cgi und Pipes Stephan Brumme Start eines Skriptes in mod_cgi.c: static int cgi_child(void *child_stuff, child_info *pinfo) { struct cgi_child_stuff *cld = (struct cgi_child_stuff *) child_stuff; request_rec *r = cld->r; char *argv0 = cld->argv0; int child_pid; #ifdef DEBUG_CGI #ifdef OS2 /* Under OS/2 need to use device con. */ FILE *dbg = fopen("con", "w"); #else FILE *dbg = fopen("/dev/tty", "w"); #endif int i; #endif char **env; RAISE_SIGSTOP(CGI_CHILD); #ifdef DEBUG_CGI fprintf(dbg, "Attempting to exec %s as %scgi child (argv0 = %s)\n", r->filename, cld->nph? "NPH " : "", argv0); #endif ap_add_cgi_vars(r); env = ap_create_environment(r->pool, r->subprocess_env); #ifdef DEBUG_CGI fprintf(dbg, "Environment: \n"); for (i = 0; env[i]; ++i) fprintf(dbg, " %s \n", env[i]); #endif #ifndef WIN32 ap_chdir_file(r->filename); #endif if (!cld->debug) ap_error_log2stderr(r->server); /* Transumute outselves into the script. * NB only ISINDEX scripts get decoded arguments. */ #ifdef TPF return (0); #else ap_cleanup_for_exec(); child_pid = ap_call_exec(r, pinfo, argv0, env, 0); #if defined(win32) defined(os2) return (child_pid); #else /* Uh oh. Still here. Where s the kaboom? There was supposed to be an * EARTH-shattering kaboom! * * Oh, well. Muddle through as best we can... * * Note that only stderr is available at this point, so don t pass in * a server to aplog_error. */ ap_log_error(aplog_mark, APLOG_ERR, NULL, "exec of %s failed", r->filename); exit(0); /* NOT REACHED */ return (0); #endif #endif /* TPF */ } www.stephan-brumme.com Anwendungsanalyse

Quellenverzeichnis ƒ http://httpd.apache.org ƒ Rechenberg et al: Informatik-Handbuch, Carl Hanser Verlag München, 1999 ƒ Bernhard Gröne: Apache Modellierung und Code-Analyse, Vortrag vom 14.6.2001 www.stephan-brumme.com Anwendungsanalyse Seite 16 von 16