11. Reti

Una delle capacità di molti spooler è il supporto della stampa tramite la rete su stampanti fisicamente connesse ad altre macchine, o direttamente alla rete. Con una attenta combinazione di filtri e utilità assortite, si può far stampare lpd su stampanti connesse a qualsiasi tipo di rete, in modo del tutto trasparente.

11.1. Stampare su un host Unix/lpd

Per abilitare macchine remote a stampare su una stampante usando il protocollo LPD, si devono elencare tali macchine in /etc/hosts.equiv o /etc/hosts.lpd. (Si noti che aggiungere una macchina a hosts.equiv ha molti altri effetti; ci si assicuri di sapere cosa si sta facendo prima di elencarvi una macchina). Si possono anche abilitare solo certi utenti dell'altra macchina a stampare su una stampante utilizzando l'attributo rs; per informazioni si legga la pagina di manuale di lpd.

11.1.1. Con lpd

Per stampare su un'altra macchina, bisogna aggiungere a /etc/printcap una voce di questo tipo:


# REMOTE djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=machine.out.there.com:\
        :rp=printername:\
        :sh:
Si noti che c'è ancora la coda di stampa sulla macchina locale, gestita da lpd, di modo che se la macchina remota è occupata o fuori linea i lavori di stampa possono essere accodati nell'area di spool fino a che possano essere inviati.

11.1.2. Con rlpr

Si può anche usare rplr per inviare un lavoro di stampa direttamente in una coda su una macchina remota, senza doversi preoccupare di configurare lpd per supportare la stampa remota. La sua maggiore utilità si dimostra quando si stampa solo occasionalmente su un gran numero di stampanti. Dall'annuncio di rlpr:

Rlpr usa il TCP/IP per inviare lavori di stampa a server lpd ovunque su una rete.

A differenza di lpr, non necessita che la stampante remota sia esplicitamente conosciuta alla macchina da cui si vuole stampare (ad esempio tramite /etc/printcap) e pertanto è molto più flessibile e richiede meno amministrazione.

Rlpr può essere usato ovunque si possa usare un normale lpr, ed è compatibile all'indietro con l'lpr BSD.

Il maggior vantaggio che si ottiene con rlpr è la capacità di stampare remotamente da qualsiasi macchina a qualsiasi macchina, senza preoccuparsi di come sia configurato il sistema su cui si desidera stampare. Inoltre può lavorare come un filtro allo stesso modo dell'lpr tradizionale, in modo che applicazioni client in esecuzione su una macchina remota, come Netscape, xemacs e così via possano stampare sulla macchina locale senza sforzo.

Rlpr è disponibile presso Metalab.

11.2. Stampare su una stampante Windows o Samba

Si possono trovare molte più informazioni al riguardo nel Printing to Windows mini-HOWTO.

11.2.1. Da LPD

È possibile dirigere una coda di stampa, attraverso il programma smbclient (che fa parte della suite Samba), ad un servizio di stampa SMB basato su TCP/IP. Samba include uno script chiamato smbprint per farlo: in breve, si deve inserire un file di configurazione per la stampante in questione nella directory di spool, e si deve installare lo script smbprint come if.

In /etc/printcap ci sarà qualcosa del genere:


lp|remote-smbprinter:\
    :sh:\
    :lp=/dev/null:\
    :sd=/var/spool/lpd/lp:\
    :if=/usr/local/sbin/smbprint:

Leggere la documentazione all'interno dello script smbprint per ulteriori informazioni sulla configurazione.

È anche possibile usare smbclient per passare un file direttamente al servizio di stampa SMB senza coinvolgere lpd. Controllare la pagina di manuale.

11.3. Stampare su una stampante NetWare

La suite ncpfs comprende una utilità chiamata nprint che fornisce le stesse funzionalità di smbprint , ma per NetWare. È possibile ottenere ncpfs da Metalab . Dalla LSM per la versione 0.16:

"Con ncpfs si possono montare volumi del server NetWare sotto Linux. Inoltre è possibile stampare verso code di stampa NetWare e fare lo spool di code di stampa NetWare verso lo spool di stampa Un*x. Si avrà bisogno del kernel 1.2.x, o 1.3.54 e superiori. ncpfs non funziona con kernel della serie 1.3.x inferiori alla 1.3.54."

11.3.1. Da LPD

Per far funzionare nprint tramite lpd, serve un piccolo script della shell che stampi lo stdin sulla stampante NetWare, e che va installato come if per una coda di stampa di lpd. Si otterrà qualcosa del tipo:


      
sub2|remote-NWprinter:\
        :sh:\
        :lp=/dev/null:\
        :sd=/var/spool/lpd/sub2:\
        :if=/var/spool/lpd/nprint-script:
Lo script per nprint sarà qualcosa di simile a questo:

#! /bin/sh
# You should try the guest account with no password first!
# Si dovrebbe provare prima di tutto con un account guest senza password.
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -

11.4. Stampare su una stampante EtherTalk (Apple)

