Sperrprogramm für WWW-Zugriffe

Das Programm schaltet anhand der Datenbank des Stundenplanes den Zugriff auf den Squid-Cache (andere Programme gleichfalls möglich) für bestimmte Zimmer. Um individuelle Änderungen vorzunehmen, kann über ein Konfigurationsprogramm dieser Standard außer Kraft gesetzt werden. Alle Programmteile sind in Java programmiert und benötigen mindestens JDK1.1.

Installation

die Class-Dateien aus dem Package geisel.stdplan sind in einen Class-Pfad, auf den die Umgebungsvariable CLASSPATH zeigt, zu kopieren. z.B.

/usr/local/jdk1.1.1/classes/geisel/stdplan/Hilf.class
/usr/local/jdk1.1.1/classes/geisel/stdplan/SollManuell.class
/usr/local/jdk1.1.1/classes/geisel/stdplan/SollZustandManuell.class
/usr/local/jdk1.1.1/classes/geisel/stdplan/Parameter.class
/usr/local/jdk1.1.1/classes/geisel/stdplan/JDBC2Table.class
/usr/local/jdk1.1.1/classes/geisel/stdplan/Table.class
/usr/local/jdk1.1.1/classes/geisel/stdplan/Sperren.class

CLASSPATH=/usr/local/jdk1.1.1/classes:/usr/local/jdk1.1.1/lib/classes.zip:.

die Programmdateien sind in den cgi-bin Pfad zu kopieren z.B.

/var/httpd/cgi-bin/Frage.class
(gibt HTML-Formular zur Auswahl der Woche, SG oder Ort)

/var/httpd/cgi-bin/Plan.class
(zeigt anhand der von Frage.class übergebenen Parameter den Stundenplan an)

/var/httpd/cgi-bin/Kabinet.class
(zeigt die Computerraumbelegung oder für berechtigte Adressen die Konfiguration der Sperre)

/var/httpd/cgi-bin/Schalten.class
(trägt die von Kabinet.class übergebenen Parameter in soll.txt und startet den Schaltvorgang)

für jedes dieser Programme ist ein als CGI-Programm ausführbare Datei anzulegen z.B.

/var/httpd/cgi-bin/Schalten.exe

#!/bin/sh
/usr/local/jdk1.1.1/bin/java -DREQUEST_METHOD=$REQUEST_METHOD -DQUERY_STRING=$QUERY_STRING -DREMOTE_HOST=$REMOTE_HOST Schalten

Die CGI-Programme Frage.exe und Kabinet.exe können nun über einen Anker in eine HTML-Seite eingebunden werden. z.B. Frage.exe über einen Frame

<HTML>
<HEAD>
<TITLE>Stundenplan Frame</TITLE>
</HEAD>
<FRAMESET COLS="20%,50%">
<FRAME SRC="/cgi-bin/Frage.exe?Frame" NAME="FRAGE">
<FRAME SRC=PlanFrame.htm NAME="PLAN">
</FRAMESET>
<NoFrame>
Sie haben keinen Frame-f&auml;higen Browser! Bitte verwenden Sie die <a href="Frage.exe">Normalversion</a>
</NoFrame>
</HTML>

welcher aufgerufen wird mit:

<A HREF="/stdplan/program/Frame.htm" target="_top">Akt. Stundenplan</A>
<A HREF="/cgi-bin/Kabinet.exe?" target="_top">Computerraumbelegung</A>

Für den regelmäßigen Schaltvorgang muß die Sperren.class z.B. jede viertel Stunde ausgeführt werden. Unter Unix ist der cron-Dämon hierfür zuständig. In die Steuerungsdatei z.B. root (nicht günstig, da zu hohe Privilegien, besser die vom http-Dämon-Owner) im Pfad /var/spool/cron/crontabs ist folgende Zeile einzutragen:

0,15,30,45 * * * * /usr/local/jdk1.1.1/bin/java geisel.stdplan.Sperren

