Printserwer - system wydruku CUPS
Ostatnia zmiana: 2020-12-30 21:26

CUPS jest systemem wydruku, stosowanym w linuksie oraz MacOS (właścicielem projektu od pewnego czasu jest właśnie Apple). Za tym systemem przemawiają duże możliwości tworzenia serwerów wydruku, drukarek sieciowych i innych elementów związanych z drukowaniem. Możliwe jest utworzenie drukarki RAW (bez sterowników, wszystko co przyjdzie jest w takiej samej formie wysyłane do drukarki) lub zainstalować sterowniki w postaci plików ppd i utworzyć normalną drukarkę sieciową. W OpenWrt w przypadku chęci wykorzystania tej drugiej opcji może być problem w braku dodatkowych plików niezbędnych do drukowania na niektórych modelach (np. specjalne filtry zamieniające drukowany format na postać zrozumiałą dla drukarki), jednakże w wielu przypadkach nie powinno być z tym problemu. CUPS ma też przewagę na p910nd w postaci mechanizmów kontroli, kolejkowania i nadzoru nad wydrukami. Posiada też graficzny panel konfiguracyjny.

Zakładamy że router posiada złącze USB i zainstalowana jest jego obsługa (np. pakiet kmod-usb2). Niezbędne będzie też ustawienie hasła w systemie dla użytkownika root. Poniższy poradnik opisuje instalację drukarki typu RAW. Poniższy poradnik przetestowano na OpenWrt Attitude Adjustment z drukarką Xerox Phaser 3117. Sama instalacja CUPSa wymaga ok 6MB, więc niezbędne może okazać się utworzenie extroota.

Instalacja

Upewniamy się, że nie jest zainstalowany sterownik kmod-usb-printer oraz p910nd. CUPS samodzielnie korzysta ze złącza USB przy pomocy specjalnej biblioteki, więc ten sterownik nie jest mu potrzebny


    # opkg remove kmod-usb-printer p910nd

Jeżeli były zainstalowane te pakiety to należy teraz zrestartować router.
Jeżeli wyświetlony zostanie błąd że nie ma takiego pakietu, to oznacza że możemy pojąć dalsze czynności


    # opkg install cups
    # opkg install cups-locale-pl # dla wygody, nie jest to konieczne

Plik konfiguracyjny to /etc/cups/cupsd.conf, wymaga on pewnych modyfikacji żeby praca z cupsem na OpenWrt była bezproblemowa. Zmiany w pliku można wykonać edytorem tekstowym lub skorzystać z podanych poniżej poleceń:
- zmieniamy użytkownika na którym działa cups


    # sed -i 's/User nobody/User root/' /etc/cups/cupsd.conf
    # sed -i 's/Group nogroup/Group root/' /etc/cups/cupsd.conf

- zmieniamy autoryzację


    # sed -i 's/AuthClass.*/AuthClass Anonymous/' /etc/cups/cupsd.conf

- dodatkowo - ustawiamy odpowiednie prawa dostępu dla modułu usb w cupsie


    # chmod 700 /usr/lib/cups/backend/usb

Domyślnie ustawiony jest dostęp z sieci 192.168.1.0/24. Jeżeli używamy innej klasy adresowej należy to zmienić (opcja Allow) stosownie do używanej adresacji.

Wykrywanie drukarki

Podłączamy drukarkę do USB, uruchamiamy moduł i sprawdzamy czy jest widoczna


    # /usr/lib/cups/backend/usb

Jeżeli tak, powinna wyświetlić się pewna informacja, w moim przypadku było to:


    DEBUG: list_devices
    DEBUG: usb_find_busses=1
    DEBUG: usb_find_devices=5
    direct usb://Xerox/Phaser%203117?serial=L93813649....... "Xerox Phaser 3117" "Xerox Phaser 3117" "MFG:Xerox;CMD:GDI;MDL:Phaser 3117;CLS:PRINTER;MODE:GDI;STATUS:IDLE;" ""

Uruchamiamy cupsa


    # /etc/init.d/cupsd enable
    # /etc/init.d/cupsd start

Konfiguracja

