Table of Contents

HylaFAX server

Comandi utili

Quando c'è un server HylaFAX funzionante si possono usare i seguenti comandi per testare il funzionamento:

faxstat -v
Mostra lo stato del sistema fax. Alcune informazioni sono generate dai file in /var/spool/hylafax/status/, se ci sono informazioni sballate fermare HylaFAX, cancellare i file e riavviare HylaFAX.

faxstat -v -s
Mostra lo stato della send queue.

faxrm -a -v JobID
Rimuove un job dalla send queue. Richiede la password di amministratore (-a), nel caso nostro una password qualunque.

faxalter -A -v -a now JobID
Riscehdula per adesso il fax in coda. Richiede la password di amministratore (-A), nel caso nostro una password qualunque.

sendfax -D -f info@rigacci.fax -n -m -d 0555123456 /etc/passwd
Invia il file /etc/passwd al numero indicato (-d) senza la cover page (-n) in alta risoluzione (-m), invia una mail di notifica in ogni caso (-D) all'indirizzo specificato (-f).

faxanswer
Risponde ad una chiamata fax (utile se non e' attivo l'auto answer).

Funzionamento

I processi che interessano HylaFAX sono:

faxq Gestisce la coda dei fax in uscita
hfaxd Accetta i fax da spedire dai client
faxgetty Riceve i fax in arrivo

A partire da Debian Etch vengono avviati o fermati tutti tramite /etc/init.d/hylafax {start|stop}, in precedenza invece faxgetty andava abilitato tramite /etc/inittab. Il demone hfaxd si mette in ascolto sulla porta 4559 TCP e si può provare un telnet sopra.

Installazione Debian Squeeze

Le notifiche generate dal server HylaFax vengono inviate per posta elettronica, l'indirizzo predefinito sia per il destinatario che per il mittente (vedi variabili TOADDR e FROMADDR più avanti) è FaxMaster.

Un indirizzo non qualificato (come FaxMaster) viene eventualmente qualificato dal sottosistema di posta elettronica. Con Exim4 ad esempio si utilizza il contenuto di /etc/mailname.

Fare attenzione che l'alias non qualificato FaxMaster eventualmente contenuto in /etc/aliases non viene preso in considerazione come destinatario: il sottosistema di posta qualifica il destinatario prima di prendere in considerazione gli alias.

Se si desidera che una copia di tutti i fax ricevuti venga inviata come allegato di posta elettronica (in aggiunta ai normali messaggi di notifica), è sufficiente definire la variabile SENDTO nel file di configurazione /etc/hylafax/FaxDispatch.

Ecco alcune variabili che è possibile definire nel file per controllare mittente, destinatario, indirizzo di inoltro e formato dell'allegato:

TOADDR=FaxMaster
FROMADDR=FaxMaster
SENDTO="fax@rigacci.org"
FILETYPE=pdf

Problemi con i font GhostScript

Con Debian Woody per una configurazione iniziale del sistema era necessario eseguire:

faxsetup -with-PATH_GSRIP=/usr/bin/gs

A causa di un bug nella routine che cerca i font ghostscript, al termine di faxsetup si deve cambiare manualmente /etc/hylafax/hyla.conf impostando:

FontMap:  /var/lib/defoma/gs.d/dirs/fonts
FontPath: /usr/share/fonts/type1/gsfonts

La correzione di cui sopra è fondamentale anche per usare sendfax(1) altrimenti si incorre facilmente nel messaggio di errore:

textfmt: No font metric information found for "Courier-Bold".

Configurazione di un nuovo modem: faxaddmodem

Per aggiungere un modem fax al pool di dispossitivi usati da HylaFAX si esegue faxaddmodem. Questi sono i parametri non di default specificati (vedi NOTA sotto):

Serial port:            ttyS1
CountryCode:            39
AreaCode:               ""
FAXNumber:              +39.0574.695038
LongDistancePrefix:     ""
InternationalPrefix:    00
DialStringRules:        etc/dialrules.europe
ServerTracing:          0x08501
SessionTracing:         0x08501
RecvFileMode:           0660
LogFileMode:            0640
DeviceMode:             0660
RingsBeforeAnswer:      5
SpeakerVolume:          medium
GettyArgs:              "-h %l dx_%s"
LocalIdentifier:        "LINUX.FAX"
TagLineFont:            etc/lutRS18.pcf
TagLineFormat:          "%d/%m/%Y %H:%M:%S|%%l %%n|Pagina %%P di %%T"
PercentGoodLines:       80
MaxConsecutiveBadLines: 15
MaxRecvPages:           25