Sollten andere Pausenzeiten als zu jeder viertel Stunde auftreten, müssen auch diese Minutenangaben mit eingetragen werden.

Konfiguration der Programme

In der Datei Hilf.java sind alle notwendigen Pfade, Dateinamen, Orte, SG, "berechtigte Nutzer zur Konfiguration" und andere Parameter festgelegt. Diese können mit einem Texteditor geändert werden. Vor allem die anzuzeigenden SG für Frage.class werden sich jedes Jahr ändern! Es ist anschließend die Hilf.java wieder in eine Hilf.class zu kompilieren.

Der eigentliche Sperrvorgang erfolgt in der Class Sperren.class. Hier muß individuell für jeden Anwendungsfall die Sperrung ausgelöst werden. An der BA-Bautzen haben die Zimmer im Stundenplan nur die Zimmernummer als Bezeichnung z.B. 303. Die Rechnernamen haben den Aufbau zZimmernummercComputernummer z.B. die Bezeichnung z303c5. Somit wird in Sperren.class für jedes zu sperrende Zimmer eine Zeile zZimmernummerc in die Sperrdatei geschrieben z.B.:

in die Datei /usr/local/squid/etc/sperr.txt

z303c
z316c

Der Squid-Cache (ab Version 2.0) kann in seiner Konfigurationsdatei z.B. /usr/local/squid/etc/squid.conf für seine Access-Control-Lists (acl) Dateien einlesen. Somit kann ohne die squid.conf jedesmal zu ändern, eine andere Sperrkonfiguration realisiert werden. Alle anderen Rechner (BA-Bautzen mit der IP-Nummer 194.94.226.0 Netzmaske Class C) sind aber freizuschalten. Dies wird mit folgenden Zeilen realisiert:

acl all src 0.0.0.0/0.0.0.0
acl babautzen src 194.94.226.0/255.255.255.0
acl gesperrt srcdom_regex "/usr/local/squid/etc/sperr.txt"
http_access deny gesperrt
http_access allow babautzen
http_access deny all

Sind andere Proxys/Caches/Firewalls zu steuern, ist die Sperren.class anzupassen um ggf. eine komplette Konfigurationsdatei neu zu erstellen.

Kompilierung

Die Kompilierung der java-Dateien aus dem geisel.stdplan-Package hat z.B. so zu erfolgen:

javac -d /usr/local/jdk1.1.1/classes Hilf.java
Damit wird die Zieldatei Hilf.class gleich im richtigen Verzeichnis angelegt.

Die "CGI-Dateien" sind z.B. wie folgt zu kompilieren:

javac -classpath /usr/local/jdk1.1.1/classes:/usr/local/jdk1.1.1/lib/classes.zip Kabinet.java

Programmablauf

Das Programm Sperren.class, welches regelmäßig durch cron gestartet wird, implementiert folgendes vorgehen:

Die Class Kabinet.class hat zwei Aufgaben:

Farblich hervorgehoben wird in der Tabelle die aktuelle Stunde(rot) und die vergangenen Stunden(gelb). Ist keine aktuelle Stunde zu erkennen, ist Pause. Der aktuell dargestellte Stundenplan gilt nur für den Zeitpunkt des Abrufes! (siehe Stand: im oberen Bereich der Anzeige) Das heißt, die Anzeige des Stundenplanes wird nicht automatisch aktualisiert!

Der Konfigurationsmodus wird automatisch für "berechtigte Rechner" ausgeführt. Alle anderen Benutzer erhalten nur die Anzeige der Computerraumbelegung. Die Berechtigung wird anhand der CGI-Variablen REQUEST_HOST ermittelt. Dies ist keine sichere Methode! Berechtigte können die "normale" Computerraumbelegung erhalten, wenn ein beliebiger Parameter in der URL übergeben wird z.B.

http://www.ba-bautzen.de/cgi-bin/Kabinet.exe?1

