| 
07.03.2010
 | 
18:43

CUPS-Accounting für PCL-Drucker am Heimserver (Linux/Unix/Mac)

Der Heimserver auf Linux- oder einer anderen Unix-/BSD-Basis eignet sich als Druckerstation. Verbreitet ist der CUPS-Server, der übrigens auch auf dem Apple Macintosh zum Einsatz kommt. CUPS loggt die Druckaufträge mit, was praktisch ist, wenn man eine Übersicht über den Verbrauch benötigt oder die gedruckten Seiten abrechnen will (für den Arbeitnehmer, in der WG, was auch immer). Das funktioniert jedoch lediglich bei Postscript-Druckern. Wie man Seitenstatistiken für PCL-Drucker erzeugen kann, zeigt folgender Artikel.

Das Beispiel funktioniert auf Debian/Ubuntu-Systemen, ist jedoch mit wenig Aufwand an andere Linux-Distributionen oder Mac angepasst.

Das Grundproblem bei PCL-Druckern in CUPS ist, dass sie in aller Regel Rohdaten erhalten und an den Foomatic-Filter weiterleiten. In der Log-Datei wird der gesamte Auftrag als eine Seite gewertet. Die kann man leicht mit den Aufruft sudo less /var/log/cups/page_log überprüfen.

Abhilfe schafft ein Filter, der die Seiten zerlegt und zählt. Ein sehr zuverlässiger Filter ist pkpgcounter, der mit Hilfe von tea4cups in CUPs eingebunden werden kann. Beide Programme sind Teil des in Python geschriebenen PyKota-Pakets

pkpgcounter installieren

Das eigentliche Zählprogramm für PCL-Druckerdaten ist pkpgcounter. Neben PCL-Daten kann es eine Reihe von anderen Formaten analysieren und die Seitenzahl ausgeben. Daneben beherrscht es eine Analyse des Tintenverbrauchs, wenn man es noch genauer will. Details zu pkpgcounter können der Homepage des Programms entnommen werden.

wget www.pykota.com/software/pkpgcounter/download/tarballs/pkpgcounter-3.50.tar.gz
tar xzf pkpgcounter-3.50.tar.gz
cd pkpgcounter-3.50
./setup.py build
sudo ./setup.py install

Zum Installieren und Ausführen des Programms benötigt man die Skriptsprache Python. Unter Debian und Ubuntu sind die Pakete python, python-dev, python-imaging notwendig.

Man kann pkpgcounter leicht ausprobieren, indem man z.B. die Länge einer PDF-Datei analysiert:

pkpgcounter xyz.pdf

Der Aufruf sollte die korrekte Länge des Dokuments ausgeben.

tea4cups installieren

Nun muss CUPS noch so konfiguriert werden, dass pkpgcounter auch beim Drucken aufgerufen wird. Eine relativ einfache installation ermöglicht das Python-Paket tea4cups, welches an den Unix-Befehl tea angelehnt ist.

Wer die 25 EUR für das Paket nicht aufbringen will, kann sich die aktuelle Entwicklungsversion per Subversion herunterladen (man benötigt das Paket svn):

cd /tmp
svn co svn.pykota.com/tea4cups/trunk tea4cups
cd tea4cups

Dann müssen die Dateien in entsprechende Verzeichnisse kopiert werden:

sudo cp tea4cups.conf /etc/cups/
sudo cp tea4cups /usr/lib/cups/backend/
sudo chown root.root /usr/lib/cups/backend/tea4cups
sudo chmod 700 /usr/lib/cups/backend/tea4cups

CUPS muss nun neu gestartet werden, um tea4cups erkennen zu können:

sudo /etc/init.d/cups restart

Damit ist nun die Grundlage für das Accounting gelegt.

Abrechnung für einen Drucker einrichten

Will man nun die Abrechnung für einen Drucker einrichten, muss man zunächst die Konfiguration von tea4cups so anpassen, dass auch tatsächlich abgerechnet wird. Die vorhin kopierte Datei /etc/cups/tea4cups.conf muss angepasst werden. Man sucht nach dem Begriff „simple accounting” in dieser Datei – eine einfache Vorlage steht nämlich schon bereit. Man muss das Kommentarzeichen am BEginn der Zeile prehook_accounting löschen. Ich habe die Zeile ein wenig abgewandelt:

prehook_accounting : echo $TEAPRINTERNAME $TEAJOBID $TEAUSERNAME `/usr/bin/pkpgcounter $TEADATAFILE 2>/dev/null` `/bin/date "+%F %T"` >>/var/log/printaccounting.log

Damit werden Fehler in der Debian-Umgebung (z.B. bei der Pfadangabe) verhindert. Außerdem wird zu jedem Druckauftrag das Datum mit angegeben.

Laut tea4cups-Anleitung soll das Einrichten von Druckern per CUPs funktionieren – Bei mir hat das jedoch nicht geklappt! Es ist jedoch einfach, tea4cups für bereits bestehende Drucker einzurichten. Dazu öffnet man die Datei /etc/cups/printers.conf als root und sucht sich den entsprechenden Drucker heraus. Unter dem Eintrag „DeviceURI” fügt man tea4cups: vor der URI ein. Für einen Brother-Laser-Drucker am USB-Port wäre das zum Beispiel: DeviceURI tea4cups:usb://Brother/HL-1250%20series. Ein Neustart von CUPS könnte danach notwendig sein.

