HylaFAX, costruire un FAX server con Linux

0

hylafax

Un’azienda senza FAX non esiste. E’ un dato di fatto assodato, che nessuno può negare. I tempi in cui si arriverà a comunicare solo via e-mail sono ben lontani.
Per quanto utili però i FAX presentano nel loro impiego, soprattutto in grandi aziende, qualche problema. Ad esempio i guasti meccanici o l’esaurimento dell’inchiostro, senza sottovalutare, ecologisti o meno, l’obbligo di dover usare ancora la carta.
Il conto alla fine risulta piuttosto salato e guardarsi intorno per capire se esistono alternative economiche è d’obbligo per chi vuole risparmiare.
Partendo dal presupposto che i FAX sono dati che girano su linea telefonica, si fa presto a capire come questo traffico possa essere gestito anche con un modem, via software.
Quello che cercheremo di spiegare nel corso di questo articolo è come creare e configurare un FAX Server con il software opensource HylaFAX.

Concetto e requisiti di un FAX SERVER

Un FAX SERVER è un software che gestisce il traffico di FAX attraverso un Modem collegato alla linea telefonica. I requisiti per la sua creazione sono semplicemente un PC che abbia collegato un Modem.
Il FAX SERVER usato per i test di questo articolo è una macchina con processore Celeron 300 a Mhz (32 Mb di RAM) ed un modem modello USRobotics Sportster Flash 56K, nulla di particolarmente performante quindi.
Chiaramente il sistema operativo deve essere una qualsiasi distribuzione Linux.

Installare HylaFAX

Per ovviare ad inconvenienti derivanti le dipendenze dei binari e per rendere l’articolo il più generale possibile, verrà descritta l’installazione del software HylaFAX partendo dai sorgenti. Sono però disponibili pacchetti binari per le più comuni distribuzioni, un’elenco di questi insieme ad ulteriori specifiche sulle installazioni binarie, si possono trovare a questo indirizzo : http://www.hylafax.org/howto/install.html#ss2.3
HylaFAX ha anche dei prerequisiti software che le distribuzioni più comuni rispettano nelle installazioni base, ad ogni modo un elenco dettagliato lo si trova sempre sul sito ufficiale di HylaFAX a questo indirizzo : http://www.hylafax.org/howto/install.html#ss2.2
Se si sceglie la strada dei sorgenti i passi da seguire sono i seguenti :
Dal sito ufficiale di HylaFAX è necessario scaricare la versione attuale del software. Al momento in cui scrivo questa è la 4.1.8 e l’indirizzo completo per lo scaricamento è ftp://ftp.HylaFAX.org/source/HylaFAX-4.1.8.tar.gz.
Una volta completato il download, possiamo procedere con lo scompattamento dei sorgenti, decidendo che la nostra directory di lavoro sarà /usr/src ed eseguemdo i seguenti comandi :

cd /usr/src
tar -xzvf hylafax-4.1.8.tar.gz
cd hylafax-4.1.8

A questo punto possiamo procedere installando HylaFAX con 3 semplici comandi lanciati in sequenza :

./configure && make && make install

Ci verrà chiesto di premere “invio” per ottenere la lista dei parametri di installazione configurabili (dove salvo casi particolari, lasciare i valori di default è l’ideale).
Se però ad esempio volessimo modificare uno dei parametri di defult, ad esempio la “Default Page size” da “North American Letter” a “A4” basterà rispondere “no” alla domanda “Are these ok ?”, prememere “invio” per tutte le opzioni che ci vanno bene ed immettere i nuovi valori per i parametri da modificare, nel nmostro caso, inserendo “A4” alla domanda “Default Page Size ?”.
Se tutto va a buon fine (se non lo fa, nel 99% dei casi è qualche prerequisito software a mancare ed in genere si identifica quale in base al messaggio di errore restituito) HylaFAX è stato correttamente installato nel sistema, precisamente nella directory /var/spool/HylaFAX.

Configurare il modem

Ora che HylaFAX è installato, possiamo procedere alla configurazione del modem. Intanto va identificata la porta seriale (o COM) sulla quale questo è connesso, nel nostro caso supponiamo che questa sia /dev/ttyS0.
Una volta stabilito questo possiamo lanciare il comando :

