Praktikum Internet-Technologie

von Prof. Jürgen Plate

Praktikum Internet-Technologie

Anmerkung: Es werden je nach Anzahl der Teilnehmer nicht alle Aufgaben bearbeitet oder einzelne Aufgaben auf verschiedene Gruppen verteilt. Außerdem wird in der Regel zusätzlich ein gemeinsames Projekt entwickelt und bearbeitet.

Vorbereitung

Informieren Sie sich über den Namen Ihres Rechners. Ausserdem spielt der Server blackhole bei einigen Aufgaben eine Rolle.

Die Domain für alle Rechner ist da.private.fhm.edu. Dabei steht "da" für den Standort Dachauerstr./Lothstr. und "private" bedeutet, daß der Rechner im privaten (von aussen nicht erreichbaren) Netz steht.

Das Einloggen erfolgt in der grafischen Benutzeroberfläche GNOME mit dem XDM. Über Ihre Benutzeraccounts werden Sie im Praktikum informiert. 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.

Das Abmelden erfolgt bei GNOME über das Menü Aktionen am oberen Bildschirmrand: Aktionen --> Abmelden. Das Herunterfahren des Rechners erfolgt im Login-Bildschirm (XDM), allso nach vorherigem Abmelden, über Aktionen --> Herunterfahren.

Anwendung von Systemdiensten

Es gibt viele Rechner, die Webcam-Bilder erzeugen. Einige Beispiele dafür sind:

Das Meteorologische Institut der UNI München
(www.meteo.physik.uni-muenchen.de/mesomikro/webcam/stadt/camera.jpg)
Blick vom Dach der FH aus
(141.39.245.118/jpg/hugesize.jpg)
Marienplatz
(webcam.portalmuc.de/images/webcam/webcam_marienplatz.jpg)
Zugspitze
(www.zugspitze.de//livecamsdata/k3bildww.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:

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.

Das crontab-Kommando

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.

Neben dem Crontab-Kommando gibt es je nach Linux Distribution auch graphische Tools zum Editieren der Crontab-Datei, z.B.: gcrontab (Gnome) oder kcrontab.

CGI-Schnittstelle

Der Apache-Webserver ist auf Ihrem Rechner installiert. Unter Ubuntu befinden sich die beiden Verzeichnisse, auf die es ankommt anverschiedenen Stellen: Damit die Verzeichnisse leichter erreichbar sind, und von Ihnen auch mit Dateien gefüllt werden können, sollten Sie folgende Kommandos eingeben. Als Beispieluser dient hier 'mond', Sie müssen natürlich Ihre Userkennung verwenden:
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 verlassen
Sie 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).

Aufgabe:

Schreiben Sie ein CGI-Programm in Perl. Das Programm soll die Eingaben des unten aufgeführten Formulars entgegennehmen, die Formulardaten an eine Log-Datei anhängen und den folgenden dynamisch erzeugten Text ausgeben:

Bestätigung

<Vorname> <Name>, Matrikelnummer <Matrikelnr.>, 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>



Unterschrift __________________________________

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 Formular zur Aufgabe:

<table border=2 width="40%" cellpadding=3 cellspacing=0 bgcolor=#CCCCCC>
<tr><td>
<form action=/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>Matrikelnummer: </td><td><input type=text name="MatNr" 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>

Name:
Vorname:
Matrikelnummer:
Punkte:
 

Beachten Sie, daß das Formular noch in eine korrekte HTML-Seite eingebettet werden muß.

Datenbankanwendung

Bei webhosting.info gibt es eine CSV-Datei, welche die Zuordnung einer IP-Nummer zu einem Land ermöglicht. Diese CSV-Datei ( ip-to-country.csv.zip) besteht aus vier Feldern:

Die Struktur der Datei entspricht folgendem Beispiel:
"0033996344","0033996351","GB","GBR","UNITED KINGDOM"
"0050331648","0083886079","US","USA","UNITED STATES"
"0094585424","0094585439","SE","SWE","SWEDEN"
...
Hinweis: Alle IP-Adressen sind als 32-Bit-Ganzzahlen Dezimal gespeichert, also nicht wi üblich als "Dotted Quad".

Für den Import in eine Datenbank sollte in der Datenbank eine Tabelle mit den folgenden Feldern (Spalten) angelegt werden:

Feld Datentyp Beschreibung
IP_FROM numerisch (long integer) Beginn eines IP-Adressbereichs
IP_TO numerisch (long integer) Ende eines IP-Adressbereichs
COUNTRY_CODE2 CHAR(2) 2-Buchstaben-Ländercode nach ISO 3166.
COUNTRY_CODE3 CHAR(3) 3-Buchstaben-Ländercode nach ISO 3166.
COUNTRY_NAME VARCHAR(50) Ländername nach ISO 3166

Ist die Datenbank angelegt, kann man mit demm folgenden SQL-Kommando nach dem Land zu einer IP-Adresse IP suchen:

SELECT * FROM <TableName> 
    WHERE IP_FROM <= 'IP' AND IP_TO >= 'IP';

Aufgabe 1

Formulieren Sie die SQL-Anweisungen zum Anlegen der Datenbank namens "IPCountry" sowie zum Anlegen einer Tabelle namens "IPtoC" mit den oben angegebenen Feldern. Fügen Sie zur Tabelle noch ein Feld "ID" (integer, autoincrement, nicht NULL, Primärschlüssel) hinzu.

Aufgabe 2

Schreiben Sie ein Perl-Programm, das die CSV-Datei einliest und für jede Zeile:

Für das Öffnen der Datenbank-Verbindung schreiben Sie eine Funktion open_db, die ein Datenbankhandle $dbh zurückgibt. Datenbank-User und sein Passwort sollen aus einer Datei eingelesen werden. Die Befehle zum Öffnen der Datenbank lauten:
my $dsn = 'DBI:mysql:IPCountry:localhost';        # DBI/Modul/Datenbank/Host
my $dbh = DBI->connect($dsn, $db_user_name, $db_password,
                       {RaiseError => 1, AutoCommit => 1});
In der Funktion sollen auch alle möglicherweise auftretenden Fehler behandelt werden.

Zum Speichern eines Datensatzes verwenden Sie eine Funktion store_db, die als Eingabeparameter das Datenbankhandle $dbh und eine Zeile aus der CSV-Datei übernimmt. Auch hier sind etwa auftretende Fehler in der Funktion zu behandeln.

Aufgabe 3

Schreiben Sie ein CGI-Script, das

Zum Abfragen eines Datensatzes verwenden Sie eine Funktion ask_db, die als Eingabeparameter das Datenbankhandle $dbh und die IP-Adresse übernimmt. Etwa auftretende Fehler sind in der Funktion zu behandeln.

Anmerkungen:

  1. Um eine IP-Adresse der Form A.B.C.D in einem IP-Nummer umzurechen, kann folgende Formel verwendet werden:
    IP-Nummer = A * (256*256*256) + B * (256*256) + C * 256 + D
    
    bzw.
    IP-Nummer = A * 16777216 + B * 65536 + C * 256 + D
    
  2. Bei MySQL kann man sich ggf. die Umrechnung sparen und die Function inet_aton() verwenden:
    SELECT * FROM <TableName> 
        WHERE IP_FROM <= INET_ATON('IP') AND IP_TO >= INET_ATON('IP');
    
  3. Unten auf dem Formular (was gleichzeitig Ergebnisausgabe ist) muss auf die Herkunft der Datenbank hingewiesen werden (kleine Schrift genügt):
    "This Service uses the IP-to-Country Database
     provided by WebHosting.Info (http://www.webhosting.info),
     available from http://ip-to-country.webhosting.info."
    
Letzte Aktualisierung: 03. Jun 2009