Wird die Konfiguration durch Kabinet.class ausgeführt, werden die markierten Stunden als HTML-Formulardaten nach betätigen des Senden-Buttons für den jeweiligen Tag über die URL an die Schalten.class weitergeleitet z.B.

http://www.ba-bautzen.de/cgi-bin/Schalten.exe?Datum=13.8.1999&303=1&303=2&316=1

Die Class Schalten.class prüft noch einmal die Berechtigung Änderungen vorzunehmen und schreibt die übergebenen, aufbereiteten Daten z.B. in die Datei /tmp/soll.txt. Jetzt wird Sperren.class aufgerufen und damit ggf. eine Umschaltung der Sperre vorgenommen. Der Ablauf wird zur Kontrolle in der zurückgegebenen HTML-Datei dargestellt.
Bestätigungsmeldung
Diese HTML-Datei ist mit einem REFRESH-Meta-Tag versehen, so daß nach einer festgelegten Zeit (z.B. 10 Sekunden) automatisch die Kabinet.class (und damit die Konfiguration) erneut angezeigt wird.

Folgende Abbildung zeigt vereinfacht die Zusammenhänge zwischen den wichtigsten Programmteilen (gelbe Kreise), externen Programmen(rote Vierecke), den Dateien(Balken) und den HTML-Seiten(blaue Vierecke). Die wichtigsten Steuerbefehle sind als gestrichelte Pfeile gezeichnet, der Datenfluß als durchgehender Pfeil. Der WWW-Browser ist zur Vereinfachung weggelassen, so daß die HTML-Seiten als im Browser dargestellt zu betrachten sind.

Zusammenhänge zwischen den Programmteilen

Wartung

Regelmäßige Kontrolle des Logbuches z.B. /var/spool/wwwsperre.log, welches bei jedem Schaltvorgang einen neuen Datensatz mit folgendem Aufbau enthält:
Länge WerHatGeschaltet WannWurdeGeschaltet gesperrt: WelcheZimmerWurdenGesperrt

z.B.
1 z317c1.ba-bautzen.de 13.8.1999 13:30 gesperrt: 303 316

Fehlermeldungen werden nicht in das Logbuch geschrieben!

Fehler

Fehler treten auf bei falschen Rechten auf die benutzten Pfade und Dateien. Die class-Dateien sollten den "Owner" des http-Dämons entsprechen z.B. änderbar mit chown httpd *.class.

Gleichfalls haben die Dateien zur Speicherung des Zustandes (soll.txt, ist.txt) die gleichen Rechte schreiben(w) und lesen(r) zu erhalten. Andere Gruppen oder "Other" sollten maximal Leserechte erhalten. Mit ls -l /tmp/*.txt sollte etwa folgende Bildschirmausgabe auf einem Unix-Rechner entstehen:

-rw-r--r-- 1 httpd httpd 84 Aug 13 13:34 /tmp/ist.txt
-rw-r--r-- 1 httpd httpd 0 Aug 16 08:30 /tmp/soll.txt

(owner und group ist hier httpd)

Die Rechte können unter Unix mit chmod geändert werden.

Die Berechtigung zum Konfigurieren erfordert die Übermittelung von REMOTE_HOST. Dazu muss unter Windows95/98 der Domaennameservice gestartet werden. In der Systemsteuerung ist hierzu DNS zu aktivieren und der DNS-Server anzugeben.

Dokumentation des Quelltextes

Der Quelltext ist mit den entsprechenden Javadoc-Kommentaren versehen. Hierdurch kann automatisch eine Programmdokumentation erzeugt werden. Mit JDK1.2 z.B. mit folgendem Befehl:

javadoc -d doc Frage.java Plan.java Kabinet.java Schalten.java geisel.stdplan

Voraussetzung ist, daß man sich im Quellcodepfad befindet, ein Pfad doc darunter angelegt wurde und die Package-Dateien in dem Pfad geisel/stdplan liegen.