faxsetup

Da qui in poi ci verrà chiesto di :

Aggiungere un utente “FAX” agli utenti di sistema;
Aggiungere nel file /etc/aliases l’alias FaxMaster;
Indicare chi dovrà ricevere i messaggi di HylaFAX relativi alle notifiche di ricezione, ai malfunzionamenti etc.;
Indicare se sono corretti i parametri di configurazione di HylaFAX;

Per queste prime quattro domande, salvo esigenze specifiche, converrà confermare i valori suggeriti (premendo “invio”) .
Le opzioni che ci interessa settare diversamente da quanto suggerito sono le successive :

“Country code” per il quale dovremo indicare 39 (che è il numero internazionale dell’Italia);
“Area code”, cioè il prefisso (02 per Milano ad esempio);
“Long distance dialing prefix” ed ”International dialing prefix” da settare a 0 a meno che non si abbia la necessità di usare questo tipo di prefissi;
“Dial string rules file” ossia il file contenente le opzioni di chiamata personalizzate. E’ bene indicare il file etc/dialrules.europe, in quanto relativo agli utenti europei.

Seguiranno poi altre domande relative al settaggio di ulteriori parametri, dove nuovamente, dovrebbero andare bene i valori di default.
Infine ci verrà presentato il riepilogo, dove otterremo qualcosa di simile a questo :

The non-default scheduler parameters are:

CountryCode: 39
AreaCode: 02
LongDistancePrefix: 0
InternationalPrefix: 0
DialStringRules: etc/dialrules.europe

Are these ok [yes]?

Premendo “invio”, verrà creata la configurazione su file.
La successiva domanda chiede di avviare il demone HylaFAX e premendo “invio” questo verrà avviato.
La prima parte della nostra configurazione è terminata.
Possiamo procedere premendo invio alla richiesta di avviare il programma faxaddmodem per configurare il nostro dispositivo.
Dobbiamo indicare la porta seriale alla quale il modem è connesso. Come stabilito in precedenza, il nostro dispositivo è collegato alla COM1, pertanto immetteremo ttyS0 premndo “invio”.
Infine ci vengono richiesti nuovamente i dati “numerici” : Country Code (39), Area Code (02) e Phone number of FAX modem (il numero completo ad esempio +39.02.93XXXXX).
Immettiamo alla richiesta del parametro “Local identification string” un identificativo del nostro dispositivo, ad esempio “LinuxFax”, che apparirà a chi riceverà i FAX che invieremo.
I 2 prefissi da indicare successivamente possono rimanere a 0, mentre per gli altri parametri vanno bene i valori di default (tranne Dial string rules file per cui va indicato di nuovo etc/dialrules.europe e Speaker volume per cui è meglio indicare “quiet” anzichè off, così sentiremo quel bel gracchiamento tipico delle connessioni).
Terminata questa parte il programma dovrebbe chiederci se i valori che ha configurato sono ok ed interrogare il modem per definirne la velocità. Seguiranno altre domande alle quali basterà premere “invio” sino al riepilogo dei parametri passati per il dispositivo, anche questo da confermare.
Se come nel caso esempio c’è un solo modem attaccato alla macchina, rispondendo “no” alla domanda “Do you want to run faxaddmodem to configure another modem”, completeremo la procedura premendo “invio” alla domanda “Should I run faxmodem for each configured modem”.
In questo modo la configurazione del nostro dispositivo verrà terminata.
E’ da notare che tutti i dati che sono stati richiesti dal programma, possono essere modificati “a mano” editando i file relativi, che nella fattispecie sono : /var/spool/HylaFAX/etc/config e /var/spool/HylaFAX/etc/config.ttyS0.

Preparare l’esecuzione automatica del FAX SERVER