I parametri specifici relativi all'hardware del modem dovrebbero essere rilevati automaticamente e quindi si lascia tutti i parametri di default. Il risultato è la creazione dei file di configurazione /etc/hylafax/config.ttyS1 e /etc/hylafax/config.

Al restart HylaFAX cerca tutti i file /etc/config.<device> e lancia un'istanza di faxgetty su di esso.

NOTA: pare impossibile specificare la stringa vuota per alcuni parametri come invece il manuale lascerebbe intendere: viene in tal caso usato il default proposto. Attenzione anche a modificare manualmente il file config.ttyS1, se poi viene eseguito nuovamente faxaddmodem alcune stringhe non vengono preservate correttamente. Ad esempio si sono impostate manualmente le due righe seguenti per avere una tagline all'inizio di ogni pagina fax trasmessa:

TagLineFont:   etc/lutRS18.pcf
TagLineFormat: "Da: %%l|%d/%m/%Y %H:%M:%S|Pagina %%P di %%T"

alla successiva esecuzione di faxaddmodem la seconda riga è stata troncata al primo spazio.

Formato pagina (papersize)

In generale la dimensione della pagina fax viene determinata dal client HylaFax. Ecco ad esempio come viene determinata da un client che utilizza OpenOffice ed il comando sendfax.

  1. OpenOffice ha una stampante di sistema HylaFax configurata tramite /usr/lib/openoffice/program/spadmin, nel file di configurazione /etc/openoffice/psprint.conf è memorizzato il comando
    Command=sendfax -h fax.rigacci.net -n -m -D -f "${USER}@rigacci.org" -d (PHONE) (TMP)
  2. Il comando sendfax sceglie il formato carta default indicato nel file /etc/hylafax/pagesizes.
  3. Si potrebbe ignorare il default di sistema dei client HylaFax aggiungendo l'opzione -s a4 al comando sendfax.
  4. Attenzione ad altri programmi di impaginazione (non OpenOffice) che potrebbero scegliere il formato carta predefinito da /etc/papersize, configurabile con paperconfig(8).

Se una pagina termina con solo spazio bianco, HylaFax la invia troncata, per far risparmiare carta al destinatario. Se si vuole modificare questo comportamento si può impostare in /etc/hylafax/config (impostazione utilizzata da faxq):

PageChop:    none

Debug e file di configurazione

ServerTracing

Tracing dei processi quando non sono in conversazione con qualche device (fax, paging service provider, …). Comprende quindi l'inizializzazione dei modem, schedulazione delle operazioni, operazioni di manutenzione generale. Una volta fatto il setup iniziale si dovrebbe poter abbassare il ServerTracing al minimo.

SessionTracing

Questo parametro controlla il logging dei processi quando comunicano attivamente con un device remoto, ad esempio la comunicazione per inviare o ricevere un fax. In un ambiente di produzione questo tracing consente di diagnosticare errori di invio/ricezione.

Attivare il debug

Un livello di debug alto si ottiene con i seguenti parametri:

ServerTracing 0x1AF0FF
SessionTracing 0x1AF0FF

che abilita il tracing di tutte queste operazioni:

1 (0x00001)         Server Operation        queue management and general operation
4 (0x00004)         Modem Operations        modem hardware manipulation
8 (0x00008)         Modem Communications    comands passed between host and modem
16 (0x00010)        Timeouts                timer operations
256 (0x00100)       Server State Transitionsserver program state transitions
512 (0x00200)       Queue Management        job queue management
2048 (0x00800)      Job Management          low-level job management
16384 (0x04000)     FIFO Messages           inter-application messages
32768 (0x08000)     Modem State Transitions modem state changes (down, busy, ready)
65536 (0x10000)     Dial Rules              dialstring rules parsing and execution
131072 (0x20000)    Docq Changes            document reference handling

I parametri possono essere messi in uno dei file di configurazione (SessionTracing comunque non ha senso in /etc/hylafax/config). Vedere più avanti quale è il più opportuno.

Tracciare un fax in uscita

A volte accade che un fax non esca dalla coda per lungo tempo. Con faxstat si vedono i JobID in coda:

faxstat  -s
HylaFAX scheduler on fax.rigacci.org: Running
Modem ttyS0 (): Running and idle

JID  Pri S  Owner Number       Pages Dials     TTS Status
5502 127 T Niccolo 0055232425    0:0   0:12
5503 127 T Niccolo 0055232425    0:0   0:12
5504 127 T Niccolo 00553232425   0:0   0:12

La terza colonna indica lo status del job, dalla manpage di faxstat(1):

T Suspended job (not being scheduled).
P Pending job (waiting for its time to send to arrive).
S Sleeping job (waiting for a scheduled timeout such as a delay between attempts to send).
B Blocked by concurrent activity to the same destination.
W Job waiting for resources such as a free modem.
R Job that is actively running.
D Job that is done and was a success.
F Job that failed to complete.

Se non si vuole indagare troppo provare:

  1. Riavviare il servisio HylaFAX (/etc/init.d/hylafax restart)
  2. Rischedulare il fax per l'invio immediato (faxalter -A -v -a now JobID)

Altrimenti un fax in uscita ha una sua entry nella sendq e un hard link al file postcript in docq:

cd /var/spool/hylafax
less sendq/q<jobID>
ls -l docq/doc*.ps.<jobID>

Verificare la riga tts (time to send job) del sendq, se è zero vuol dire che il fax è stato bloccato nella coda per qualche motivo. Utilizzare faxalter per modificare la schedulazione.

Quando un fax è stato spedito, l'hard link docq/doc<docID>.ps.<jobID> dovrebbe essere rimosso. Se questo non avviene è un problema perché poi la procedura cron faxqclean trova il doppio link e si rifiuta di rimuoverlo. Bisogna rimuoverlo manualmente.

File di configurazione

HylaFAX™ servers processes are controlled by a collection of configuration files. There is a configuration file for the faxq scheduler process, etc/config, and one file for each process that uses a modem, etc/config.device. (The hfaxd process that implements the client-server protocols also has its own configuration file.)

/etc/hylafax/config Configuration file for the faxq scheduler process.
/etc/hylafax/config.ttySN Configuration file for each process that uses a modem on /dev/ttySN.
/etc/hylafax/hfaxd.conf Configuration for the hfaxd daemon that handles the client-server protocol.
/etc/hylafax/hyla.conf Configuration fot the hylafax client.

Il parametro più importante per effettuare debug è ServerTracing, il suo valore è la combinazione (bitwise OR) dei seguenti valori:

1 (0x00001)         Server Operation        queue management and general operation
2 (0x00002)         FAX/IXO Protocol        T.30 facsimile protocol or IXO/TAP protocol
4 (0x00004)         Modem Operations        modem hardware manipulation
8 (0x00008)         Modem Communications    comands passed between host and modem
16 (0x00010)        Timeouts                timer operations
32 (0x00020)        Modem Capabilities      modem capabilities
64 (0x00040)        HDLC Frames             binary T.30 HDLC frames
128 (0x00080)       Binary Modem I/O        binary communication between host and modem
256 (0x00100)       Server State Transitionsserver program state transitions
512 (0x00200)       Queue Management        job queue management
1024 (0x00400)      Copy Quality            copy quality checking of received facsimile
2048 (0x00800)      Job Management          low-level job management
4096 (0x01000)      IXO Protocol            low-level IXO protocol
8192 (0x02000)      Config File Parsing     unknown configuration file parameters
16384 (0x04000)     FIFO Messages           inter-application messages
32768 (0x08000)     Modem State Transitions modem state changes (down, busy, ready)
65536 (0x10000)     Dial Rules              dialstring rules parsing and execution
131072 (0x20000)    Docq Changes            document reference handling

A seconda del file di configurazione dove viene specificato il parametro, cambia il significato:

/etc/hylafax/hfaxd.conf Controlla le sessioni TCP client-server, non il dialogo con i modem sulle seriali
/etc/hylafax/config Controlla il dialogo con i modem su tutte le linee seriali
/etc/hylafax/config.ttyS* Controlla il tracing specifico su questa linea seriale

Il secondo parametro utile per il debug è SessionTracing, si compone in modo identico a ServerTracing e controlla il tracing del server mentre invia o riceve fax. Lo possiamo mettere in uno di questi file di configurazione:

/etc/hylafax/config.ttyS* Controlla il tracing specifico su questa linea seriale

Vedere le man page di:

Esecuzione di script in ricezione e invio