Uruchamiamy interfejs graficzny, wpisując w przeglądarkę adres http://192.168.1.1:631/admin . Wybieramy teraz po kolei:
- Add Printer
- Local printer, zaznaczamy nazwę drukarki (w tym przypadku było to Xerox Phaser 3117 (Xerox Phaser 3117))
- Klikamy Continue
- Opisujemy drukarkę - można zostawić domyślne opcje ale zaznaczamy Share This Printer
- Klikamy Continue
- Jako sterownik zaznaczamy RAW
- Klikamy Add Printer

Zostaniemy zapytani o hasło - podajemy login root oraz hasło do routera.

- Nastąpi pytanie o banery, ustawiamy na None i wybieramy Set Default Options

To już cała konfiguracja. Ważna jest nazwa drukarki jaką nadaliśmy - powinna ona także wyświetlić się na adresie URL. W moim przypadku było to http://192.168.1.1:631/printers/Xerox_Phaser_3117.

Załadowanie firmware do drukarki

(nie testowane)
Niektóre drukarki np. HP LaserJet 1020 wymagają przed drukowaniem załadowania firmware. Można to wykonać skryptem umieszczonym w pliku /etc/hotplug.d/usb/20-printer o następującej zawartości:


    #!/bin/sh
    fw="/usr/lib/sihp1020.img"

    logger "loading firmware $fw to CUPS USB device ..."
    (
        for uri in `$USB_BACKEND 2> /dev/null | grep -i 'HP.*LaserJet.*' | grep -v FWVER | cut -d ' ' -f 2`; do
            if DEVICE_URI="$uri" /usr/lib/cups/backend/usb 1 1 1 1 '' $fw 2> /dev/null; then
                logger "$uri... download successful."
            else
                logger "$uri... download failed."
            fi
        done
    ) &

Drukowanie z Linuksa i MacOS

