Aficio Drucker, Cups und Restriktionen

Kurze Story, lang erzählt.

Auf Arbeit haben mich die letzten Wochen sehr viele Nerven gekostet. Die Aufgabenstellung war eigentlich trivial:

ermögliche Studenten sowohl ihre Freiquota zu nutzen, als auch ihre Mensakarte bei aufgebrauchter Quota.

Als Endgerät wird sowohl ein Ricoh Aficio 4000 als auch ein 5000 eingesetzt. Beide verfügen über einen eingebauten Dokumentenserver (oder auch locked print), der Druckdaten auf die lokale Festplatte ablegt. Diese Dateien können dann am Gerät ausgewählt und gedruckt werden. In unserem Fall muss der Student seine Mensakarte in einen altmodischen Kartenleser stecken, der mittels elektrischen Impuls vom Drucker mitgeteilt bekommt, wie viele Seiten gedruckt wurden, und den Betrag von der Karte abzieht. Beim Einstecken der Karte wird das Bedienpanel freigeschaltet.

Die Entscheidung ob Aufträge nun direkt ausgedruckt, oder auf der Festplatte des Druckers landen, wird per Treibereinstellung definiert. Der Benutzer wählt also selbstständig das Ziel im Druckmenü von seinem Betriebssystem aus.

Die Kunst bestand nun darin, genau das zu unterbinden. Ein Administrator konfiguriert Profile für unterschiedliche Anwendungszwecke und möchte ungern sehen, wie Benutzer dies umgehen.

In einem kontrolliertem Umfeld ist dies noch in Teilen zu realisieren, wobei Windows an dieser Stelle allen anderen Systemen (ich nehme da Novell mal raus) weit voraus ist (sic!). Mittels Gruppenrichtlinien etc. kann man recht viel vor dem Benutzer „schützen“, hat man auch OSX und Linux mit im Boot, sieht es da schon hoffnungsloser aus.

Noch komplizierte wird es, wenn die jeweiligen Rechner gar nicht unter der Kontrolle des Administrators stehen (Stichwort BYOD).

Der Autor hat alle Systeme ausgetestet. Von Linux (OpenSuse12), über OSX 10.9 und Windows 2012r2, bei keinem System gelang es die Druckprofile durchzusetzen. Warum? Ganz einfach: Postscript/PCL. In der Sekunde bei dem der Drucker z.B. Postscript versteht, reichen die Spooler das zu druckende Dokument 1:1 an den Drucker durch (RAW). Innerhalb des Postscript stehen auch alle notwendigen Befehle drin (A4, Schwarz/Weiß, Sortierer, Duplex…) ,aber auch das Ziel, ob Festplatte, oder direkt ausdrucken. Daher werden die definierten Profile ignoriert.

Nun gibt es theoretisch unterschiedliche Möglichkeiten, das Ziel zu erzwingen:

  • Manipulierter Treiber bereitstellen -> unrealistisch, da meist im Betriebssystem vorhanden
  • Filter für Cups schreiben und nicht gewünschte Optionen rausfiltern
  • Backend für Cups schreiben und ebenfalls Filter einbinden

Da ich als Legastheniker in Sachen Programmierung die Filter nicht selbst passend schreiben konnte, fiel mir heute eine weitere Methode ein, das Problem zu lösen: cups-pdf!

Die Idee (sogar schon ein paar Tage alt) war, die Studenten auf einen PDF Drucker drucken zu lassen und die Dateien per Script selbst mit den gewünschten Optionen an den Drucker zu senden. Auf diese Weise entzieht man den Benutzern die Möglichkeit, selbst zu bestimmen, wo und wie das Dokument zum Drucker gelangt.

Die Schlussfrage wäre nur gewesen, wie übermittelt man z.B. den Benutzernamen etc. sodass der Student am Drucker nach seinen Aufträgen suchen kann. Doch es war einfacher als gedacht. cups-pdf besitzt die Option „postprocessing“ in der /etc/cups/cups-pdf.conf. Als Parameter wird ein Script/Kommando angegeben werden, welches ausgeführt wird, nachdem die PDF erstellt wurde.

Ein Beispiel:

#!/bin/bash
CURRENT_PDF="${1}"
CURRENT_USER="${2}"
lp -U $CURRENT_USER -d mensakarte $CURRENT_PDF
rm $CURRENT_PDF

Es gibt also den Drucker „mensakarte“, auf den nur per „localhost“ Cups ACL zugegriffen werden kann. Ein Benutzer druckt auf den PDF Drucker (für den ein Generic Postscript Treiber genügt), das Script erzeugt die PDF Datei, sendet die PDF zum echten Drucker mit den Voreinstellungen von Cups und übermittelt den Benutzernamen. Im Anschluss wird die Datei gelöscht.