Il pacchetto netatalk comprende qualcosa di simile a nprint e a smbclient. Altri hanno documentato la procedura per stampare da e verso una rete Apple molto meglio di quanto si potrebbe mai fare qui; si veda il Linux Netatalk-HOWTO .

11.5. Stampare su una stampante di rete

Molte stampanti sono dotate di un'interfaccia ethernet verso la quale si può stampare direttamente usando il protocollo LPD. Per farlo, si possono seguire le istruzioni allegate alla stampante o al suo adattatore di rete, ma in generale tali stampanti "eseguono" lpd, e forniscono una o più code su cui stampare. Una HP, per esempio, dovrebbe funzionare con un printcap del tipo:


lj-5|remote-hplj:\
        :sh:\
        :sd=/var/spool/lpd/lj-5:\
        :rm=printer.name.com:\
        :rp=raw:

Stampanti HP Laserjet con interfacce JetDirect generalmente supportano due code lpd incorporate: quella "raw" che accetta PCL (e se possibile Postscript) e quella "text" che accetta direttamente codici ascii (e risolve automaticamente l'effetto a gradinata). Con una stampante JetDirect Plus3 a tre porte, le code si chiameranno "raw1", "text2" e così via.

Si noti che la società ISS ha identificato un assortimento di attacchi di tipo "denial of service" che bloccano le interfacce HP Jetdirect. La maggior parte è stata scoperta nell'autunno 98. Questi problemi sono comuni nel codice incorporato; poche apparecchiature da ufficio dovrebbero essere esposte al traffico Internet.

In installazioni su larga scala, specialmente in un ambito in cui alcune stampanti non supportano il PostScript, può essere utile configurare un server di stampa dedicato, verso il quale stampano tutte le macchine, e che esegue le varie istanze di ghostscript. Questo permetterà di mettere in pausa o riordinare la coda, usando i comandi topq e lprm.

Inoltre permette alla GNU/Linux box di agire come server di spool per la stampante, in modo che gli utenti della rete possano completare i loro lavori di stampa velocemente e andare avanti con le loro cose senza dover aspettare che finisca il lavoro di stampa inviato da qualcun altro. È una soluzione suggerita anche quando siano presenti vecchie HP Jetdirects impossibili da sistemare; riduce infatti la probabilità che le stampanti si inceppino.

Per farlo, si dovrà impostare una coda sulla linux box che punti alla stampante HP LJ equipaggiata con l'interfaccia ethernet (come detto prima). Poi si impostino anche tutti i client della LAN perché puntino alla coda LPD (lj-5 nell'esempio riportato sopra).

Alcune stampanti di rete HP in apparenza non tengono conto delle impostazioni delle intestazioni delle pagine inviate dai client; la generazione interna delle intestazioni può essere disattivata connettendosi via telnet alla stampante, premendo due volte il tasto invio e scrivendo "banner: 0" seguito da "quit". Ci sono anche altre impostazioni che si possono cambiare in questo modo; scrivere "?" per vederne una lista.

Tutte le impostazioni possono essere controllate tramite il software webJetAdmin di HP. Questo pacchetto viene eseguito come demone, e accetta richieste http su una porta designata allo scopo. Tramite l'uso di moduli e di applet Java permette di controllare stampanti HP sulla rete. Teoricamente, può anche controllare code di stampa Unix, ma lo fa tramite il servizio rexec, che è assolutamente insicuro. Sarebbe meglio non usare questa funzione.

11.5.1. Su dispositivi AppSocket

Alcune stampanti (e stampanti messe in rete come "scatole nere") supportano solo una specie di non-protocollo basato su connessioni TCP piane, che qualche volta viene chiamato protocollo "AppSocket". Degne di nota in questa categoria sono le vecchie schede JetDirect (comprese alcune JetDirectEx). Fondamentalmente, per stampare su stampanti di questo tipo si deve aprire una connessione TCP verso la stampante su una porta specifica (di solito 9100, o 9100, 9101 e 9102 per box a tre porte) e trasmetterle il documento da stampare. Il supporto per trasmettere lavori di stampa a porte TCP casuali è incorporato in LPRng, ma con l'lpd BDS non è così semplice. La cosa migliore da fare probabilmente è ottenere e usare una piccola utilità chiamata netcat.

In caso di fallimento lo si può implementare, tra l'altro, usando il programma scritto in Perl riportato sotto. Per ottenere le migliori prestazioni, si usi il programma netcat ("nc"), che più o meno fa le stesse cose in maniera generica. Molte distribuzioni dovrebbero includere netcat.

11.6. Esecuzione di if per una stampante remota con il vecchio LPD

Un difetto delle vecchie versioni di lpd è che l'if non viene eseguito per le stampanti remote. (Versioni successive alla 0.43 comprendono la modifica che ha avuto origine su FreeBSD che permette a if di essere sempre eseguito). Se si ha bisogno di eseguire un if su una stampante remota, e ci si accorge che lpr non funziona, si può ottenere la stampa configurando una coda di stampa doppia e riaccodando il lavoro di stampa. Come esempio si consideri questo printcap:


lj-5:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/lj-5:\
        :if=/usr/lib/lpd/filter-lj-5:
lj-5-remote:sh:rm=printer.name.com:\
        :rp=raw:sd=/var/spool/lpd/lj-5-raw:


alla luce di questo script di filtraggio filter-lj-5 :

#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5

L'opzione -U di lpr funziona solamente se lpr è eseguito come demone, e imposta il nome utente corretto nella seconda coda di stampa. Probabilmente è meglio usare un metodo più robusto per determinare il nome dell'utente, perché in alcuni casi non è il quinto argomento. Si veda la pagina di manuale di printcap .

11.7. Da Windows

La stampa da un client Window (o presumo OS/2) ad un server Un*x è supportata direttamente su SMB tramite l'uso del pacchetto SAMBA, che supporta anche lo scambio di file tra il file system Un*x e i client Windows.

Samba include una documentazione molto completa, e si possono trovare anche buone FAQ al proposito. La configurazione può essere fatta o tramite un filtro magico sulla macchina Un*x per stampare PostScript, o girandoci intorno installando un driver specifico della stampante su tutte le macchine Windows e creando una coda senza alcun filtro. In alcuni casi fidarsi del driver Windows può produrre un output migliore, ma dal punto di vista amministrativo possono crearsi un sacco di problemi se ci sono molti client Windows. Meglio provare Postscript per primo. Per superare questo problema, le versioni più moderne di Samba dovrebbero supportare il meccanismo automatico di scaricamento dei driver offerto dai server Windows NT.

11.8. Da Apple

Il supporto per la stampa da client Apple viene supportato da Netatalk tramite EtherTalk. Si veda la pagina Netatalk HOWTO per maggiori informazioni.

In verità, comunque, qualunque Mac moderno può stampare tramite TCP/IP usando piuttosto bene il protocollo LPD. UVa mette a disposizione una pagina di supporto molto carina che spiega dettagliatamente come impostarlo.

11.9. Da Netware

Il pacchetto ncpfs include un demone chiamato pserver che può essere usato per fornire servizi ad una coda di stampa NetWare. Per quanto ne so, questo sistema richiede NetWare basato su Bindery, ad esempio 2.x, 3.x o 4.x con l'accesso bindery abilitato.

Si veda il sito FTP di ncpfs per maggiori informazioni su ncpfs e sul suo programma pserver.

11.10. Amministrazione di stampanti di rete

Quasi tutte le stampanti di rete supportano alcuni metodi amministrativi remoti: spesso si possono configurare tramite pagine web facili da usare. Molto più utile è il supporto per l'amministrazione via SNMP: tipicamente, sarà possibile trovare interessanti informazioni sullo stato della stampante, come i livelli dell'inchiostro e della carta, i volumi di stampa, e così via; inoltre solitamente si possono cambiare alcune impostazioni. Il controllo delle stampanti via SNMP, e alcune altre cose relative alla stampa, sono state standardizzate dal Printer Working Group di IEEE.

11.10.1. npadmin

Npadmin è un programma a linea di comando che offre un'interfaccia per le funzionalità SNMP delle stampanti di rete. Implementa il Printer MIB standard, insieme a pochi schemi proprietari dei venditori usati principalmente per vecchi dispositivi. Supporta sia azioni tese a trovare le stampanti che diverse richieste sullo stato della stampante.

npadmin ha una pagina di manuale eccellente, e molte distribuzioni basate su RMP e dpkg lo distribuiscono in pacchetti precompilati.

11.10.2. Altri strumenti SNMP

Oltre a npadmin, ci sono altri strumenti SNMP che potrebbero rivelarsi utili. snmptraplogd può effettuare il log di eventi trappola SNMP, il che è utile per controllare stampanti bloccate, senza carta, e così via; può ritrasmettere in modo semplice alcuni eventi ad un paginatore, o inviare una email.

Anche se npadmin mette a disposizione un supporto semplificato per molte interfacce SNMP delle stampanti di rete, alcune tra queste potrebbero includere ulteriori e poco comuni estensioni aggiunte dai produttori. In questo caso, si possono usare gli strumenti SNMP della CMU, che permettono operazioni SNMP GET e SET arbitrarie, come pure ricerche e simili. Con essi e con un po' di lavoro, sara' possibile usare qualunque funzione SNMP offerta dal MIB della stampante. Potrebbe essere necessario ottenere un MIB dal produttore per capire quali sono le variabili; alcune volte, i produttori pensano che gli utenti useranno solo gli strumenti proprietari che forniscono.

libprinterconf di VA Linux include del codice per trovare le stampanti di rete. Le stampanti sono identificate tramite una libreria interna contenente firme di stampanti; al momento questa libreria non è molto grande, ma include molti modelli comuni di stampanti di rete.