Ganz fertig ist man jedoch noch nicht: Die Seiten und die Zeit sollen ja in die Datei /var/log/printaccounting.log geschrieben werden. Es schadet nicht, diese Datei per touch /var/log/printaccounting.log anzulegen und für normale Benutzer zur Ansicht freizuschalten (z.B mit chmod 644 /var/log/printaccounting.log). Nun sollte das Accounting funktionieren. Ein Druckauftrag sieht folgendermaßen aus:

BrotherLaser 123 myuser 10 2010-03-07 16:07:03

Die erste Spalte ist der Drucker, die zweite die Nummer des Druckauftrags. In der nächsten Spalte steht der Benutzername, gefolgt von der Anzahl der gedruckten Seiten. Die beiden letzten Spalten geben Datum und Uhrzeit wieder.

Das Beispiel in der Datei /etc/cups/tea4cups.conf zeigt eine einfache Möglichkeit des Loggings. Denkbar sind hier natürlich auch andere Varianten, z.B. das Schreiben der Daten in eine Datenbanktabelle oder das Aufrufen eines Webservice per curl.

HTML-Ausgabe

Wer einen Webserver auf dem Heimserver besitzt kann mit einem einfachen PHP-Skript die Ausgabe dort anzeigen. Das folgende Beispiel sei als Anregung gedacht – viel Spaß damit.

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.                       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
  4. <head>
  5. <title>Druckstatistik</title>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  7. <style type="text/css">
  8. <!--
  9. th {
  10.     background-color: #CCC;
  11. }
  12.  
  13. .user {
  14. }
  15.  
  16. .date {
  17. }
  18.  
  19. .pages {
  20.     text-align: right;
  21. }
  22.  
  23. .sum {
  24.     text-align: right;
  25.     font-style: italic;
  26.     border-top: 1px solid black;
  27. }
  28.  
  29. .sumnum {
  30.     text-align: right;
  31.     border-top: 1px solid black;
  32. }
  33. -->
  34. </style>
  35. </head>
  36. <body>
  37.  
  38. <h1>Druckstatistik</h1>
  39.  
  40. <table>
  41. <tr>
  42.     <th>Benutzer</th>
  43.     <th>Datum</th>
  44.     <th>Seiten</th>
  45. </tr>
  46. <?php
  47. $lines = file('/var/log/printaccounting.log');
  48.  
  49. $sum = 0;
  50.  
  51. foreach ($lines as $line_num => $line) {
  52.     $elems = explode(' ', $line);
  53.  
  54.     $sum += $elems[3];
  55.     $d = explode('-', $elems[4]);
  56. ?>
  57. <tr>
  58.         <td class="user"><?php echo $elems[2]; ?></td>
  59.         <td class="date"><?php echo $d[2].'.'.$d[1].'.'.$d[0]; ?></td>
  60.         <td class="pages"><?php echo $elems[3]; ?></td>
  61. </tr>
  62. <?php
  63. }
  64. ?>
  65. <tr>
  66.         <td></td>
  67.         <td class="sum">Summe:</td>
  68.         <td class="sumnum"><?php echo $sum; ?></td>
  69. </tr>
  70. </table>
  71.  
  72. </body>
  •  
  • 2 Kommentare
  •  
Gravatar: Paul KottwitzPaul Kottwitz
16.09.2010
18:34

Danke

Hallo,

Danke für dieses nützliche Tutorial.

Leider hat sich bei dir wohl ein Fehler eingeschlichen:



prehook_accounting : echo $TEAPRINTERNAME $TEAJOBID $TEAUSERNAME `/usr/bin/pkpgcounter $TEADATAFILE 2>/dev/null` `/bin/date "+%F %T"` >>/var/log/printaccounting.log



Diese Zeilen bereiten bei mir Probleme:

Wenn ich diese abgewandelte Version benutze, kann kein User bei uns mehr drucken. Kann es sein das das "nach%T nicht stimmt?



Gruß und Danke Paul

Gravatar: MaxMax
16.09.2010
18:41

Re: Danke

Hallo Paul,



die Zeile sollte eigentlich stimmen - zumindest funktioniert sie bei mir tadellos. Schau mal nach, ob der Druckerbenutzer Zugriff auf /log/printaccounting.log hat und die Pfade zu pkpgcounter stimmen. Man kann den Term >>/var/log/printaccounting.log auch erst einmal weglassen bzw. es zuerst mit einer Zeile wie folgt probieren:



prehook_accounting : echo $TEAPRINTERNAME $TEAJOBID $TEAUSERNAME



Wenn das funktioniert, kann man den Fehler Schrittweise einschränken.



Schau außerdem mal in die Log-Dateien des Druckservers unter /var/log/ , vielleicht gibt findest du dort wertvolle Hinweise. Ich vermute aus dem Bauch heraus ein Rechte- oder Pfadproblem

Mein Kommentar
Ich möchte über jeden weiteren Kommentar benachrichtigt werden.

Zurück