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.
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ä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.
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.
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
Das Programm Sperren.class, welches regelmäßig durch cron gestartet wird, implementiert folgendes vorgehen:
Die Klasse Kabinet.class hat zwei Aufgaben:
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.
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.
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 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.
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.