Startseite

Lehrerfortbildung

Arktur

 

Erfassung der gedruckten Seiten

Vorläufige Dokumentation (Entwurf, 2. Fassung)

Im Folgenden beschreibe ich den von mir umgesetzten Mechanismus zur Erfassung der auf einem Laserdrucker gedruckten Seiten. Sie stellt in hohem Maße eine "Bastellösung" dar, die Übertragung auf andere Systeme dürfte nicht problemlos möglich sein.
Voraussetzung für die Übertragbarkeit der Lösung auf ein anderes lokales Netz sind ein PJL-fähiger Laserdrucker sowie ein Linux-Server mit LPRng Druckerdämon, an dem der Drucker lokal angeschlossen und über Samba freigegeben ist. Der Linux-Server muss via NIS die Benutzernamen zur Verfügung gestellt bekommen (entfällt, wenn der Server die Benutzernamen selbst verwaltet, z. B. wenn es sich um den c't-/ODS-Kommunikationsserver "Arktur" handelt). Die PJL (Printer Job Language) ist im Rahmen der PCL (Printer Command Language) definiert und wird von den meisten aktuellen Laserdruckern unterstützt.
Umgesetzt ist die Lösung mit einem Laserdrucker Kyocera FS-680 an einem Linux-Server (SuSe 6.1). Inwieweit die Lösung auch für beliebige andere PCL/PJL-Drucker funktioniert, kann ich nicht sagen.

Die Lösung besteht aus folgenden Modulen:

  • Ein Programm lplog, mit dem der Seitenzähler des Druckers abgefragt wird, und das durch entsprechende Einträge in der Datei /etc/printcap für den jeweiligen Drucker zu Beginn und zum Ende jedes Druckjobs aufgerufen wird. (Quelltext ist in C formuliert)
  • Ein CGI-Skript pcost.cgi für den HTTP-Server, der auf dem Rechner mit dem Printserver läuft, zur Verwaltung der Einzahlungen der Benutzer sowie zur Ausgabe der aktuellen Kontostände. (Skriptsprache: Perl)
  • Ein Perl-Skript pcost.pl, das jedem Benutzer eine Abrechnung über seine aufgelaufenen Druckkosten zusendet.
  • Ein Shell-Skript pcostversand, das über einen Cron-Job wöchentlich aufgerufen wird und mittels pcost.pl den Versand von Abrechnungen an alle Benutzer veranlasst.

Die Lösung arbeitet bislang nicht perfekt. Die Erfassung der gedruckten Seiten setzt voraus, das ein Druckjob tatsächlich auch erfolgreich angefangen bzw. zu Ende gebracht worden ist. Wenn der Drucker z. B. wegen Papierstau, leerem Tonerbehälter oder ähnlichem nicht weiterdrucken kann, wird das tatsächliche Ende eines Druckjobs nicht erfasst, da ich in lplog zur Verhinderung von Endlosschleifen vorerst eine Beschränkung auf maximal 30 Sekunden (nach Ende der Datenübertragung zum Drucker) vorgesehen habe. Dadurch kann es im Einzelfall geschehen, dass Druckjobs mit langer Bearbeitungszeit nicht erfasst werden.
Zuverlässig erfasst wird allerdings ein Abbruch des Druckjobs (z. B. aus einem Windows-Client heraus), da dieser die Aufrufe von lplog nicht beeinflusst. Dadurch hat diese Lösung gegenüber Lösungen, die den Datenstrom zum Drucker auf Seitenvorschübe durchsuchen, den Vorteil, dass nicht zu viele Seiten abgerechnet werden können.
Insgesamt werden bei uns zur Zeit mehr als 90% aller gedruckten Seiten erfasst. Reklamationen, dass ein Benutzer zu viele Seiten berechnet bekommen hätte, gab es seit dem Anfang des Betriebs (September 2000) nicht; nicht zuletzt liegt das daran, dass die wöchentliche Abrechnung auch alle Druckjobs einzeln mit Datum, Uhrzeit und Seitenzahl auflistet.

Nachfolgend liste ich alle benötigten Dateien mit Angabe der Zielorte (hier: unter SuSe 6.1) auf:
/home/www/admin/pcost.cgi
/usr/local/sbin/pcost.pl
/usr/local/sbin/lplog
/etc/cron.weekly/pcostversand

Installation der Skripte

1. Dateien entpacken

Die Dateien können Sie als ZIP-Datei herunterladen und nach dem Entpacken manuell mit dem mv-Befehl an die jeweiligen Zielorte verschieben (siehe Tabelle oben).

2. lplog installieren

Das C-Programm lplog.c muss zunächst übersetzt und die ausführbare Datei verschoben werden: gcc lplog.c; mv a.out /usr/local/sbin/lplog

Auf die Datei /usr/local/sbin/lplog müssen dann Soft-Links gesetzt werden, so dass sowohl lplogend als auch lplogstart auf lplog verweisen:

-rwxr-xr-x   1 root     root        15616 May 28 18:34 /usr/local/sbin/lplog
lrwxrwxrwx   1 root     root            5 May 28 17:53 /usr/local/sbin/lplogend -> lplog
lrwxrwxrwx   1 root     root            5 May 28 17:53 /usr/local/sbin/lplogstart -> lplog

3. Gruppe pcost erzeugen

Der Webserver (hier: Apache, läuft unter der Benutzerkennung www) muss Lese- und Schreibberechtigung auf die Datenbank mit den Kontoständen der Benutzer in /var/pcost/ sowie Leseberechtigung für die Logdateien in /var/log/pcost/ haben, damit das CGI-Skript pcost.cgi zur Ausgabe der Kontostände und zur Verwaltung der Einzahlungen korrekt funktioniert.
Außerdem muss der Druckerdämon, der bei uns unter der Benutzerkennung lp läuft, natürlich die protokollierten Daten in die Logdateien schreiben können.

Eine Möglichkeit hierzu ist, hierzu zunächst eine eigene Benutzergruppe pcost in /etc/group hinzuzufügen und den Server unter dieser Gruppenidentität (gid) zu starten (siehe unten).
Dazu ist in die Datei /etc/group folgende Zeile aufzunehmen:

  pcost:x:58:lp,www,wwwrun,root,bin
Die gid (hier: 58) darf natürlich noch nicht anderweitig vergeben sein. Der Benutzer lp, unter dem der Druckderdämon läuft, wird ebenfalls in die Gruppe aufgenommen, damit er Schreibzugriffe auf die Logdateien ausführen kann.

4. Verzeichnisse erzeugen

Die Logdateien, die die Angaben zu Seitenzahlen und Benutzern der einzelnen Druckaufträge enthalten, sollen in dem Verzeichnis /var/log/pcost/ abgelegt werden. Dazu ist es zu erzeugen (mit einer leeren Logdatei) und mit den richtigen Rechten zu versehen:
  mkdir /var/log/pcost
  touch /var/log/pcost/pc-log
  chown www.pcost /var/log/pcost -R
  chown .pcost /var/log
  chmod g+rwx /var/log
  chmod g+rwx /var/log/pcost
Danach sollte ein ls -l /var/log/pcost folgende Ausgabe ergeben:
drwxrwxr-x   3 www      pcost        4096 Jun  2 00:03 .
drwxrwxr-x   5 root     pcost        4096 Jun  1 12:16 ..
-rw-rw-r--   1 www      pcost          69 Jun  2 00:03 pc-log
Entsprechend ist mit der Datei für die Datenbank der Kontostände zu verfahren:
  mkdir /var/local
  touch /var/local/pcost-db
  chown www.pcost /var/local -R
  chown .pcost /var/local
Danach sollte ein ls -l /var/local folgende Ausgabe ergeben:
drwxrwxr-x   2 www      pcost        4096 Jun  2 00:03 .
drwxr-xr-x  25 root     root         4096 May 28 17:42 ..
-rw-rw-r--   1 www      pcost        1188 Jun  2 00:03 pcost-db

5. /etc/printcap anpassen

Die Datei /etc/printcap muss bei dem betreffenden Drucker um die Einträge zu den Optionen as und ae (accounting start/end) ergänzt werden:
        :as=|/usr/local/sbin/lplogstart:\
        :ae=|/usr/local/sbin/lplogend:\
Insgesamt ergibt sich bei uns beispielsweise folgender printcap-Eintrag:
lp|lp3|raw|ljetplus-a4-raw|ljetplus a4 raw:\
        :lp=/dev/lp0:\
        :sd=/var/spool/lpd/ljetplus-a4-raw:\
        :lf=/var/spool/lpd/ljetplus-a4-raw/log:\
        :as=|/usr/local/sbin/lplogstart:\
        :ae=|/usr/local/sbin/lplogend:\
        :af=/var/spool/lpd/ljetplus-a4-raw/acct:\
        :if=/var/lib/apsfilter/bin/ljetplus-a4-auto-mono-600:\
        :mx#0:\
        :tr=:sh:sf:rw:
Der Druckerdämon muss nun neu gestartet werden:
  /sbin/init.d/lpd stop
  /sbin/init.d/lpd start

6. WebServer konfigurieren

Zunächst sind die Eintragungen für Benutzer und Gruppe, unter der der Server läuft, zu prüfen bzw. anzupassen:

  User www
  Group pcost
Dann ist ggf. der Pfad mit dem CGI-Skript pcost.cgi mit einem Alias zu versehen, damit es künftig direkt über den URL http://servername/cgi-pcost/pcost.cgi zu starten ist:
  Alias /cgi-pcost/   /home/www/admin/pcost/

Bei den Eintragungen zu den Verzeichnissen sind dann die Rechte für das CGI-Skriptverzeichnis anzupassen:

  # cgi-bin für Druckkostenabrechnung pcost
  <Directory /home/www/admin/pcost>
  AllowOverride None
  Options +ExecCGI -Includes
  Options FollowSymLinks ExecCGI
  AuthType Basic
  AuthName DruckkostenabrechnungLehrer
  AuthUserFile  /home/www/admin/.htpasswd
  AuthGroupFile /dev/null

  <Limit GET POST>
  require valid-user
  </Limit>
  </Directory>
Nach diesen Anpassungen ist der Webserver neu zu starten:
  /sbin/init.d/apache restart
bzw.
  /sbin/init.d/apache stop
  /sbin/init.d/apache start

7. Cron-Job eintragen

Damit wöchentlich Druckkostenabrechnungen versendet werden, muss pcost.pl wöchentlich ausgeführtwerden.
Unter einem SuSe-System kann dazu ein Skript mit folgendem Inhalt in /etc/cron.weekly/ erstellt werden:
  #!/bin/sh
  #
  #
  PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
  export PATH

  /usr/local/sbin/pcost.pl | mail printmaster@arktur
Auf dem c't/ODS-Kommunikationsserver Arktur sollte es genügen, diese Datei als /usr/lib/ods-server/cron/job.WOCHE.pcostversand zu speichern. In beiden Fällen sind die Rechte mit chmod u+x /etc/cron.weekly/pcostversand bzw. chmod u+x /usr/lib/ods-server/cron/job.WOCHE.pcostversand anzupassen, damit das Skript ausgeführt werden kann.

Die vorgestellte Lösung - und vor allem ihre Dokumentation - befindet sich noch im Experimentierstadium. Ich kann weder Support leisten noch ist absehbar, wann eine Verbesserung stattfinden wird. Dennoch bin ich für Hinweise auf Fehler dankbar.
Ich danke vor allem Georg Baum für seine Rückmeldungen, durch die Fehler ausgemerzt

werden konnten. Rückfragen an Joachim Deckers.
Bei der Lösung mit einem eigenen Print-Server ist es notwendig, dass das Skript /home/www/admin/pcost/lehrer/pcost.cgi für die Einzahlungen passwortgeschützt ist. Die hierfür erforderliche Datei /home/www/admin/.htpasswd (unter SuSe) wird bei uns durch einen per Cron-Job (auf Arktur) viertelstündlich aufgerufenes CGI-Skript (auf dem Printserver), das die verschlüsselten Passwörter der Lehrer übermittelt, erreicht. Bei Interesse kann ich die hierfür notwendigen Skripte (für Arktur und für den Printserver) auch hier veröffnetlichen.
Falls Sie die vorgestellte Lösung selbst auch implementiert haben, wäre ich Ihnen für eine Nachricht per E-Mail dankbar, da das Paket noch nicht "fertig" entwickelt ist und ich mich daher über einen Austaush sehr freue. Auch könnte ich Sie dann kurzfristig über Änderungen informieren.
Stand: 03.06.2001