Drucker „Airprint“-fähig machen auf #Ubuntu 16.04 #airprint #cups #ubuntu #xenial

Nachdem das Druckwerk meines Epson WF das Leben auf diesem Planeten hinter sich hatte, habe ich frei nach „Qualityland“ dem „Konsumschutzgesetz“ nachgegeben und einen neuen Drucker angeschafft. Zielmarke: Das Ding musste Duplex, SW und Laser können, stromsparend sein und wohl auch Airprint unterstützen. Außerdem sollte er nicht viel kosten, da er ja sowieso wieder irgendwann kaputt geht. Der MS317dn für dreiundsechzig Euro-Geldeinheiten bei Amazon hatte es mir angetan. Tja, und dann sitzt Du da auf dem Sofa mit Deinem iPad und willst drucken, nachdem Du das schwere Ding endlich ausgepackt und angeschlossen hast.

Blöd, dass sich dann herausstellt, dass dieser Drucker wohl doch kein Airprint kann. Na so ein Käse…

In dieser Howto steht der Lexmark-Drucker lediglich als Beispiel. Ihr könnt entsprechend mit Eurem Drucker adaptieren. 

 

Airprint macht unter iOS und OSX nix anderes, als ein PDF zum Drucker zu schubsen, der das dann ausdruckt. Dazu muss man den Drucker per Bonjour im Netzwerk finden können.

Auszug aus dem Handbuch zum MS317dn Drucker von Lexmark

Im Handbuch („MS310 Series“) des Druckers stand zwar der Eintrag zu Airprint, jenen ich wohl „missverstanden“ hatte.

Nun habe ich hier ja jede Menge Debian und Ubuntu-VM’s… Und es gibt CUPS…

Also ran an den Speck. Folgendes im sudo Kontext:

Hütte updaten

apt-get update && apt-get upgrade

Dann Pakete installieren, Bonjour (avahi), Cups (Print-Server), Python und Geraffel für das airprint-generate Script von git@tjfontaine

apt-get install avahi-daemon cups python python-lxml python-cups wget

 

Cups konfigurieren

Nachdem CUPS (und das restliche Geraffel) installiert wurde, ändere ich in dessen conf wie folgt:

vi /etc/cups/cupsd.conf

Zum Erlauben des Zugriffs auf die Hütte von entfernten Geräten entferne ich localhost und füge Port hinzu für 631:

# Allow remote access
Port 631

Weiterhin erlaube ich Zugriff auf den Webserver im Location Abschnitt:

<Location />
   Allow @LOCAL
   Order allow,deny
</Location>
# Restrict access to the admin pages...
<Location /admin>
  Order allow,deny
  Allow @LOCAL
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  Allow @LOCAL
</Location>

speichere die conf und starte den Dienst neu:

systemctl restart cups.service

Anschließend füge ich meinen Drucker über das Webinterface hinzu,  Anmelden kannst Du Dich mit dem User, jenen Du für SSH nutzt unter folgender URI:

http://<serverip>:631

Über //Verwaltung/Füge Drucker hinzu:

findet das Ding den Drucker problemlos im Netzwerk. Doof ist nur, dass in meinem Fall die vorhandenen Treiber alle nicht passen und der Drucker aus seinem gesamten Papierfach Grütze druckt ;-). Also entscheide ich mich dazu nach DruckerModellName und „PPD“ zu suchen, und ihm in diesem Schritt der Einrichtung das passende PPD vor die Füße zu werfen:

Auch wenn Du freigeben klickst, steht in der Druckerconf dieser Drucker nachher auf nicht freigegeben (weil ich CUPS nicht so gut kenne, vermutlich). Also ändern wir das noch eben:

vi /etc/cups/printers.conf

und schauen, dass beim Drucker die Zeile „Shared Yes“ gesetzt ist.

Shared Yes

Danach starten wir den Dienst kurz durch

/etc/init.d/cups restart

und drucken noch kurz eine Testseite über das Webinterface:

Wenn das klappt, und der Drucker keine Grütze druckt, ist dieser Schritt erfolgreich gewesen.

 

AVAHI konfigurieren

Jetzt möchten wir den Drucker noch in Bonjour (AVAHI) in meinem Netz auffindbar machen. Weil die Generierung eines Printerservices in AVAHI ziemlich heftig ist, gibt es dazu ein schickes Script von Timothy J Fontaine: „Airprint-Generate“. Das holen wir uns mal eben ab:

wget https://raw.githubusercontent.com/tjfontaine/airprint-generate/master/airprint-generate.py

und machen es ausführbar,

chmod +x airprint-generate.py

und führen es aus.

./airprint-generate.py

Das Ding generiert eine Datei in meinem Folder, welche ich Euch als Beispiel mal kurz zeige (und damit auch den Grund, warum das script von tjfontaine so cool ist):

root@VM03LINHBRDG:/home/joe# cat AirPrint-Lexmark_MS310_Series.service 
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">AirPrint Lexmark_MS310_Series @ %h</name>
  <service>
    <type>_ipp._tcp</type>
    <subtype>_universal._sub._ipp._tcp</subtype>
    <port>631</port>
    <txt-record>txtvers=1</txt-record>
    <txt-record>qtotal=1</txt-record>
    <txt-record>Transparent=T</txt-record>
    <txt-record>URF=none</txt-record>
    <txt-record>rp=printers/Lexmark_MS310_Series</txt-record>
    <txt-record>note=Lexmark MS310 Series</txt-record>
    <txt-record>product=(GPL Ghostscript)</txt-record>
    <txt-record>printer-state=3</txt-record>
    <txt-record>printer-type=0x8290d4</txt-record>
    <txt-record>pdl=application/octet-stream,application/pdf,application/postscript,application/vnd.cups-raster,image/gif,image/jpeg,image/png,image/tiff,image/urf,text/html,text/plain,application/vnd.adobe-reader-postscript,application/vnd.cups-command</txt-record>
  </service>
</service-group>

Die Datei (heißt bei Euch anders) schiebe ich nur noch in die Bonjour AVAHI-Services:

mv AirPrint-Lexmark_MS310_Series.service /etc/avahi/services

und starte den AVAHI Dienst kurz durch:

/etc/init.d/avahi-daemon restart

Das war’s dann auch. Jetzt kann ich das fehlende Feature vom Lexmark auch von allen Geräten aus nutzen:

 

Ziemlich coole Geschichte. Ich bin dankbar, dass das so gut klappt.

Dennoch möchte ich anmerken, dass mir dieses Wegwerfdenken voll auf den Sack geht. Ich hatte zuletzt recht viel Geld für den Epson hingelegt (in der Hoffnung, dass dieser Drucker länger hält). Ja, er war ja auch cool. Der ADF ist der beste, den ich in dieser Preisklasse gesehen habe. Nur hat der Drucker selbst gerade mal 3500 Seiten durchgehalten und wurde immer mit sündhaft teurer Originaltinte gefüllt. Wieso könnt Ihr „Hersteller“ eigentlich nicht mal endlich irgendwas bauen, was hält?