8. Come configurare il tutto

Per configurazioni comuni si può probabilmente ignorare completamente questa sezione; meglio passare direttamente, invece, a la Sezione 9, o, meglio ancora, alla documentazione del venditore. La maggior parte delle distribuzioni GNU/Linux fornisce uno o più strumenti adatti anche agli inesperti che permettono di ottenere dalle stampanti più comuni tutto quello qui descritto.

Se lo strumento fornito dal venditore non funziona, o si vuole avere la capacità di controllare interattivamente le opzioni di stampa, si possono usare altri sistemi. APS Filter è un buon sistema; configura le code LPD ed effettua i filtraggi con molta facilità su ogni tipo di sistema Unix.

Si possono anche usare le interfacce di sistema per la stampa dal sito web linuxprinting.org per connettere driver liberi con diversi sistemi di spool. Completato il progetto, queste interfacce offriranno le migliori funzionalità: tutti i tipi di driver liberi saranno supportati, ci saranno opzioni impostabili dagli utenti, e saranno supportati i più comuni sistemi di spool. Attualmente le più moderne distribuzioni usano il sistema foomatic. Tuttavia, alcune distribuzioni possono includere una versione leggermente sorpassata di foomatic.

8.1. Configurare CUPS

Se si sta usando un client con CUPS ed è già stato configurato un server CUPS, installare la stampante sul client non potrebbe essere più facile: non c'è niente da fare. Attraverso il broadcasting, il client dovrebbe trovare il server CUPS e configurare automaticamente le stampanti installate. Questa è una delle funzioni di CUPS più apprezzate in una grande rete.

Configurare manualmente le stampanti con CUPS è altrettanto facile. Per chi è alle prime armi con CUPS e/o con la stampa Unix il modo migliore di procedere probabilmente è usare l'interfaccia web. Per chi deve configurare molte stampanti, sarà probabilmente più veloce usare la linea di comando.

L'indirizzo predefinito da cui si accede all'interfaccia web di CUPS è http://hostname:631/admin. Se necessario, la porta può essere cambiata nel file cupsd.conf.

La sintassi generica per aggiungere una stampante da linea di comando è lpadmin -p printer -E -v device -m ppd. Lpadmin con l'opzione -p aggiunge o modifica una stampante. Le stampanti vengono salvate nel file L'opzione -x cancella la stampante indicata. Si legga la pagina di manuale di lpadmin per conoscere le opzioni disponibili.

Esempio 3. Esempi da linea di comando


/usr/sbin/lpadmin -p testpr1 -E -v socket://192.168.1.9 -m deskjet.ppd
/usr/sbin/lpadmin -p testpr2 -E -v parallel:/dev/lp0 -m laserjet.ppd
/usr/sbin/lpadmin -x testpr1

Si possono trovare maggiori informazioni sulla configurazione delle stampanti e sulle opzioni nella documentazione CUPS. Il Software Administrators Manual contiene tutto quello che serve sapere per configurare stampanti con CUPS.

8.2. Configurare LPD

Fino a poco tempo fa le distribuzioni GNU/Linux fornivano LPD. Questa sezione descrive una configurazione di base per LPD; le sezioni successive dettaglieranno la creazione di filtri complessi e la configurazione per la rete.

8.2.1. Configurazione di base di LPD

La configurazione di base di lpd permette di ottenere un sistema in grado di accodare i file in una coda di stampa ed inviarli alla stampante. Questa configurazione non pone alcuna attenzione al fatto che la stampante sia in grado di interpretare i file, e probabilmente non si otterranno stampe di qualità. Ma da qualche parte si deve partire.

Per aggiungere una coda di stampa a lpd, si deve aggiungere un elemento in /etc/printcap, e creare la nuova directory di spool in /var/spool/lpd.

Un elemento di /etc/printcap è qualcosa del genere:


# LOCAL djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:
Questo definisce uno spool chiamato lp, dj o deskjet, il cui spool viene eseguito nella directory /var/spool/lpd/dj, senza nessun limite sulla dimensione massima dei file stampabili, che stampa sul dispositivo /dev/lp0, e che non usa una pagina di intestazione (con il nome di chi ha eseguito la stampa e altre informazioni).

Adesso si legga la pagina di manuale di printcap .

Quello sopra è un esempio molto semplice, ma c'è un tranello: se si manda in stampa un file che la Deskjet non può capire si ottengono strani risultati. Per esempio, inviando un normale file di testo Unix ad una deskjet si ottengono delle righe nuove interpretate letteralmente, cioè:


