Quantcast
Channel: Wel!s Blog » QNAP
Viewing all articles
Browse latest Browse all 4

QNAP als AirPrint Server

$
0
0

(English version)

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.

IMG_0026

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:

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.

qnap-cups-01

Drucker konfigurieren

Bevor wir nun zu AirPrint kommen, muss erst einmal der Drucker konfigurieren werden. In der soeben aufgerufenen Seite auf Administration klicken.

qnap-cups-02

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.

qnap-cups-03

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 start
 aus 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:

IMG_0249

Den Drucker wählen und auf Drucken drücken:

IMG_0247

 

Der Druckvorgang sollte nun beginnen:

IMG_0248

Das QNAP ist nun ein AirPrint Server!


Viewing all articles
Browse latest Browse all 4

Trending Articles