Avanti Indietro Indice

5. Come configurare il tutto, fondamenti.

5.1 La configurazione tradizionale di lpd

La configurazione minima di lpd permette di ottenere un sistema in grado di accodare i file in una coda di stampa ed inviarli alla stampante. In questo caso non si pone alcuna attenzione al fatto che la stampante sia in grado di interpretare i file, ed in generale non si potranno ottenere stampe di qualita'. Comunque e' il primo passo per comprendere il funzionamento del sistema di stampa, quindi continuate a leggere.

Fondamentalmente, per aggiungere un a coda di stampa ad lpd, si deve aggiungere un elemento in /etc/printcap, e creare una nuova directory di spooling in /var/spool/lpd.

Un elemento in /etc/printcap e' 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 spooling 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 leggetivi la man page di printcap.

Quello sopra e' un esempio molto semplice, ma se non si manda in stampa un file che la Deskjet puo' capire si ottengono strani risultati. Stampando un normale file Unix si ottengono dei newline interpretati letteralmente, cioe' la seguente cosa:

        Questa e' la prima riga.
                                 Questa e' la seconda riga.
                                                           Questa e' la terza.
                                                         

e cosi' via. Mandando in stampa un file PostScript si ottiene una bella lista di comandi PostScript con il solito effetto a gradinata, ma niente di piu' utile.

Ovviamente e' necessario qualcosa in piu': e' necessario un filtro. I lettori piu' attenti della man page del printcap avranno notato gli attributi if e of dello spool. Bene, if, cioe' il filtro di input e' quello che serve in questo caso.

Se scriviamo un piccolo script chiamato filtro, che aggiunge il carriage-return prima dei newline, l'effetto a gradinata puo' essere eliminato. A tal scopo dobbiamo aggiungere una riga 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
        while(<STDIN>){chop $_; print "$_\r\n";};
 

In questo modo otteniamo uno spool su cui possiamo stampare normali file di testo Unix ed ottenere delle pagine leggibili. Ci sono ovviamente molti altri modi di ottenere lo stesso risultato, ma questo e' uno dei piu' illustrativi. Siete comunque invitati a provarne altri.

L'unico problema e' che stampare solo testo piano non e' esattamente il massimo; certamente sarebbe meglio poter stampare anche PostScript o altre forme di testo formattato e grafica. Naturalmente e' possibile farlo, ed e' semplice. Il metodo da usare e' una semplice estensione di quello presentato sopra per risolvere il problema della gradinata. Se scriviamo un filtro che puo' accettare un qualsiasi file di input e trasformarlo in qualcosa di comprensibile per una DeskJet, il gioco e' fatto.

Questo tipo di filtro viene detto un filtro magico. Non preoccupatevi di scriverne uno da soli a meno che stampiate cose molto strane, ci sono molti ottimi filtri a disposizione in rete.

5.2 Permessi sui file

A grande richiesta includero' la lista dei permessi di accesso di alcuni file interessanti. Ci sono modi migliori di ottenere lo stesso risultato, idealmente usando solo eseguibili SGID e non rendendo tutto SUID root, ma questo e' il modo in cui il tutto era configurato dopo l'installazione e funziona. Sinceramente, se il vostro rivenditore non e' in grado di fornirvi un lpd che funziona, aspettatevi grossi problemi.

       -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.


Avanti Indietro Indice