Questa è la prima riga.
	Questa è la seconda riga.
		Questa è la terza riga.
e così via. Mandando in stampa un file PostScript si ottiene una bella lista di comandi PostScript con il solito effetto a gradinata, ma niente di più utile.

Ovviamente è necessario qualcosa in più, e questo è l'obiettivo del filtraggio. I lettori più attenti della pagina di manuale di printcap avranno notato gli attributi if e of dello spool. Bene, if, cioè il filtro di input, è quello che serve in questo caso.

Scrivendo un piccolo script chiamato filtro, che aggiunga l'accapo prima delle nuove righe, l'effetto a gradinata sarà eliminato. A questo scopo si deve aggiungere una riga if nell'elemento del printcap illustrato prima:


lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :if=/var/spool/lpd/dj/filter:\
        :sh:
Un semplice filtro potrebbe essere:

#!perl
# The above line should really have the whole path to perl
# La linea precedente dovrebbe contenere il percorso completo a perl
# This script must be executable: chmod 755 filter
# Questo script deve essere eseguibile: chmod 755 filter
while(<STDIN>){chomp $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
# Si potrebbe voler finire con un form feed: print "\f";
In questo modo otteniamo uno spool su cui possiamo stampare normali file di testo Unix ed ottenere delle pagine leggibili. (Si, ci sono milioni di modi migliori per scrivere questo filtro, ma pochi altrettanto illustrativi. Ci si senta incoraggiati a farlo in modo più efficiente.)

L'unico problema è che stampare solo testo piano non è esattamente il massimo: certamente sarebbe meglio poter stampare anche PostScript o altri tipi di testo formattato o grafica. Naturalmente è possibile farlo, ed è facile. Il metodo da usare è semplicemente un'estensione del filtro presentato sopra per risolvere il problema della gradinata.

Questo tipo di filtro viene detto filtro magico. Non ci si deve preoccupare di scriverne uno da soli a meno che si stampino cose molto strane: ce ne sono di ottimi a disposizione, e molti hanno strumenti di configurazione interattivi facili da usare. Si dovrà semplicemente scegliere un filtro adatto:

foomatic-rip

foomatic-rip è un filtro che usa dati tratti dal database di stampanti fornito da LinuxPrinting.org. Supporta essenzialmente tutti i driver liberi, inclusi i normali driver di Ghostscript, i driver Uniprint, e altri programmi di filtri assortiti. foomatic-rip lavora con CUPS, LPRng, LPD, GNUlpr, PPR, PDQ e senza spool.

apsfilter

apsfilter è un filtro creato per essere usato con un gran numero di Unix. Supporta essenzialmente tutti i driver Ghostscript. Lavora anche con diversi tipi di LPD, inclusi BSD e LPRng.

RHS-Printfilters

RHS-Printfilters è un filtro creato da Red Hat. È stato incluso dalla versione 4 di Red Hat Linux, come backend per printtool, il loro semplice strumento di configurazione delle stampanti ad interfaccia grafica.

Il sistema di filtri rhs è costruito su un database ASCII incluso nel pacchetto. Questo elenco supporta molti driver Ghostscript e Uniprint, ma nessun driver che faccia da filtro. Inoltre i filtri risultanti non forniscono supporto simile a quello che si può ottenere tramite le opzioni controllabili dall'utente.

Lo strumento printtool crea un file di configurazione chiamato postscript.cfg nella directory di spool. All'interno di questo file, scritto in stile shell, ogni impostazione è una variabile. In casi straordinari, si possono fare cambiamenti direttamente in questo file, cosa che lo strumento printtool non permetterebbe di fare; solitamente si tratterà di specificare un driver Ghostscript particolare, o un file PPD per la versione VA di rhs-printfilters.

VA Linux ha aggiunto alcune migliorie al sistema rhs-printfilters per conto di HP. Con la versione giusta, è possibile selezionare opzioni per stampanti Postscript controllabili tramite file Adobe PPD. Questo sistema è descritto in la Sezione 8.2.2.

C'è un trabocchetto però: le versioni più vecchie di lpd non usano il filtro if per le stampanti di rete, le più recenti invece si (benché spesso senza argomenti). La versione di LPD contenuta nelle distribuzioni più recenti di GNU/Linux e FreeBSD lo usa; molti Unix commerciali invece forniscono ancora LPD in una versione che non lo usa. Si veda la sezione sulla stampa in rete più avanti in questo documento per maggiori informazioni. Avendo solo stampanti locali questo problema non esiste.

8.2.2. LPD per stampanti PostScript

Mentre molte versioni di LPD non sono in grado di usare PostScript (senza dare altre possibilità agli utenti), VA Linux ha modificato LPD e il software di filtraggio di Red Hat per supportare le stampanti PostScript piuttosto bene. Il progetto è stato chiamato GNUlpr perché è loro intenzione donare il codice al progetto gnu.

8.2.2.1. Come funziona

Il sistema VA usa file Postscript Printer Definition, o PPD, che sono forniti dai produttori delle stampanti e dichiarano le opzioni disponibili per la stampante insieme al codice Postscript necessario per attivarle. Con il sistema VA, il normale schema di lavoro di LPD funziona in maniera leggermente diversa:

  1. L'utente può specificare le opzioni usando il flag -o. Per esempio, volendo stampare su un lucido si può specificare -o MediaType:Transparency. In alternativa, si possono specificare le opzioni tramite una finestra di dialogo usando il front-end GPR; si possono vedere alcuni screenshot di GPR in la Sezione 3.4.3.

  2. LPR invia le opzioni a LPD come attributo esteso nel file di controllo di LPD.

  3. Una versione modificata del pacchetto rhs-printfilters assegna le opzioni estese ad una variabile d'ambiente, e usa ppdfilt per aggiungerle ai dati da stampare.

8.2.2.2. Come ottenere ed installare i pacchetti

I pacchetti RPM, o gli archivi compattati dei sorgenti, si possono ottenere dal sito web del progetto su SourceForge. Per i dettagli sull'installazione, si consulti il micro-HOWTO. In sostanza, dovrà essere disinstallata completamente la versione di Red Hat di printtool, di lpd e di rhs-printfilters, e installata invece la versione VA, più ppdfilt, gpr, e poche altre utilità.

Sarà necessario avere anche i file PPD per la propria stampante Postscript. I file PPD solitamente sono abbastanza facili da trovare. VA Linux e HP distribuiscono file PPD per molti modelli di Laserjet: altri venditori forniscono file PPD per le proprie stampanti, e Adobe distribuisce file PPD per molte stampanti.

Al momento molti di questi file sono leggermente difficili da installare. Ma verranno creati strumenti di installazione basati sulla libreria di configurazione delle stampanti libprinterconf, che abilita sia l'autoriconoscimento che la configurazione di rhs-printfilter, sia per stampanti di rete che per stampanti locali.

Nota

È possibile usare GPR da solo, senza l'LPD modificato o anche senza rhs-printfilters. GPR può essere compilato con tutto quello che è necessario per effettuare direttamente stampe di tipo Postscript, il che potrebbe essere una soluzione più semplice, adatta a chi non avrà mai bisogno di stampare usando lpr direttamente.

8.2.2.3. Controllo delle opzioni Postscript

Dopo aver impostato un sistema LPD in grado di utilizzare il supporto Postscript fornito da VA (GNUlpr), le opzioni della stampante possono essere controllate in due modi:

Tramite un'interfaccia grafica

Per usare GPR, assicurarsi prima di tutto di aver specificato il file PPD corretto. Dopo di che le opzioni della stampante saranno disponibili nel pannello "Avanzate". Le opzioni ppdfilt di base saranno disponibili nel pannello "Comuni".

Tramite la linea di comando

lpr supporta l'opzione -o. È possibile specificare qualunque coppia di opzioni/valori dal file PPD della stampante con -o. Per esempio, si consideri questa proposizione contenuta in un file PPD:


*OpenUI *PrintQuality/Print Quality: PickOne
*DefaultPrintQuality: None
*OrderDependency: 150 AnySetup *PrintQuality
*PrintQuality None/Printer Setting: ""
*PrintQuality Quick/QuickPrint:  "<< /DeviceRenderingInfo ...
*PrintQuality Normal/Normal: "<< /DeviceRenderingInfo << /...
*PrintQuality Pres/Presentation: "<< /DeviceRenderingInfo ...
*PrintQuality Image/1200 Image Quality: "<< /DeviceRenderi...
*CloseUI: *PrintQuality
Possibili valori per l'opzione PrintQuality sono Quick, Normal,Pres, o Image. Si potrebbe dare un comando del tipo:
% lpr -o PrintQuality:Image
 file.ps

Un certo numero di opzioni sono comuni a tutte le stampanti, e possono essere usate in aggiunta a quelle del proprio file PPD. Tra queste:

page-ranges

È possibile specificare una serie di pagine da stampare. Per esempio, page-ranges:2-3.

page-set

È possibile stampare solo pagine pari o dispari. Per esempio, page-set:odd.

number-up

È possibile stampare pagine multiple su un foglio. Per esempio, number-up:2.

Altre opzioni sono dettagliate nella pagina di manuale di ppdfilt.

8.2.3. Permessi sui file

A grande richiesta è inclusa una lista dei permessi su alcuni file interessanti. Ci sono modi migliori per ottenere lo stesso risultato, idealmente usando solo eseguibili SGID e non rendendo tutto SUID root, ma il mio sistema era configurato così dopo l'installazione e funziona. (Sinceramente, se il venditore non è in grado di fornire un lpd che funzioni saranno guai).


-r-sr-sr-x   1 root     lp    /usr/bin/lpr*
-r-sr-sr-x   1 root     lp    /usr/bin/lprm*
-rwxr--r--   1 root     root  /usr/sbin/lpd*
-r-xr-sr-x   1 root     lp    /usr/sbin/lpc*
drwxrwxr-x   4 root     lp    /var/spool/lpd/
drwxr-xr-x   2 root     lp    /var/spool/lpd/lp/

Lpd deve essere eseguito da root, in modo che possa connettersi alle porte riservate di lp. Dovrebbe probabilmente diventare UID lp.lp o qualcosa del genere dopo la connessione, ma non credo che lo faccia: il che è un altro motivo per evitare l'uso di BSD LPD.

8.3. Installazioni su larga scala

Con installazioni su larga scala si intendono reti che includono più di due stampanti o macchine, e che hanno necessità speciali. Ecco qui sotto alcuni suggerimenti.

CUPS supporta alcune funzioni interessanti che ne fanno una buona scelta per grandi reti. Per nominarne alcune, le classi di stampa, il controllo degli accessi e la configurazione automatica per i client.

Se si usa LPD per ambienti su scala davvero molto grande, già la sola distribuzione delle informazioni relative a printcap/filtri diventa un problema; il Cisco Enterprise Print System fa riferimento proprio a questo e può essere un buon punto di partenza o una soluzione completa a seconda delle necessità. Le funzioni native di LPRng possono supportare molto bene ambienti di medie o grandi dimensioni.

8.4. Autenticazione

Una normale installazione di LPD non aiuta molto con l'autenticazione. È possibile specificare il nome di un file di autenticazione tramite l'attributo af del file printcap, ma in questo modo l'attributo verrà semplicemente passato come argomento al filtro if. È compito nostro far si che il filtro if scriva entrate appropriate nel file di autenticazione, e di processarlo successivamente (il formato tradizionale è utile principalmente per stampanti in linea, e non è banale trasformarlo in Perl, dunque non c'è motivo di conservarlo). Usando come filtro il programma foomatic-rip si dovranno fare dei cambiamenti, dato che il programma richiede che gli venga indicato un file di configurazione come nome di file di "autenticazione".

