![]() |
Praktikum Internet-Technologievon Prof. Jürgen Plate |
Die Domain für alle Rechner ist da.private.hm.edu. Dabei steht "da" für den Standort Dachauerstr./Lothstr. und "private" bedeutet, daß der Rechner im privaten (von aussen nicht erreichbaren) Netz steht.
Für einige Aufgaben ist die Root-Berechtigung notwendig.
Der Wechsel in die Rolle des Superusers erfolgt mit dem Kommando
sudo. Um eine Root-Shell zu erlangen, geben Sie demnach
sudo bash ein. Der Login auf anderen Rechnern erfolgt mittels
der Secure Shell (ssh <user>@<rechner>) und
zum Kopieren wird Secure Copy (scp) verwendet.
Der Apache-Webserver ist auf allen Rechnern installiert. Unter Ubuntu befinden sich die beiden Verzeichnisse, auf die es ankommt anverschiedenen Stellen:
sudo bash # root-Berechtigung erlangen chown -R mond /var/www /usr/lib/cgi-bin # Verzeichnisse an user 'mond' uebergeben chmod 775 /var/www /usr/lib/cgi-bin # Zugriffsrechte setzen ln -s /var/www www # Document-Root nun per Link leicht erreichbar ln -s /usr/lib/cgi-bin cgi-bin # das Gleiche fuer cgi-bin exit # root-bash wieder verlassenSie können nun vom Homedirectory direkt in die beiden Verzeichnisse des Webservers wechseln und dort auch Dateien anlegen. Denken Sie daran, dass Programme im Verzeichnis cgi-bin immer erst Execute-Berechtigung bekommen müssen (chmod 755 proggi.pl).
Das Meteorologische Institut der UNI München
(www.meteo.physik.uni-muenchen.de/mesomikro/webcam/stadt/camera.jpg)
Hof des Deutschen Museums
(http://www.deutsches-museum.de/fileadmin/Content/data/webcam/mushof_f.jpg)
Marienplatz in München
(webcam.portalmuc.de/images/webcam/webcam_marienplatz.jpg)
Isar in München
(www.wwa-webcams.de/m/isar-plan/isar-plan.jpg)
Allianz-Arena
(webcam.allianz-arena.de/aa-cam-01/full_2.jpg)
Zugspitze
(www.zugspitze.de//livecamsdata/k3bildww.jpg)
Hamburger Hafen
(http://www.hafen-hamburg.de/sites/default/files/images/webcam/cta.jpg)
Mit dem Perl-Modul LWP::Simple ist es möglich, innerhalb eines Programms mit dem Befehl getstore $url, $file; eine durch $url spezifizierte Datei von einem fernen Server zu holen und unter dem Dateinamen $file (ggf. mit Pfadangabe im Dateinamen) auf dem lokalen Rechner abzuspeichern. Ein Programmfragment sieht dann etwa folgendermaßen aus:
#!/usr/bin/perl use LWP::Simple; . . . getstore $url, $file; . . .Schreiben Sie ein Perl-Programm, das ein Bild von einer beliebigen Webcam holt und lokal abspeichert. Dabei sollen rotierend immer 4 Bilder (b1.jpg - b4.jpg) zur Verfügung stehen, wobei immer b1.jpg das älteste und b4.jpg das jüngste Bild ist. Die Bilder müssen in der "Document-Root" des Servers abgelegt werden. Da das Skript kein CGI-Skript ist, sollte es sich in Ihrem Heimatverzeichnis befinden.
Hinweise:
rename($oldname, $newname) or warn "Couldn't rename $oldname to $newname: $!\n";
unlink($filename) or warn "Couldn't unlink $filename: $!\n";
Erzeugen Sie eine einfache HTML-Seite (ebenfalls in der "Document-Root" des Servers), in der alle 4 Bilder untereinander dargestellt werden und testen Sie damit die Funktion Ihres Programms.
Das Programm soll nun nicht manuell, sondern per crontab aufgerufen werden - und zwar jede Minute. Erzeugen Sie einen entsprechenden Crontab-Eintrag und testen Sie die Funktion des Gesamtsystems.
| crontab datei | Fügt die Jobs in datei zur Crontab Datei des Benutzers hinzu. |
| crontab -r | Löscht die Crontab-Datei des Benutzers. |
| crontab -l | Listet die Jobs des Benutzers auf. |
| crontab -e | Erlaubt das Editieren der Crontab-Datei. |
Ein einzelner Job wird durch eine Zeile definiert, die das Zeitintervall und das genaue Kommando vorgibt. Die einzelnen Felder in der Datei sind durch Leerzeichen oder durch einen Tabulator getrennt.
| Minute | Stunde | Tag | Monat | Wochentag | Kommando |
| 0-59 | 0-23 | 1-31 | 1-12 | 0-6 | .... |
Bei der Angabe der Zeit sind einzelne Zahlen, Intervalle (z.B.: 3-8), Aufzählungen (z.B.: 1,3,5), sowie "*" für alle, möglich.
Beispiel: Die folgenden Zeilen definieren zwei Jobs:
# mm hh DoM MM DoW command # 30 * * * * /bin/foo 30 23 * * * /bin/bar > /dev/null 2>&1
Immer wenn der Minutenzeiger auf 30 steht wird das Programm /bin/foo gestartet. Und um 23:20 wird der Befehl /bin/bar ausgeführt. Dabei werden alle Ausgaben des Befehls ins Nirvana umgeleitet.
Der Server soll einige Informationen über den Rechner liefern, auf dem er läft. Damit nicht jeder die Infos abrufen kann, wird zuerst ein Passwort abgefragt. Damit ergibt sich der im Folgenden skizzierte Dialog zwischen Client und Server:
| Client | Server |
|---|---|
| [Verbindungsaufnahme] | Sebigbos 0.1 Nice to meet you PASS |
| [Passwort] | falls Passwort akzeptiert wird: OK sonst: FAIL [Verbindungsabbruch] |
| [Kommando] | [Daten zum Kommando] |
Die letzte Zeile kann sich beliebig oft wiederholen. Als Kommandos des Client sond möglich:
| Kommando | Gewünschte Daten |
|---|---|
| STAT | Ausgabe der Kommandos: hostname uname -or uptime ifconfig |
| TOP (Prozesse) | Ausgabe des Kommandos: top -b -n 1 |
| NET (TCP/IP-Verbindungen) | Ausgabe des Kommandos: netstat -antu |
| QUIT | "Bye" [Beenden der Verbindung] |
Der Server soll seine Aktivitäten auf dem Bildschirm protokollieren, indem er bei Verbindungsaufnahme die Client-IP ausgibt (print "Anfrage von ", $client->peerhost(), ":", $client->peerport(), "\n";) und dann den Dialog anzeigt.
Schreiben Sie nun einen Client, der eine Verbindung zum Server aufbaut, sich authentisiert und dann abhüngig von der Kommandozeilenoption eines oder mehrere der oben aufgeführten Abfragekommandos ausführt. Als Kommandozeilenoptionen kommen beliebige Kombinationen von -s (STAT), -t (TOP) und -n (NET) in Frage. Danach beendet die Client die Verbindung (QUIT).
Das Passwort, die Portnummer(n) und die Serveradresse werden fest im Programm als Konstante verankert. zum Beispiel:
# --------------- Konfiguration -------------------- use constant PASSWD => "lassmichrein"; use constant MYPORT => 6666; use constant SERVER => "lc1"; # nur beim Client # --------------- Konfiguration --------------------
Hinweis: Damit der Client erkennen kann, wann eine (mehrzeilige) Antwort vom Server zu Ende ist, sollen Sie sich eine Endekennung für die Nachrichten überlegen.
Damit sich die einzelnen Berabeitungsgruppen nicht gegenseitig behindern, werden zu Beginn des Praktikums die Portnummern für jede Gruppe vergeben.
http://lc1/~plate/index.html
http://lc1/~plate/cgi-bin/hello.cgi
Bestätigung<Vorname> <Name>, E-Mail-Adresse <E-Mail-Adr.>, hat am Praktikum zur Vorlesung Internet Technologie teilgenommen. Er hat <Punkte> erreicht. Die Mindestpunktzahl für den Schein wurde <[nicht] erreicht>.
München, den <Datum>
|
Installieren Sie Formular und Script auf einem der Server.
Das Formular verwendet die HTTP-Methode POST zur Datenübermittlung.
Die Mindestpunktzahl (20) wird als Konstante im Programm gespeichert.
Die aktuelle Punktzahl wird damit verglichen und dementsprechend
die Ausgabe gesteuert.
Die Maximalpunktzahl beträgt 50 und das Programm soll prüfen,
ob die eingegebene Punktzahl im Bereich 0..50 liegt. Das Datum ist mittels
der Perl-Funktionen time() und localtime() zu ermitteln
und entsprechend formatiert auszugeben.
Das Formular zur Aufgabe (Achtung: Bei "action" den Pfad ergänzen/ändern!):
<table border="2" cellpadding="3" cellspacing="0" bgcolor="#CCCCCC">
<tr><td>
<form action="http://lc1/~USER/cgi-bin/prakt.pl" method="post">
<table border="0" cellpadding="3">
<tr><td>Name: </td><td><input type="text" name="Name" size="30" maxlength="60"></td></tr>
<tr><td>Vorname: </td><td><input type="text" name="Vorname" size="30" maxlength="60"></td></tr>
<tr><td>E-Mail-Adresse: </td><td><input type="text" name="EMail" size="15" maxlength="15"></td></tr>
<tr><td>Punkte: </td><td><input type="text" name="Punkte" size="15" maxlength="15"></td></tr>
<tr><td> </td><td><input type="submit" name="submit" value="Absenden">
<input type=reset name="reset" value="Rücksetzen"></td></tr>
</table>
</form>
</td></tr></table>
Beachten Sie, daß das Formular noch in eine korrekte HTML-Seite eingebettet werden muß.
Auf der Platte von Studenten (aber auch bei Dozenten) sammeln sich im Lauf der Zeit zahlreiche mehr oder weniger nützliche Textdokumente an, beispielsweise Skripten, Übungsaufgaben, Ausarbeitungen, Hintergrundinfos, Datenblätter, Programmlistings und vieles mehr. Diese Dokumente liegen in den unterschiedlichsten Formaten vor - vom reinen ASCII-Text ünber HTML, PDF bis hin zu Office-Formaten, ZIP-Dateien oder Bildern.
Es soll eine MySQL-Datenbank entwickelt werden, die bibliografische Daten zu diesen Dokumenten speichert und für jedes Dokument eine Reihe von Schlagworten. Die Dokumente selbst werden nicht in der Datenbank gespeichert, sondern bleiben unberührt. Unter Berücksichtigung dessen, was Sie über Datenbanken in der Vorlesung gehört haben, ergeben sich drei Tabellen:
Die erste Tabelle muss auf jeden Fall enthalten:
Entwerfen Sie "CREATE TABLE"-Anweisungen für die drei o. g. Tabellen. Wir werden dann aus allen Entwürfen einen zusammenstellen bzw. auswählen und mit diesem die reale Datenbank erstellen. So können im Praktikum alle Gruppen auf eine gemeinsame Datenbank zugreifen.
Erstellen Sie das Web-Interface als CGI-Script in Perl. Das Script gibt entweder ein Eingabeformular aus (wenn keine Formulardaten vorliegen) oder wertet die Formulareingaben aus. Achten Sie insbesondere auf die Prüfung der Eingabedaten (Plausibilität, Vollständigkeit usw.). Welche Einträge werden sinnvollerweise als Auswahlmenü angeboten? Wie realisieren Sie die Möglichkeit, prinzipiell beliebig viele Schlagworte einzugeben?
Sind die Eingabedate in Ordnung, sollen sie durch das Script in die Datenbank eingetragen werden. Sofern die Date nicht schon im Dokumenten-Verzeichnisbaum existiert, wird ein Upload-Formular ausgegeben, um das Hochladen der Datei zu ermöglichen. Um Namenskollisionen zu vermeiden erhält die Datei einen neuen, einzigartigen Namen, der nach erfolgreichem Upload zusammen mit dem ursprünglichen Namen in der Datenbank abgelegt wird. Überlegen Sie, wie Sie die beiden Formular-Transaktionen miteinander verknüpfen.
Erstellen Sie ein einfache Suchformular für Datenbankabfragen. Abgefragt werden können (Teil-)-Strings alle Felder der ersten Tabelle und natürlich Schlagworte. Orientieren Sie sich bei der Ergebnis-Ausgabe am Output diverser Suchmaschinen: Titel als Link, darunter die Bibliografie-Angaben.
Versuchen Sie dann, logische Verknüpfungen der Suchanfrage zu realisieren und überlegen Sie, wie man ein Ranking der Suchergebnisse gestalten könnte.