CUPS - un po' di debug

Partiamo dalla seguente configurazione:

Client

Centos 7 64bit
Cups disattivo e cups-libs in versione

Nel file /etc/cups/client.conf

Server
Raspbian GNU/Linux 7
Cups attivo in versione

Metto temporaneamente queste direttive in /etc/cups/cupsd.conf

Stampante - Nome: 2
Modello: Dell M5200.
Driver Consigliato, Postscript (Dell M5200 Foomatic/Postscript (recommended))
http://www.openprinting.org/printer/Dell/Dell-M5200
Uso  il PPD di linuxprinting che contiene (fra le altre cose) le seguenti informazioni:

Una volta installata, il PPD relativo a questa stampante si trova in /etc/cups/ppd/2.ppd

Sul server la stampante viene contattata tramite AppSocket/HP JetDirect e poi condivisa ai client.

PROCEDIMENTO

1)

Apro una pagina web con firefox.

2)

Quando sul client lancio la stampa ho imparato che l'applet di stampa dei vari programmi (firefox in questo caso) scritti utilizzando le librerie standard gtk/qt, contatta tramite le libcups il server e lo interroga circa le stampanti che condivide e le capacità della stampante (stampa fronte/retro, colori, qualità etc).

3)

Fatto questo, cliccando sul pulsante di "stampa" verrà generato un "print job" che verrà passato allo spooler  (cups) sul server. Il linguaggio in cui avviene questa comunicazione è ipp e verranno trasmesse informazioni per lo spooler (che coda di stampa contatto, come si chiama il file che sto stampando, che utente sta stampando) e per il filtro/filtri che cups applicherà (orientamento, tipo di pagina, fronte/retro) oltre che il file da stampare convertito in PDF.
http://www.linuxfoundation.org/collaborate/workgroups/openprinting/pdf_as_standard_print_job_format

Questa fase nei log verrà vista in questo modo

4)

Cups salva

a)Le informazioni per lo spooler e il filtro in un file di controllo /var/spool/cups/c<job-number>  (avendo messo PreserveJobHistory Yes questo file viene conservato anche dopo la stampa)
b)Il file pdf da stampare  /var/spool/cups/d<job-number>-<file-number>  (avendo messo PreserveJobFiles Yes questo file viene conservato anche dopo la stampa).
Il control file è un binario ma si può leggere tramite un editor esadecimale (tipo ghex) e si possono trovare le informazioni di cui abbiamo parlato sopra (priorità del job, nome della coda, numero di copie da effettuare etc).

5)

Questa è la fase più interessante (a mio modo di vedere).
CUPS ha già riconosciuto la tipologia di file che gli è stato mandato, vedi nei log precedenti

per far questo si è basato su un databse di tipi mime (file.type) Sa anche cosa deve fare in base al tipo di file che gli arriva e per saperlo si è basato su un database di conversione di tipi mime (file.convs).
Questi database sono letti di default in questi file (nel debug lo vedo)

In passato c'erano 2 soli file /etc/cups/mime.convs e mime.type, ora sono sparsi per il filesystem.

Oltre a questi va a leggere il PPD della stampante in oggetto (/etc/cups/ppd/nome_coda.ppd) e va ad utilizzare anche i filtri ivi indicati. Per ciascuna stampante quindi cups sa che filtri applicare per ciascun tipo di formato di file che gli arriva, come mostra il log

Nel mio caso il file, come già scritto, è un pdf.  Lo verifico

Qui sopra (nei log) trovo scritto che se è un pdf necessita di un filtro. In /usr/share/cups/mime/cupsfilters.convs trovo infatti l'indicazione di cosa fare col pdf, ovvero applicare il filtro pdftopdf per convertire il file da application/pdf a application/vnd.cups-pdf

Qui sopra (nei log) trovo scritto che application/vnd.cups-pdf necessita di un filtro. Il ppd della stampante dice proprio che

i file di tipo vnd.cups-pdf vanno passati al filtro foomatic-rip il quale poi "ci pensa lui"
http://www.linuxfoundation.org/collaborate/workgroups/openprinting/databasefoomatic

Se ora guardo ancora il log in questo modo

scopro che son stati richiamati i primi 2 filtri (pdftopdf e foomatic-rip) e poi  foomatic-rip ha fatto qualcosa che ha richiesto il lancio di "gs" e di "pstops"

6)

Ora abbiamo un file che la stampante è in grado di interpretare (un ps visto che la stamapte è postscript). Cups non fa altro che inviarlo al giusto backend

nel mio caso "socket" visto che la stampante la contatto tramite AppSocket/HP JetDirect ma potrebbe essere usb,parallel, ipp etc in base a come la stampante è connessa al sistema.

5*)

Il punto 5, se si è particolarmente curiosi, lo si può anche in parte testare a mano.
Mi copio il data file che trovo in /var/spool/cups/d00028-001 in /root/test/
Mi sposto in /root/test. Ricreo la variabile di ambiente PPD come  si vedeva prima nei log (forse servirebbero tutte?)

Lancio il primo filtro

che ha questa sintassi

E mi ritrovo il file pdftopdf.pdf che ha subito la prima alterazione

Lancio il secondo filtro, foomatic-rip

che ha questa sintassi

da qui dovrei vedere che foomatic-rip lancia gs e ps2ps... con altri filtri (non foomatic-rip) avevo avuto più fortuna, qui invece il tutto si incarta con questo output

 

Qualche buon link

http://www.openprinting.org/download/kpfeifle/LinuxKongress2002/Tutorial/V.CUPS-Filtering-Architecture/V.CUPS-Workshop-LinuxKongress2002-Content.html

https://en.opensuse.org/Concepts_printing

Print Friendly, PDF & Email