Nach dem ich vor einiger Zeit meinen Raspbery PI zu einem AirPrint Server umfunktioniert hatte, stellte ich mir die Frage, ob das nicht auch mit meinem QNAP funktioniert. Nach einigen Fehlversuchen ist es mir nun gelungen.
Eines vorab, ich verwende einen Drucker, der bereits im Netzwerk eingebunden ist, jedoch nicht über AirPrint verfügt. Es sollte aber auch über einen Drucker, der per USB direkt am QNAP angeschlossen ist funktionieren. Da ich meinen Netzwerkdrucker nicht über das Werkseitig installierte CUPS ansprechen kann, habe ich CUPS über Optware neu installiert. Ob es auch mit dem vorhanden CUPS funktioniert kann ich nicht sagen, denke aber eher nicht.
Vorbereitung für die Installation
Remote Zugang: Telnet oder SSH
Für die Installation ist ein, bereits konfigurierter, SSH oder Telnet Zugang zum QNAP erforderlich. Ist dieser nicht vorhanden, so kann er über das Web-Administration Interface, unter Netzwerkdienste → Telnet / SSH aktiviert werden. Nach erfolgreicher Einrichtung kann man sich über ein beliebiges Terminal Programm am QNAP anmelden (Spotlight → “Terminal”).
~$ ssh -l admin {QNAP-NAME} admin@{QNAP-NAME}'s password:
Es ist zu empfehlen nur den Zugriff über SSH zu verwenden, da dieser die Daten verschlüsselt überträgt.
QPKG Paket Optware
Voraussetzung für die Installation ist das QPKG Paket Optware. Es lässt sich einfach aus dem QPKG-Center installieren. Hierzu nur im QNAP Web-Administrator Interface auf Anwendungen und dann auf QPKG Center klicken. Im QPKG Center den Reiter Verfügbare und den Unterpunkt mehr wählen, nach unten scrollen bis zum Eintrag Optware. Anschließend den Link installieren klicken und warten bis die Installation abgeschlossen ist. Danach kann Optware über die Eingabe “https://{QNAP-NAME}:8081/Optware/” in die Adressleiste eines beliebigen Browsers aufgerufen werden. Die Benutzung ist auf den admin Account des QNAPs beschränkt. Alternativ lässt sich Optware auch über die SSH-Konsole mit dem Befehl ipkg verwenden. Diese Variante werde ich auch im weiteren Verlauf anwenden.
Eigene Skripte nach dem Systemstart ausführen
Nach eine Systemstart, muss dem QNAP mitgeteilt werden, dass es ein anderes CUPS verwenden soll und der AirPrint Dienst registriert werden muss. Dies wird über ein Skript realisiert. Hierfür können die beiden nachfolgenden Möglichkeiten verwendet werden:
- Optware Init-Skripte nach Booten starten (empfohlen)
- QNAP Wiki: Running Your Own Application at Startup
QNAP CUPS ersetzen
Wenn noch nicht geschehen, ein Terminal öffnen und eine SSH-Verbindung mit dem QNAP herstellen. Danach die folgenden Packet installieren:
[~] # ipkg install cups cups-doc cups-pdf ghostscript cups-driver-gutenprint dbus dbus-glib perl
Abhängigkeiten werde automatisch mit installiert. Für neuere HP Drucker noch hplip ergänzen.
Nach der Installation muss die CUPS Konfigurationsdatei noch angepasst werden. Die Datei öffnen:
[~] # nano /opt/etc/cups/cupsd.conf
Und wie folgt anpassen:
ServerAlias * AccessLog /opt/var/log/cups/access_log DataDir /opt/share/cups DocumentRoot /opt/share/doc/cups ErrorLog /opt/var/log/cups/error_log FontPath /opt/share/cups/fonts #LogLevel warn LogLevel error PageLog /opt/var/log/cups/page_log PreserveJobHistory Off PreserveJobFiles No RequestRoot /opt/var/spool/cups ServerBin /opt/lib/cups ServerRoot /opt/etc/cups TempDir /opt/var/spool/cups/tmp Listen 127.0.0.1:631 Listen 192.168.178.22:631 KeepAlive On KeepAliveTimeout 60 BrowseWebIF On Browsing On BrowseOrder allow,deny BrowseAllow all BrowseRemoteProtocols CUPS BrowseAddress @LOCAL BrowseLocalProtocols CUPS BrowseProtocols all BrowseInterval 30 DefaultAuthType Basic DefaultEncryption IfRequested <Location /> Order allow,deny Allow @LOCAL </Location> <Location /admin> Order allow,deny Allow @Local </Location> <Location /admin/conf> AuthType Default Require user @SYSTEM Order allow,deny Allow @Local </Location>
Es sind nicht alle möglichen Parameter aufgeführt. Die Dokumentation für die weiteren Parameter ist hier zu finden: http://www.cups.org/documentation.php/doc-1.4/ref-cupsd-conf.html
Die originale CUPS Version von QNAP nun erst einmal stoppen:
[~] # /etc/init.d/cupsd.sh stop
Und die neue CUPS Version starten:
[~] # /opt/sbin/cupsd -c /opt/etc/cups/cupsd.conf
Im weiteren Verlauf wird dies ein Skript übernehmen. Jetzt einen Browser öffnen und die Adresse “http://{QNAP-NAME}:631″ eingeben. Erscheint die Seite wie in der Abbildung unten, hat es bis hier alles funktioniert.
Drucker konfigurieren
Bevor wir nun zu AirPrint kommen, muss erst einmal der Drucker konfigurieren werden. In der soeben aufgerufenen Seite auf Administration klicken.
Unter Server die Option “Share printers connected to this system” aktivieren und Change Settings drücken. Danach auf Add Printer klicken um den neuen Drucker hinzuzufügen. (Die Seite hat bei mir einen Darstellungsfehler, was aber die Funktion nicht beeinträchtigt.)
Wie bereits erwähnt verwende ich einen Netzwerkdrucker und zwar einen HP Photosmart C5180. Ich wähle daher “LPD/LPR Host or Printer” und spreche ihn über “socket://{PRINTER-NAME}” an, mit den folgenden Einstellungen:
- Name: HP-PhotosmartC5180
- Description: HP-PhotosmartC5180
- Location: Beliebig
- Connection: socket://{PRINTER-NAME}
- Sharing: “Share This Printer” aktivieren
Anschließend den Druckerhersteller und das Modell auswählen, und mit Add Printer hinzufügen. Die Standard Einstellungen habe ich einfach so übernommen. Ich führe hier die Installation nicht expliziert auf, da die Einstellungen für jeden Hersteller und jedes Modell unterschiedlich ist.
Um sicher zugehen, dass alles Funktioniert, das Menü Maintenance auswählen und Print Test Page drücken. Der Drucker sollte nun eine Testseite ausspucken.
Drucker als AirPint Gerät registrieren
Die Registrierung des Druckers lässt sich eigentlich recht einfach, über ein Python Skript realisieren. Aber nicht auf dem QNAP, denn es fehlt noch das Python CUPS Modul, das nicht in den Qptware-Quellen verfügbar ist. Dieses müssen wir zuerst einmal installieren. Dafür benötigen wir aber gcc und make, zusätzlich wird noch das Developer Paket cups-dev benötigt (die Pakete können nach der Installation auch wieder entfernt werden). Die Pakete werden wie folgt installiert:
[~] # ipkg install gcc make cups-dev
Danach den Source von Python CUPS laden:
[/share/Download] wget http://pypi.python.org/packages/source/p/pycups/pycups-1.9.62.tar.bz2
Enpacken und in das entpackte Verzeichnis wechseln:
[/share/Download] # tar -xjvf pycups-1.9.62.tar.bz2 [/share/Download] # cd pycups-1.9.62
Python Cups kompilieren und installieren:
[/share/HDA_DATA/Download/pycups-1.9.62] # /opt/bin/python2.5 setup.py install
Als nächstes benötigen wir ein Verzeichnis, in dem alles rund um AirPrint gespeichert wird. Ich habe es im QNAP Datenverzeichnis erstellt:
[~] # mkdir /share/HDA_DATA/AirPrint [~] # cd /share/HDA_DATA/AirPrint
Das Python Skript, das den AirPrint Dienst registriert, aus dem Internet in dieses Verzeichnis laden:
[/share/HDA_DATA/AirPrint] # wget -O airprint-generate.py --no-check-certificate https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py
Das Script nun aufrufen:
[/share/HDA_DATA/AirPrint] # /opt/bin/python2.5 airprint-generate.py -d /share/HDA_DATA/AirPrint image/urf is not in mime types, HP-PhotosmartC5180 may not be available on ios6 (see https://github.com/tjfontaine/airprint-generate/issues/5)
Es wird eine Fehlermeldung ausgegeben, dass ein Mine Type nicht verfügbar ist. Um diesen Fehler zu beheben, müssen zwei Dateien erzeugt werden:
- Datei eins erstellen:
[/share/HDA_DATA/AirPrint] # nano /opt/share/cups/mime/airprint.types
Und den folgenden Inhalt einfügen:
# # "$Id: $" # # AirPrint type image/urf urf string(0,UNIRAST<00>) # # End of "$Id: $". #
- Datei zwei erstellen:
[/share/HDA_DATA/AirPrint] # nano /opt/share/cups/mime/airprint.convs
Und den folgenden Inhalt einfügen:
# # "$Id: $" # # AirPrint # Updated list with minimal set 25 Sept image/urf application/pdf 100 pdftoraster # # End of "$Id: $". #
Damit die beiden Dateien geladen werden CUPS beenden:
[/share/HDA_DATA/AirPrint] # killall cupsd
Und wieder neu starten:
[/share/HDA_DATA/AirPrint] # /opt/sbin/cupsd -c /opt/etc/cups/cupsd.conf
Danach des Python Skript erneut ausführen, es sollte keine Ausgabe mehr erscheinen:
[/share/HDA_DATA/AirPrint] # /opt/bin/python2.5 airprint-generate.py -d /share/HDA_DATA/AirPrint
Bei einer regulären Linux Distribution hätte man die Pfadangabe des Avahi Dienst Verzeichnisses verwendet. Beim QNAP ist dies allerdings nicht möglich, da das Verzeichnis “/etc/avahi/services/” und dessen Inhalt bei einem Neustart, aus dem Flash-Speicher erzeugt wird. Die Dateien müssen nach einem Neustart in das Verzeichnis kopiert werden. Auch dies über nimmt das Init-Script.
AirPrint nach dem Systemstart laden
Nach einem Systemstart muss der QNAP eigenen CUPS Server gestoppt und durch den den Optware CUPS Server ersetzt werden. Dieser enthält einen fehlerhaften Pfad zu Ghostscript, was sich jedoch über einen symbolischen Link beheben lässt. Des weiteren muss des Avahi AirPrint Service registriert und der Avahi Server neu geladen werden. Um nicht bei jedem Neustart dies von Hand zu beheben, erstellen wir ein Init-Skript.
[~] # nano /opt/etc/init.d/X30airprint.sh
Den nachfolgenden Inhalt in die zuvor erstellte Datei kopieren.
#!/bin/sh AIRPRINT_DIR="/share/HDA_DATA/AirPrint/" AVAHI_DIR="/etc/avahi/" CUPSLOG_DIR="/opt/var/log/cups/" QNAPINIT_DIR="/etc/init.d/" CUPS="/opt/sbin/cupsd" CUPS_CONF="/opt/etc/cups/cupsd.conf" KILLALL="/usr/bin/killall" start() { echo "Startion Optware CUPS." # Stop CUPS if running (QNAP CUPS) if [ "$(pidof cupsd)" ] then stop fi # Clear old log files rm $CUPSLOG_DIR/* # Copy existing services to QNAP avahi services cp -f $AIRPRINT_DIR/AirPrint-* $AVAHI_DIR # Fix wrong Ghostscript path ln -fs /opt/bin/gs /usr/bin/gs # Start Optware CUPS $CUPS -c $CUPS_CONF # Reload avahi services $QNAPINIT_DIR/bonjour.sh reload if [ "$(pidof cupsd)" ] then echo "Optware CUPS sucessfully started." else echo "CUPS could not be started." fi } stop() { echo "Stopping Optware CUPS." # Stop all running CUPS daemons $KILLALL cupsd 2> /dev/null if [ !"$(pidof cupsd)" ] then echo "Optware CUPS sucessfully stopped." else echo "CUPS can not be terminated." exit 1 fi } status() { echo "Stautus" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) /bin/echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit 0
Beim meinem QNAP lautet der Pfad zum Datenverzeichnis “/share/HDA_DATA”. Da dies bei den verschiedenen QNAP Modellen unterschiedlich ist, muss die Variable AIRPRINT_DIR in Zeile 3, entsprechend angepasst werden.
Das Skript noch ausführbar machen:
[~] # chmod +x /opt/etc/init.d/X30airprint.sh
Wenn nicht die empfohlene Startmethode, wie in “Optware Init-Skripte nach Booten starten” beschrieben, verwendet wird, kann das Script auch über
/opt/etc/init.d/X30airprint.sh startaus autorun.sh gestartet werden.
AirPrint testen
Entweder das QNAP neu booten und warten bis alles gestartet ist oder AirPrint über die Konsole starten:
[~] # /opt/etc/init.d/X30airprint.sh start Startion Optware CUPS. Optware CUPS sucessfully started.
Das iPhone oder iPad nehmen, eine druckbaren Inhalt aufrufen und auf Senden-Icon und Drucken drücken:
Den Drucker wählen und auf Drucken drücken:
Der Druckvorgang sollte nun beginnen:
Das QNAP ist nun ein AirPrint Server!