Se si vuole eseguire degli script alla ricezione di un fax oppure in occasione delle notifiche (es. dopo l'invio), si possono predisporre degli script da eseguire al posto o prima di quelli predefiniti: faxrcvd e notify contenuti in /var/spool/hylafax/bin/.

In /etc/hylafax/config.ttyS0 è possibile indicare lo script da eseguire in ricezione:

FaxRcvdCmd:  /usr/local/bin/hylafax-faxrcvd

In /etc/hylafax/config lo script eseguito durante le notifiche (es. invio):

NotifyCmd:   /usr/local/bin/hylafax-notify

Vedere gli script originali per sapere quali sono i parametri ricevuti.

Controllo di accesso

Il demone hfaxd risponde alle interrogazioni dei client, ad esempio per sapere quali sono i fax in coda di uscita. Viene effettuato un minimo di controllo di accesso in base al nome utente, all'host di provenienza ed eventualmente richiedendo una password. La configurazione è nel file /etc/hylafax/hosts.hfaxd, ecco un esempio:

^.*@127\.0\.0\.1$:21::
^.*@192\.168\.3\..*$:21::

I quattro campi separati dai due punti sono client:uid:passwd:adminwd.

Il client è un'espressione regolare che deve combaciare con login@host, in questo caso si accettano tutti gli utenti da localhost 127.0.0.1 e dalla rete locale 192.168.3.*. Il secondo campo è il GID da utilizzare per impostare i privilegi del processo locale. Se il campo passwd se è vuoto, non viene richiesta autenticazione. Se invece il campo adminwd è vuoto non sarà possibile eseguire operazioni che richiedono privilegi di amministratore.

Server HylaFAX con firewall

Se sul server HylaFAX è in esecuzione un firewall tipo iptables che blocca le connessioni in INPUT, si possono verificare degli errori da parte dei client, ad esempio l'errore WSAETIMEDOUT di WHFC. Nel caso osservato c'erano dei tentativi da parte del client di aprire una connessione verso il server su porte effimere, che venivano bloccate:

kernel: DROP:IN=eth0 SRC=192.168.1.21 DST=192.168.1.1 DF PROTO=TCP SPT=1097 DPT=33407 WINDOW=16384 RES=0x00 SYN
kernel: DROP:IN=eth0 SRC=192.168.1.21 DST=192.168.1.1 DF PROTO=TCP SPT=1109 DPT=33408 WINDOW=16384 RES=0x00 SYN

La connessione sulla porta 4559 infatti segue lo schema del protocollo FTP: dopo aver aperto la connessione sulla porta iniziale, lo scambio dati avviene su un'altra connessione aperta su porte diverse. Se viene attivata la modalità passiva è il client ad aprire la seconda connessione usando due porte effimere.

Forse conviene disattivare la modalità passiva, in modo che sia il server ad iniziare la seconda connessione verso il client.

Con iptables è sufficiente attivare il connection tracking del protocollo FTP sulla porta 4559:

insmod ip_conntrack_ftp ports=21,4559

Gateway email-fax

Si vuole mandare mail a indirizzi del tipo Mario.Rossi@555123456.fax e fare in modo che Exim converta tutto in fax e spedisca con HylaFax.

Nella configurazione di Exim si definisce un router che intercetta tutte le mail con dominio @NNNNNNNN.fax dove NNNNNNNN e' un numero costituito da cifre e dal segno “-” con max 25 cifre. Il router quindi chiama lo specifico transport.

/etc/exim4/conf.d/router/010_local-faxmail

# This router is used to operate a fax-mail gateway. An address
# like "user@5551234567.fax" is sent as a fax using faxmail and HylaFax.
# The <user> is used as the recipient (for composing the cover etc),
# the fax nuber is extracted from the domain.
# To avoid abuse, deny open relaying for *.fax domains!
faxmail:
  driver = accept
  domains = \N^[0-9-]{1,25}\.fax$\N
  transport = faxmail

Si definisce quindi il transport che chiama il programma faxmail passando destinatario e numero del fax da chiamare:

/etc/exim4/conf.d/transport/10_local-faxmail

# This transport is used as a mail-fax gateway: do a direct
# delivery calling faxmail and HylaFax, see man faxmail(1).
faxmail:
  driver = pipe
  command ="/usr/bin/faxmail -d ${local_part}@${extract{1}{.}{$domain}} -n"