Ora che la parte software relativa ad HylaFAX è installata bisogna solamente assicurarsi che i servizi del nostro Faxserver vengano avviati automaticamente durante il boot. Essenziale è che il Faxserver “ascolti” tramite il modem le richieste di invio e ricezione. Questa operazione viene svolta da un programma denominato “faxgetty”, tale programma dovrà possedere la peculiarità di essere sempre attivo, di “risorgere” ogni qual volta è terminato (cioè ogni qualvolta un’operazione di invio o ricezione viene completata).
Per ottenere quanto spiegato è necessario modificare il file /etc/inittab, aggiungendo alla fine le righe :

# HylaFAX
mo:2345:respawn:/usr/sbin/faxgetty ttyS0

Questa riga assicurerà che all’avvio del sistema, questo processo venga considerato immortale. Per rendere comunque effettive le modifiche è sufficente lanciare il comando

init q

Completato anche quest’ultimo step, lanciamo il comando

ps -aux

e verifichiamo che tra i processi mostrati esistano quelli che interessano a noi.

uucp 16935 0.0 0.7 6048 2044 ? S 11:15 0:00 /usr/local/sbin/faxq
uucp 16937 0.0 0.6 3740 1552 ? S 11:15 0:00 /usr/local/sbin/hfaxd -i hylafax
uucp 16948 0.1 0.7 3928 1956 ? S 11:15 0:00 /usr/local/sbin/faxgetty ttyS0

I primi 2 sono relativi al demone di HylaFAX mentre l’ultima riga ci conferma l’esecuzione del “processo perenne” faxgetty.
Un’ultima verifica la si ottiene lanciando il comando “netstat” per controllare le porte tcp aperte :

netstat -atp

Se nell’elenco che appare leggiamo una riga simile a questa :

tcp   0  0 0.0.0.0:4559        0.0.0.0:*           LISTEN      27375/hfaxd

Allora abbiamo la certezza che il demone HylaFAX è in ascolto sulla sua porta di default (ossia la 4559). Tutte le richieste di invio verranno spedite alla porta in questione, dove il programma hfaxd le processerà.
A questo punto l’installazione può dirsi completata. Un’eventuale verifica potrebbe essere quella di riavviare il sistema e verificare che tutto si avvii correttamente (sempre con il comando ps -aux), ma già a questo livello, il nostro sistema è già in grado di ricevere ed inviare FAX !

Ricevere un FAX !

Un FAX è essenzialmente un file che passa attraverso la rete e la configurazione di HylaFAX che abbiamo implementato sinora prevede che per ogni FAX ricevuto, il programma metta nella directory /var/spool/HylaFAX/recvq un file tiff indicizzato sequenzialmente in base all’ordine di arrivo.
Per consultare i FAX in arrivo basta quindi aprire i file presenti in questa directory, ma si fa presto a capire che il sistema è poco pratico.
L’ideale sarebbe ricevere per ogni FAX una mail, magari che abbia in allegato un file in formato PDF pronto da stampare.
Ed è appunto quello che faremo.
E’ necessario avere installato nel nostro sistema il pacchetto sendmail (è  praticamente impossibile che  questo non venga installato).
La prima cosa da fare è quella di creare due indirizzi verso i quali HylaFAX tramite Sendmail spedirà i messaggi : il primo riceverà i messaggi di sistema (ad esempio le notifiche di avvenuta ricezione, notifiche di malfunzionamento etc.), il secondo i FAX veri e propri.
Creeremo quindi i due “Alias” FaxMaster e FaxUser editando il file /etc/alias aggiungendo le seguenti righe :

# HylaFAX
FaxMaster: root
FaxUser: nome@server.dominio

FaxMaster dovrebbe essere stato creato dall’installazione di HylaFAX, mentre chiaramente al posto di nome@server.dominio va indicato il corretto indirizzo e-mail al quale ci interessa vengano recapitati i FAX.
Per “compilare” i nuovi alias inseriti, è necessario eseguire il comando :

newaliases

Terminata la creazione degli alias bisogna preoccuparsi di dire ad HylaFAX come ed a chi spedire le mail contenenti i FAX. Per fare ciò va creato un file nella directory /var/spool/HylaFAX/etc/ denominato “FaxDispatch” :

vi /var/spool/HylaFAX/etc/FaxDispatch

