====== 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.''** 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''**. - 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) - Il comando **''sendfax''** sceglie il formato carta **''default''** indicato nel file **''/etc/hylafax/pagesizes''**. - Si potrebbe ignorare il default di sistema dei client HylaFax aggiungendo l'opzione **''-s a4''** al comando ''sendfax''. - 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: - Riavviare il servisio HylaFAX (**''/etc/init.d/hylafax restart''**) - 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 ls -l docq/doc*.ps. 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.ps.** 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: * /usr/share/man/man5/hylafax-config.5.gz * /usr/share/man/man5/hylafax-server.5.gz ===== 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 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"