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 eine Weboberfläche dieser Standard außer Kraft gesetzt werden. Alle Programmteile sind in Java programmiert.

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/jdk/classes/geisel/stdplan/Hilf.class
/usr/local/jdk/classes/geisel/stdplan/SollManuell.class
/usr/local/jdk/classes/geisel/stdplan/SollZustandManuell.class
/usr/local/jdk/classes/geisel/stdplan/Parameter.class
/usr/local/jdk/classes/geisel/stdplan/JDBC2Table.class
/usr/local/jdk/classes/geisel/stdplan/Table.class
/usr/local/jdk/classes/geisel/stdplan/Sperren.class

CLASSPATH=/usr/local/jdk/classes:/usr/local/jdk/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/jdk/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 muss die Sperren.class z.B. jede viertel Stunde ausgeführt werden. Unter Linux 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/jdk/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 stdplan.properties 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!

Der eigentliche Sperrvorgang erfolgt in der Class Sperren.class. Hier muss 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 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/jdk/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/jdk/classes:/usr/local/jdk/lib/classes.zip Kabinet.java

Programmablauf

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

  1. Ermitteln der aktuelle Stundennummer und ob Pause ist
  2. Wenn keine Pause:
    1. Lesen des Sollzustandes aus der Datei z.B. /tmp/soll.txt, welche durch Kabinet.class geschrieben wurde
    2. Lesen des Zustandes des Stundenplanes der aktuellen Stunde für die Computerzimmer aus der Datenbank
    3. Vereinigen der beiden Zustände (Konfiguration und Stundenplan) zu Sollzustand
  3. Wenn Pause:
    1. Als Sollzustand alle Zimmer nicht gesperrt festlegen
    2. Lesen des Istzustandes (welche Zimmer sind gerade gesperrt) aus der Datei z.B. /tmp/ist.txt
    3. Wenn Sollzustand ungleich Istzustand:
      1. Sperr-Datei z.B. /usr/local/squid/etc/sperr.txt für Squid-Cache schreiben
      2. z.B. Squid-Cache rücksetzen mit /usr/local/squid/bin/squid -k reconfigure
      3. Logbuch schreiben z.B. /var/spool/wwwsperre.log
      4. Neuen Istzustand in Datei schreiben z.B. /tmp/ist.txt

Die Klasse Kabinet.class hat zwei Aufgaben:

  1. Darstellung der aktuellen Computerraumbelegung laut Stundenplan für die nächsten Tage
    Computerraumbelegung
  2. Konfiguration von Abweichungen vom "Standard": bei Vorlesung wird gesperrt, in Pausen und unbelegten Stunden wird freigeschaltet. Wenn also eine unbelegte Stunde einen Haken bekommt, wird diese Stunde lang der Internetzugang gesperrt. Bekommt eine Stunde mit Vorlesung einen Haken, kann ein WWW-Zugriff nach aussen erfolgen. Die Änderungen müssen für jeden Tag einzeln mit dem Senden-Button "abgeschickt" werden!
    Konfigurationsansicht

Farblich hervorgehoben wird in der Tabelle die aktuelle Stunde (rot) und die vergangenen Stunden (grau). 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.

https://www.ba-bautzen.de/stdplan/KabinetServlet?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.

https://www.ba-bautzen.de/stdplan/SchaltenServlet?Datum=13.8.2020&303=1&303=2&316=1

Die Klasse 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.
Bestaetigungsmeldung
Diese HTML-Datei ist mit einem REFRESH-Meta-Tag versehen, so dass 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 Datenfluss als durchgehender Pfeil. Der WWW-Browser ist zur Vereinfachung weggelassen, so dass die HTML-Seiten als im Browser dargestellt zu betrachten sind.

Zusammenhaenge zwischen den Programmteilen

Wartung

Regelmäßige Kontrolle des Logbuches z.B. /var/logs/wwwsperre.log, welches bei jedem Schaltvorgang einen neuen Datensatz mit folgendem Aufbau enthält:
Wer Wann gesperrt: Orte

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

Fehlermeldungen werden nicht in das Logbuch geschrieben!

Fehler

Fehler treten bei falschen Rechten auf die benutzten Pfade und Dateien auf. 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 Linux-Rechner entstehen:

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

(owner und group ist hier httpd)

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

Die Berechtigung zum Konfigurieren erfordert die Übermittelung von REMOTE_HOST.

Dokumentation des Quelltextes

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

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

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