All’interno di questo file devono essere indicati i parametri di dispaccio dei FAX. Se per esempio a noi interessa che tutti i FAX vengano inviati all’utente FaxUser (parametro SENDTO), in forma di allegato PDF (parametro FILETYPE, che può essere “tif”, “ps” o “PDF”) allora all’interno del file scriveremo :

FILETYPE=PDF;
SENDTO=FaxUser;
MIMENCODE=bin/uuencode_it;

Il parametro MIMENCODE necessita di un’ulteriore spiegazione : i formati PDF e tiff sono binari e non sono supportati nativamente da HylaFAX (lo saranno dalla versione 4.2), pertanto hanno bisogno di essere codificati “manualmente”. Ciò che quindi viene indicato con il parametro MIMENCODE è il programma da utilizzare per codificare i file. Chiaramente bin/uuencode_it non esiste, ma può essere facilmente creato, così :

vi /var/spool/HylaFAX/bin/uuencode_it

Ciò che va inserito all’interno di questo è quanto segue :

#!/bin/sh
uuencode -m $1 $1 | grep -E -v "^begin|^====$" 2>/dev/null

Una volta salvato il file e resolo eseguibile con il comando

chmod 755 /var/spool/HylaFAX/bin/uuencode_it

HylaFAX ha tutto quanto gli serve per soddisfare le nostre richieste : nel momento in cui riceverà un documento, notificherà la ricezione all’utente “FaxMaster” (ossia root) e manderà una mail a “FaxUser” (ossia l’indirizzo mail che ci interessa) con in allegato il FAX ricevuto in formato PDF.
Non rimane altro da fare che spedire un FAX al numero di telefono della linea collegata al nostro dispositivo.
Possiamo sempre controllare il regolare seguirsi delle operazioni con il comando :

tail -f /var/log/messages

Se leggiamo qualcosa di simile a questo :

Jul 29 13:26:17 problema FaxGetty[27671]: ANSWER: FAX CONNECTION  DEVICE '/dev/ttyS0'
Jul 29 13:27:01 problema FaxGetty[27671]: RECV FAX (00000001): from +39 2 9374114, page 1 in 0:37, INF, 3.85 line/mm, 2-D MR
, 14400 bit/s
Jul 29 13:27:01 problema FaxGetty[27671]: RECV FAX (00000001): recvq/fax00001.tif from +39 2 93XXXXX, route to <
, 1 pages in 0:44
Jul 29 13:27:03 problema FaxGetty[27671]: RECV FAX: bin/faxrcvd "recvq/fax00001.tif" "ttyS0" "00000001" "" "" ""

Dovremo trovarci nella casella di root il messaggio di conferma avvenuta ricezione contenente un testo simile a questo :

Date: Mon, 29 Jul 2004 13:27:34 +0200
From: The HylaFAX Receive Agent 
To: FaxMaster@problema
Subject: Facsimile received from  +39 2 93XXXXX