Auf diese Weise kann jede Voreinstellung forciert werden, und der Benutzer hat keine Möglichkeit abseits des Formats etwas anderes zu definieren, da alle Postscript Befehle bei der Umwandlung entfernt werden, die den Drucker steuern.

Warum auch immer: in unserem Fall musste ich auch die Länge der Dateinamen der PDF Dateien auf 20 Zeichen beschränken, da sonst der Aficio die Daten nicht akzeptiert hat. Es passierte sonst nichts.

Was für ein Aufwand …

Fai Anleitung um von X86 eine Sparc zu betanken + Vorgeschichte

Meine Güte, was für ein Stress. In den letzten Wochen – achwas, Monaten – suche ich nach einer gangbaren Alternative zum verhassten Solaris10. Dieses Betriebssystem hat mich in zwei Jahren mehr Nerven gekostet, als Windows in 10(!). Für jeden Scheiß braucht es unter Solaris irgendwelche Workarounds, spezial Parameter oder obskure Dateien, um halbwegs aktuelle Software installieren zu können. Wer dann in der SunSW, CSW, SunFreeWare, /usr/local Hölle angekommen ist, für den ist die DLL Geschichte von damals™ nicht mehr als ein Augenzwinkern. Klar, man kann auch nehmen, was Sun einem bietet, die Kiste einmauern und hoffen, dass dem Hacker/Cracker das Ding zu halt ist, um näher betrachtet zu werden, aber darauf verlassen würde ich mich nicht. Bis dahin würde die Kiste sicher klaglos, bis in die Unendlichkeit und noch viel weiter, laufen.

Wer sich sagt: na, dann nehme ich doch einfach Solaris11?! Tja, dann sicher zum studieren, um eigene Software zu testen oder um 30 Tage Spaß zu haben, danach wird es teuer. Wer nicht bereit ist, mit Oracle einen (Ehe-)Vertrag einzugehen (wir bekommen dein Haus, und du bezahlst die Miete) und dennoch die SPARC Rechner nicht bei Ebay verscherbeln möchte, braucht etwas anderes, als Solaris10.

Ich hatte einen Exkurs mit FreeBSD und das sah soweit OK aus, allerdings merkt man sehr schnell, dass auch die FreeBSD Menschen nur selten Leute wie mich treffen, die da was anderes als Solaris drauf haben wollen. Fast hätte es geklappt, wären die Jails mit VNET stabil gelaufen. Doch es wäre nur eine Frage der Zeit gewesen, wieder gegen eine Wand zu laufen. Spätestens beim Versuch eine T2000 zu installieren. Die wird von FreeBSD9 nämlich nicht unterstützt. Yeahh..

Also doch wieder zu Linux. Und es soll mir keiner sagen, ich würde mal nicht über den Tellerrand schauen. 2.6.39 + Linux Container (LXC) = effiziente Hardwarenutzung.

So, da ich nun einige dieser Kisten habe und das Ziel sein soll, mittels Fai + Puppet + Backup einen ausgefallenen Rechner innerhalb von Zeitraum X wieder in Betrieb zu nehmen, durfte ich mich nun mit Fai auseinander setzen. Ich sag euch, … ihr seid mit SPARC wieder (nahezu) allein. Das fängt damit an, dass OpenBoot von der Sunfire v245 nur maximal 9,5MB als (TFTP) Image zulässt. Versucht mal einen Kernel + Initrd zu erstellen, der diese Kriterien erfüllt. Ich habe Stunden damit zubracht, passendes zurecht zu basteln. Dann geht es weiter mit der SUN Partitionierung, die Fai nicht beherrscht (Squeeze Version), aka -> alles selbst machen, und dann endet es irgendwo beim Bootloader Silo.

Kurzum, rund zwei Wochen mit „Try and Error“ verbracht. Doch jetzt steht die Anleitung für die wenigen (deutschsprachigen) Menschen auf der Welt, die ebenfalls gezwungen werden, aktuelle Software einzusetzen, flexibel zu sein und Oracle nicht ein Mitspracherecht auf das Konto einräumen wollen.

Zur Anleitung

Viel Spaß damit.

ps. Da die Rechtschreibkorrektur aktuell im Firefox nicht klappt, können noch Fehler enthalten sein. Ich werde sie nach und nach korrigieren.

Coova Chilli HotSpot Anleitung

Da ich vor ein paar Tagen einen HotSpot einrichten musste, habe ich mir ein paar Notizen gemacht, damit ich auch noch ein paar Wochen später weiß, wie ich das geschafft habe. Eventuell hilft dieses HowTo noch anderen.