CUPS mette a disposizione l'autenticazione per pagina, passando i lavori di stampa attraverso il filtro pstops. Questo file si aspetta input Postscript. Se si passano lavori di stampa "raw", questi saranno sempre contati come una pagina. Questo significa che l'autenticazione non funzionerà stampando da Windows con il suo driver di stampa nativo.

Ghostscript mette a disposizione l'operatore PageCount che può essere usato per fare il conto delle pagine che compongono un lavoro di stampa; sostanzialmente, verranno aggiunte alcune linee postscript alla fine del lavoro di stampa che serviranno ad aggiungere una voce nel file di autenticazione; il miglior esempio si trova nel file unix-lpr.sh presente nel sorgente di Ghostscript.

L'implementazione dell'autenticazione di unix-lpr scrive su un file dall'interprete Ghostscript, ed è quindi incompatibile con l'opzione raccomandata -dSAFER. Una soluzione migliore potrebbe essere un'interrogazione alla stampante tramite un comando PJL dopo ogni lavoro di stampa, o la scrittura di uno qualche riga di codice postscript che stampi il conto delle pagine sullo standard output, dove possa essere catturato senza dover essere scritto in un file.

Lo spooler di stampa di LPRng include un'implementazione di autenticazione specifica per HP, che interroga la stampante tramite PJL. Questa tecnica dovrebbe funzionare per quasi tutte le stampanti PJL, Postscript o SNMP con le quali si ha una comunicazione a doppio senso.

Avendo una stampante di rete che supporta SNMP, si può usare il programma npadmin per richiedere un PageCount dopo ogni lavoro di stampa. Dovrebbe funzionare correttamente per tutti i lavori di stampa. Si veda la sezione la Sezione 11.10.1 per maggiori informazioni su npadmin.