recvq/fax00001.tif (ftp://problema:4559/recvq/fax00001.tif):
Sender: +39 2 93XXXXX
Pages: 1
Quality: Normal
Page: ISO A4
Received: 2004:08:02 16:31:54
TimeToRecv: 0:25
SignalRate: 14400 bit/s
DataFormat: 2-D MR
ReceivedOn: ttyS0
CommID: c00000001 (ftp://problema:4559/log/c00000001)

The facsimile was automatically dispatched to: FaxUser.

chiaramente all’indirizzo mail corrispondente all’alias FaxUser troveremo il messaggio con in allegato il file PDF (Figura 1).

Figura 1
Figura 1

Inviare un FAX !

Inviare un FAX è un’operazione ancora più semplice. Effetuiamo un test di funzionamento da riga di comando digitando :

sendfax -n -d 0293XXXXX /etc/passwd

Se il comando restituisce

request id is 1 (group id 1) for host localhost (1 file)

Vuol dire che il nostro FAX è stato accodato con successo. Per seguire nel dettaglio le operazioni che varranno svolte basta lanciare il comando :

tail -f /var/log/messages

Se leggiamo qualcosa di simile a questo :

Jul 29 12:09:38 problema FaxQueuer[27373]: SUBMIT JOB 1
Jul 29 12:12:32 problema FaxSend[27824]: MODEM U.S. ROBOTICS 56K VOICE EXT REV. 12.1.0 5601/
Jul 29 12:12:32 problema FaxSend[27824]: SEND FAX: JOB 1 DEST 0293XXXXX COMMID 00000002 DEVICE '/dev/ttyS0'
Jul 29 12:13:28 problema FaxSend[27824]: SEND FAX: JOB 1 SENT in 0:24

Il nostro Invio ha avuto successo.
Supportando HylaFAX anche l’invio di file PDF, possiamo fare un’ulteriore test di invio di questo tipo :

sendfax -n -d 0293XXXXX nomefile.PDF

In questi esempi è stato il programma sendfax che funziona a riga di comando, certo non rappresenta una comodità assoluta, ed è per questo che sono disponibili una numerosa quantità di Client (anche per Microsoft Windows), in modo da non dover scrivere a mano ogni volta il comando di invio.
Una panoramica dei client disponibili la si trova quì : http://www.hylafax.org/howto/faxing.html . Tutti i software che vengono indicati lavorano sul presupposto che ci sia in rete (o localmente) un Faxserver in ascolto sulla porta 4559 (salvo impostazioni particolari) ed effettuano richieste di invio in una forma del tutto simile a quanto illustrato sopra, con l’unica differenza che i comandi sono del tutto trasparenti all’utente.
Va ricordato che ogni macchina della rete sulla quale è installato un client HylaFAX, per utilizzare le funzionalità del Faxserver, deve essere elencata nel file /var/spool/hylafax/etc/hosts.hfaxd in questa forma :

localhost
127.0.0.1

Per concludere l’argomento “invio” affronteremo un ultimo, utile e comodissimo metodo per la gestione dei fax in uscita : tramite e-mail.
Esiste infatti la possibilità di configurare il proprio Mailserver (nel nostro caso Sendmail) affinchè gestisca indirizzi e-mail particolari strutturati in questo modo : nome@numero.fax, la parte a sinistra del carattere @ può contenere il nominativo del destinatario, mentre quanto sta a destra di @ deve essere il numero di telefono del destinatario seguito dal suffisso “.fax”.
Per ottenere questa funzionalità da Sendmail è sufficente aggiungere nel file di configurazione, che generalmente si trova al percorso /etc/mail/sendmail.mc, prima delle righe di chiusura

MAILER(smtp)dnl
MAILER(procmail)dnl
Cwlocalhost.localdomain

le seguenti righe :

define(`FAX_MAILER_PATH',`/usr/local/bin/faxmail')dnl
define(`FAX_MAILER_ARGS',`faxmail -d -n -p 12pt $u@$h $f')dnl
MAILER(`fax')dnl

Quanto indicato permette a sendmail, una volta ricevuta la richiesta di invio mail ad un indirizzo “.fax”, di lanciare il comando faxmail, che converte appunto il messaggio ricevuto da sendmail come standard input in un file formato .ps (postscriptum). Le opzioni che vengono passate al comando in questione hanno questo significato :

-d : indica a faxmail di spedire l’output direttamente al Faxserver (vedremo in seguito come fare se il Faxserver non è la stessa macchina del mail server);
-n : indica di non generare automaticamente la copertina del fax;
-p 12pt : indica la grandezza in punti del font usato per i fax;
$u@$h $f : rappresenta invece l’indirizzo che abbiamo indicato nel campo A: della nostra mail;

Una volta inserite le righe indicate nel file di configurazione di Sendmail, è necessario ricompilare il file effettivo e riavviare il servizio Sendmail :

m4 sendmail.mc > sendmail.cf
/etc/init.d/sendmail restart

Ovviamente i path per la ricompilazione tramite m4 del file di configurazione di Sendmail dipendono dalla distribuzione che si usa.
A questo punto Sendmail girerè tutte le mail il cui indirizzo di destinazione è strutturato nella forma nome@numero.fax al nostro Faxserver. Va aggiunto che le mail possono comprendere anche allegati di tipo testo, che vengono accodati al testo delle mail.
In Figura 2 c’è un esempio di come è strutturato il messaggio che diventerà FAX, mentre la Figura 3 presenta quanto ricevuto : un foglio A4, con la nostra mail convertita in FAX.

Figura 2
Figura 2
Figura 3
Figura 3

Nell’eventualità, non così remota, che il Mailserver ed il Faxserver non siano la stessa macchina, è necessario installare la parte client di HylaFAX sulla macchina Mailserver. Per “parte client” si intende l’insieme dei comandi base di HylaFAX (tra i quali il famoso “faxmail”), necessari per ridirezionare il traffico fax dal Mailserver al Faxserver.
I passi da seguire sono del tutto simili a quelli di un’installazione standard, varia solo l’ultimo comando da dare, che al posto di essere “make install” è “make installClient” :

cd /usr/src
tar -xzvf hylafax-4.1.8.tar.gz
cd hylafax-4.1.8
./configure && make && make installClient

Una volta installato quanto indicato, l’ultimo passo per completare la configurazione è quello di creare un file denominato hyla.conf nella cartella /usr/local/lib/fax:

vi /usr/local/lib/fax/hyla.conf

al cui interno va indicata l’opzione Host, che indica ad hylafax che il Faxserver è una macchina remota. Host può essere un nome risolto dal Dns o semplicemente un indirizzo IP :

Host=x.y.z.k

oppure

Host=nomehost

Se non viene indicato nulla in questo file, le richieste di invio verranno girate a localhost dove, non esistendo alcun demone in ascolto alla porta 4559 di HylaFAX, restituiranno un errore.
L’ultima considerazione riguarda il fatto che essendo il Mailserver una macchina esterna a localhost, il nome o l’indirizzo IP di questa va inserito nel file /var/spool/hylafax/etc/hosts.hfaxd.

Casi particolari

Mettere lo 0 prima di effettuare il numero

Se la vostra linea telefonica è gestita da un centralino, per effettuare chiamate potreste essere obbligati a digitare uno 0 prima del numero effettivo. Per automatizzare l’immissione di questo direttamente da HylaFAX e gestire i numeri senza alcun ulteriore prefisso, basterà aggiungere nel file /var/spool/HylaFAX/etc/dialrules.europe prima del carattere “]” nell’ultima riga, questo testo :

^[0-9]{4,}$ = 0,&

Questo indicherà ad HylaFAX di inviare 0, aspettare 1 secondo (la virgola) e solo allora fare il numero;

L’errore “no local dialtone”

Lavorando con modem recenti non dovrebbero esistere problemi di questo tipo, in caso contratio provate a commentare queste opzioni del file /var/spool/HylaFAX/etc/config.ttyS0 con il caratere # :

#ModemSetupDTRCmd: ATS13=1&D2 # setup so DTR drop resets modem
#ModemSetupDCDCmd: AT&C1 # setup so DCD reflects carrier (or not)
#ModemNoFlowCmd: AT&H0&I0&R1 # setup modem for no flow control
#ModemHardFlowCmd: AT&H1&I0&R2 # setup modem for hardware flow control
#ModemSoftFlowCmd: AT&H2&I2&R1 # setup modem for software flow control
#ModemResultCodesCmd: ATQ0X4 # enable result codes
#
#ModemMfrQueryCmd: !USR
#ModemModelQueryCmd: ATI3
#ModemRevQueryCmd: ATI7 # XXX returns a multi-line result

e ad aggiungere invece questa riga :

ModemResetCmds: ATX3

Questo indicherà al modem di usare il comando ATX3 per effetuare il Reset, e dovrebbe sistemare il problema della mancanza di dialtone;

Conclusioni

In pochi passi, siamo riusciti a creare uno strumento utile che ci permetterà di risparmiare soldi in carta, inchiostro ed assistenza alla cifra di zero euro nette.
Ricordo che per qualsiasi problema, HylaFAX possiede un’ottima documentazione disponibile come già indicato al seguente indirizzo : http://www.hylafax.org/howto/index.html

Questo articolo è originariamente apparso nell’edizione italiana di Linux Journal nel Novembre 2004.

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.