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 …

Cyrus: Remove quota

Aus web-cyradm Mail:

you could do that with an expect-script:

#!/usr/bin/expect

set force_conservative 1  ;# set to 1 to force conservative mode even if
              ;# script wasn't run conservatively originally
if {$force_conservative} {
    set send_slow {1 .1}
    proc send {ignore arg} {
        sleep .1
        exp_send -s -- $arg
    }
}

set username [lrange $argv 0 0]

set timeout 2

# Start the program.
spawn /usr/bin/cyradm --user cyrus --server localhost
match_max 100000

# Look for the Password: line and send the password.
expect -exact "IMAP Password: "
send -- "Password\r"
expect -exact "\r
localhost.localdomain> "

# Create the mailbox user.$username.
send -- "sq user/$username none"
expect -exact "sq user/$username none
localhost.localdomain> "

send -- "quit\r"
expect eof

######################################################

This script works with unixhierarchysep: yes and namespace "/"
Now when you execute "./scriptname root" it would remove quota
for user root. When you have a list of users you could do a:

#!/bin/bash

userlist=`cat userlist.txt`
for i in $userlist
do
 /path/to/script $i
done

MySQL 4.1 Typo3 und UTF-8

Wer wie ich gezwungen wird, Typo3 von einer alten MySQL (<4.1) Installation auf die aktuelle Version (4.1) zu hieven, hat in der Regel ein Problem. Denn ab MySQL Version 4.1 ist UTF-8 Standard. Zwar lässt sich mit der /etc/mysql/my.cnf alles wieder auf latin1 setzen, doch sehe das nur als kurzfristige Lösung. Nach mehreren Stunden suchen, bin ich auf einen einfachen Weg gestoßen. Es gibt die Extensiion „UTF-8 Site Converter„. Zwar ist sie ursprünglich für Typo3 3.6 gedacht gewesen und dazu beta, doch hat sie auch bei Typo3 3.8 funktioniert.

Mein weg war der:

Alter Server:

MySQL 4.0.x

Sicherung anlegen:

mysqldump -u root -p meinedb > meinedb.sql.backup

Dann die Extension UTF-8 Site Converter installieren. Einfach direkt vom Repository (nach utf suchen). Nach den diversen Datenbank Aktualisierungen (sprich Mausklicks) auf die oberste Seite (in der Regel die mit dem Roottemplate) klicken, dann im Kontext Menü, den Konverter auswählen. Alle Seite markieren (unten ist ein „Select all“), auf weiter klicken, die Sprache auswählen, in der die Seite momentan vorliegt (in der Regel ISO-8859-1) und konvertieren lassen.

Dann wieder:

mysqldumb -u root -p meinedb > meinedb-utf8.sql


Neuer Server:

MySQL 4.1

Ich kopiere diese Datei auf den neuen Server und lege eine frische Datenbank an:

mysql -u root -p

mysql> CREATE DATABASE typo3_db  CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
exit

und schiebe die konvertierte Datei zurück:

mysqldump -u root -p typo3_db < meinedb-utf8.sql

Stimmen alle Rechte und hat Typo3 zugriff auf diese Datenbank, mus noch eine Eintrag in die typo3conf/localconf.php:

$TYPO3_CONF_VARS[„BE“][„forceCharset“] = ‚utf-8‘;


Nachtrag:

Ein weiterer Weg wurde hier beschrieben.

In eigener Sache: Hotlink

Der Martin hat mich darauf Aufmerksam gemacht, das statt dem erwünschtem Bild, ein übergroßer Igel sich breit macht. Ich hatte ja schonmal geschrieben, das allen voran die Bollywood Bilder, sich auf anderen Seiten wieder fanden, als Referenz, sprich Hotlink. Diese Seiten, über die ich schrieb, finden sich zuhauf die nichts anderes tun, außer Bilder und zwei drei Wörter zu präsentieren.

Um mir Genugtuung zu verschaffen, habe ich kurzerhand die .htaccess angepasst, worauf jedes Bild, welches direkt von meinem Server geladen wird welches und einen anderen Referer aufweist, durch den Igel ausgetauscht wird. Dummerweise hatte ich einen Tippfehler darin, sodass ich mich selbst aussperrte, sozusagen. Das habe ich aber schon gestern Abend korrigiert, sodass eventuell der Cache geleert werden sollte, falls der Igel noch sichtbar ist.

Hier meine .htaccess Anpassungen:


RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?denny-schierz.de(/)?.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?blogging-reloaded.de(/)?.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|bmp|tiff|tif)$ http://www.cst-it.de/images/hotlink.jpg [R,NC]

Wichtig ist nur zu beachten, dass das Bild, welches statt des Originals gezeigt werden soll, sich außerhalb der zu schützenden Domain befindet. Das kann eine Subdomain, od, eben eine andere (wie bei mir) sein.