W linuksie instalujemy także CUPSa, w MacOS powinien on być standardowo. Wchodzimy w konfigurację (http://127.0.0.1:631/), wybieramy Administrację, Dodawanie drukarki i wybieramy Internetowy protokół druku (https). Jako połączenie podajemy nazwę uzyskaną wcześniej, czyli http://192.168.1.1:631/printers/Xerox_Phaser_3117. Dalej postępujemy wg własnego uznania, ale wybieramy konkretny sterownik, czyli nie RAW a Xerox / Phaser 3117. Poprawność działania można przetestować wysyłając stronę testową do drukarki.
W zależności od używanej wersji CUPSa można spróbować używać innego protokołu - IPP (dla CUPSa 1.5.x - ipp://192.168.1.1:631/printers/Xerox_Phaser_3117) lub IPP14 (dla CUPSa - ipp14://192.168.1.1:631/printers/Xerox_Phaser_3117). Niektóre drukarki/konfiguracje mogą wymagać użycia starszej wersji protokołu IPP14.

Drukowanie z Windows

W przypadku Windows 7 Home: z menu wybieramy Urządzenia i drukarki, następnie Dodaj drukarkę i Dodaj drukarkę sieciową, bezprzewodową lub Bluetooth. Zostanie wyświetlone okno poszukiwania drukarek, wybieramy jednak opcję Drukarki, której szukam, nie ma na liście. Zaznaczamy Wybierz drukarkę udostępnioną wg nazwy i wprowadzamy naszą nazwę, czyli w tym przypadku http://192.168.1.1:631/printers/Xerox_Phaser_3117. Przechodzimy dalej, wybierając właściwy sterownik (Xerox / Phaser 3117 w tym przypadku). Na zakończenie można sprawdzić poprawność działania wysyłając stronę testową do drukarki.

AirPrint

Mając urządzenia produkcji Apple (iPad, iPhone, iPod touch, komputer Mac) można uprościć drukowanie z nich uruchamiając usługę AirPrint. Niestety wymagane jest, aby drukarka była w pełni obsługiwana przez CUPSa (nie raw, wymagany jest konkretny sterownik ppd). Z tego też powodu nie nadają się tanie i proste drukarki GDI.
Konfiguracja AirPrint jest dość prosta i sprowadza się do utworzenia odpowiedniego pliku dla usługi Avahi. Sam opis konfigurowania tej usługi jest opisany; w skrócie należy wykonać polecenia:


    # opkg update
    # opkg install avahi-daemon dbus libavahi-dbus-support
    # /etc/init.d/dbus enable
    # /etc/init.d/dbus start
    # /etc/init.d/avahi-daemon enable
    # /etc/init.d/avahi-daemon start

Teraz wystarczy tylko utworzyć odpowiedni plik services który w tym przypadku (drukarka Xerox / Phaser 3117 z odpowiednim ppd) wyglądał następująco:


    <?xml version="1.0" ?><!DOCTYPE service-group SYSTEM 'avahi-service.dtd'>
    <service-group><name replace-wildcards="yes">AirPrint Xerox_Phaser_3117 @ %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/Xerox_Phaser_3117</txt-record>
        <txt-record>note=Xerox Phaser 3117</txt-record>
        <txt-record>product=(GPL Ghostscript)</txt-record>
        <txt-record>printer-state=3</txt-record>
        <txt-record>printer-type=0x4</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/rss+xml,application/vnd.cups-banner,application/vnd.cups-command</txt-record>
    </service>
    </service-group>

Można posłużyć się odpowiednim skryptem, który na podstawie konfiguracji CUPSa wykona to za nas:


    # opkg install wget
    # opkg install python/python-cups python-expat
    # cd /tmp
    # wget -O airprint-generate.py --no-check-certificate https://raw.github.com/tjfontaine/airprint-generate/master/airprint-generate.py
    # echo "image/urf urf string(0,UNIRAST<00>)" >> /usr/share/cups/mime/mime.types
    # echo "image/urf application/pdf 100 pdftoraster" >> /usr/share/cups/mime/mime.convs
    # /etc/init.d/cups restart
    # chmod 755 ./airprint-generate.py
    # ./airprint-generate.py

Zostaną w bieżącym katalogu utworzone pliki service zawierające dane o drukarkach (te RAW zostaną pominięte). Wystarczy tylko skopiować je w odpowiednie miejsce i zrestartować usługę avahi:


    # cp AirPrint-Xerox_Phaser_3117.service /etc/avahi/services/
    # /etc/init.d/avahi-daemon stop
    # /etc/init.d/avahi-daemon start

Pakiety wget/python/python-cups/python-expat można odinstalować bo nie będą już potrzebne do tej usługi.

Google Cloud Print

Dla użytkowników urządzeń ze znaczkiem Androida może przydać się usługa drukowania w chmurze. W skrócie polega ona na udostępnieniu skonfigurowanej drukarki w chmurze google, dzięki czemu urządzenia mogą zdalnie drukować na tak udostępnionej drukarce. Podobnie jak dla AirPrint wymagane jest, aby drukarka była w pełni obsługiwana przez CUPSa i miała zainstalowany swój własny sterownik PPD (nie RAW!). Drukowanie przez Google dostępne jest standardowo w Androidzie 4.4 (KitKat), dla innych wersji odpowiednią aplikację można znaleźć w Google Play.

Cała operacja sprowadza się do instalacji odpowiedniego skryptu i jego uruchomienia:


    # opkg install wget
    # opkg install python python-openssl python-cups
    # cd /root
    # wget --no-check-certificate https://github.com/armooo/cloudprint/archive/master.tar.gz
    # tar zxvf master.tar.gz
    # rm master.tar.gz
    # python cloudprint-master/cloudprint/cloudprint.py

Podajemy użytkownika i hasło do konta Google. O tej chwili drukarka jest dostępna na naszym koncie Google i można na niej drukować. Jeżeli chcemy wylogować się z konta wykonujemy polecenie


    # python /root/cloudprint-master/cloudprint/cloudprint.py -l

Dane do podłączania można także umieścić w pliku (służy do tego opcja -a)
Usługa ta nie wymaga otwierania żadnych portów na firewallu.

Zakończenie

W pliku konfiguracyjnym cupsa znajduje się opcją (TempDir) wskazująca katalog gdzie tymczasowo przechowywane są dane do wydruku. Domyślnie jest to katalog w /var, czyli w OpenWrt w pamięci. Jeżeli używamy extroota dobrze jest go zmienić na inny katalog na nośniku, żeby zapewnić wystarczającą ilość miejsca.
Domyślnie dostarczane są także dwie predefiniowane konfigruacje drukarek o nazwach USB i LPT. Można je usunąć.