Fax-Server mit HylaFAX+ unter CentOS 6.x
HylaFAX+ ist eine OpenSource Fax-Serverlösung mit dem klingenden Slogan:
HylaFAX™ is an enterprise-class open-source system for sending and receiving facsimiles as well as for sending alpha-numeric pages. The „+“ means that it is better.The world's most advanced open source fax server.
Da es für HylaFAX+ ein bereits vorgefertigtes RPM aus dem EPEL-Repository gibt, brauchen wir nicht mehr selber Hand anlegen und HylaFAX aus den Quellen selbst übersetzen und installieren.
Ein ausführliches How-To findet man ebenso wie die Manpage-List auf der sourceforge.net Project Page.
Installation
Die Installation geht wie gewohnt sehr einfach von statten.
# yum install hylafax+ hylafax+-client -y
Nach der erfolgreichen Installation können wir uns mittels rpm -qil hylafax+ einen Überblick verschaffen, welche Dateien installiert und wohin diese gespeichert worden sind.
# rpm -qil hylafax+
Name : hylafax+ Relocations: (not relocatable) Version : 5.5.4 Vendor: Fedora Project Release : 1.el6 Build Date: Wed 07 Aug 2013 06:55:00 AM CEST Install Date: Fri 13 Dec 2013 01:27:57 PM CET Build Host: buildvm-13.phx2.fedoraproject.org Group : Applications/Communications Source RPM: hylafax+-5.5.4-1.el6.src.rpm Size : 2196979 License: libtiff and BSD with advertising Signature : RSA/8, Wed 07 Aug 2013 06:00:52 PM CEST, Key ID 3b49df2a0608b895 Packager : Fedora Project URL : https://hylafax.sourceforge.net Summary : An enterprise-strength fax server Description : HylaFAX(tm) is a enterprise-strength fax server supporting Class 1 and 2 fax modems on UNIX systems. It provides spooling services and numerous supporting fax management tools. The fax clients may reside on machines different from the server and client implementations exist for a number of platforms including windows. /etc/cron.daily/hylafax+ /etc/cron.hourly/hylafax+ /etc/hylafax /etc/hylafax/hfaxd.conf /etc/rc.d/init.d/hylafax+ /etc/sysconfig/hylafax+ /usr/lib64/libfaxserver.so.5.5.4 /usr/sbin/choptest /usr/sbin/cqtest /usr/sbin/faxabort /usr/sbin/faxaddmodem /usr/sbin/faxadduser /usr/sbin/faxanswer /usr/sbin/faxconfig /usr/sbin/faxcron /usr/sbin/faxdeluser /usr/sbin/faxgetty /usr/sbin/faxlock /usr/sbin/faxmodem /usr/sbin/faxmsg /usr/sbin/faxq /usr/sbin/faxqclean /usr/sbin/faxquit /usr/sbin/faxsend /usr/sbin/faxstate /usr/sbin/hfaxd /usr/sbin/hylafax /usr/sbin/lockname /usr/sbin/ondelay /usr/sbin/pagesend /usr/sbin/probemodem /usr/sbin/recvstats /usr/sbin/tagtest /usr/sbin/tsitest /usr/sbin/xferfaxstats /usr/share/doc/hylafax+-5.5.4 /usr/share/doc/hylafax+-5.5.4/CHANGES /usr/share/doc/hylafax+-5.5.4/CONTRIBUTORS /usr/share/doc/hylafax+-5.5.4/COPYRIGHT /usr/share/doc/hylafax+-5.5.4/README /usr/share/doc/hylafax+-5.5.4/TODO /usr/share/doc/hylafax+-5.5.4/VERSION /usr/share/man/man5/doneq.5f.gz /usr/share/man/man5/hosts.hfaxd.5f.gz /usr/share/man/man5/hylafax-config.5f.gz /usr/share/man/man5/hylafax-info.5f.gz /usr/share/man/man5/hylafax-log.5f.gz /usr/share/man/man5/hylafax-server.5f.gz /usr/share/man/man5/hylafax-shutdown.5f.gz /usr/share/man/man5/pagermap.5f.gz /usr/share/man/man5/recvq.5f.gz /usr/share/man/man5/sendq.5f.gz /usr/share/man/man5/status.5f.gz /usr/share/man/man5/tsi.5f.gz /usr/share/man/man5/xferfaxlog.5f.gz /usr/share/man/man8/choptest.8c.gz /usr/share/man/man8/cqtest.8c.gz /usr/share/man/man8/faxabort.8c.gz /usr/share/man/man8/faxaddmodem.8c.gz /usr/share/man/man8/faxadduser.8c.gz /usr/share/man/man8/faxanswer.8c.gz /usr/share/man/man8/faxconfig.8c.gz /usr/share/man/man8/faxcron.8c.gz /usr/share/man/man8/faxdeluser.8c.gz /usr/share/man/man8/faxgetty.8c.gz /usr/share/man/man8/faxlock.8c.gz /usr/share/man/man8/faxmodem.8c.gz /usr/share/man/man8/faxmsg.8c.gz /usr/share/man/man8/faxq.8c.gz /usr/share/man/man8/faxqclean.8c.gz /usr/share/man/man8/faxquit.8c.gz /usr/share/man/man8/faxrcvd.8c.gz /usr/share/man/man8/faxsend.8c.gz /usr/share/man/man8/faxstate.8c.gz /usr/share/man/man8/hfaxd.8c.gz /usr/share/man/man8/hylafax.8c.gz /usr/share/man/man8/jobcontrol.8c.gz /usr/share/man/man8/lockname.8c.gz /usr/share/man/man8/mkcover.8c.gz /usr/share/man/man8/notify.8c.gz /usr/share/man/man8/ondelay.8c.gz /usr/share/man/man8/pagesend.8c.gz /usr/share/man/man8/pollrcvd.8c.gz /usr/share/man/man8/probemodem.8c.gz /usr/share/man/man8/ps2fax.8c.gz /usr/share/man/man8/recvstats.8c.gz /usr/share/man/man8/tagtest.8c.gz /usr/share/man/man8/tsitest.8c.gz /usr/share/man/man8/wedged.8c.gz /usr/share/man/man8/xferfaxstats.8c.gz /var/spool/hylafax /var/spool/hylafax/archive /var/spool/hylafax/bin/archive /var/spool/hylafax/bin/auto-rotate.ps /var/spool/hylafax/bin/dict/de /var/spool/hylafax/bin/dict/en /var/spool/hylafax/bin/dict/es /var/spool/hylafax/bin/dict/fr /var/spool/hylafax/bin/dict/it /var/spool/hylafax/bin/dict/nl_BE /var/spool/hylafax/bin/dict/pl /var/spool/hylafax/bin/dict/pt /var/spool/hylafax/bin/dict/pt_BR /var/spool/hylafax/bin/dict/ro /var/spool/hylafax/bin/dict/ru /var/spool/hylafax/bin/dict/sr /var/spool/hylafax/bin/dict/tr /var/spool/hylafax/bin/dict/uk /var/spool/hylafax/bin/dict/zh /var/spool/hylafax/bin/dictionary /var/spool/hylafax/bin/faxrcvd /var/spool/hylafax/bin/mkcover /var/spool/hylafax/bin/notify /var/spool/hylafax/bin/pollrcvd /var/spool/hylafax/bin/qp-encode.awk /var/spool/hylafax/bin/rfc2047-encode.awk /var/spool/hylafax/bin/wedged /var/spool/hylafax/client /var/spool/hylafax/config /var/spool/hylafax/config/att-dataport /var/spool/hylafax/config/att-dataport-2 /var/spool/hylafax/config/att-dataport-2.0 /var/spool/hylafax/config/att-dpexpress-2 /var/spool/hylafax/config/cirrus /var/spool/hylafax/config/class1 /var/spool/hylafax/config/class1.0 /var/spool/hylafax/config/class2 /var/spool/hylafax/config/class2.0 /var/spool/hylafax/config/class2.1 /var/spool/hylafax/config/conexant-1.0 /var/spool/hylafax/config/davicom-2 /var/spool/hylafax/config/digi /var/spool/hylafax/config/digi-2 /var/spool/hylafax/config/digi-20 /var/spool/hylafax/config/dsi-scout+ /var/spool/hylafax/config/e-tech /var/spool/hylafax/config/eicon /var/spool/hylafax/config/eicon-2 /var/spool/hylafax/config/elsa-microlink-56k-basic-2.0 /var/spool/hylafax/config/everex-2496d /var/spool/hylafax/config/exar /var/spool/hylafax/config/gvc-288 /var/spool/hylafax/config/gvc-288-2 /var/spool/hylafax/config/hayes /var/spool/hylafax/config/i537ep /var/spool/hylafax/config/iaxmodem /var/spool/hylafax/config/intel-400e /var/spool/hylafax/config/ip568x /var/spool/hylafax/config/linux-isdn-2 /var/spool/hylafax/config/lucent /var/spool/hylafax/config/lucent-isa /var/spool/hylafax/config/lucent-mt-10 /var/spool/hylafax/config/lucent-mt-2 /var/spool/hylafax/config/lucent-mt-20 /var/spool/hylafax/config/lucent-mt-21 /var/spool/hylafax/config/mainpine-10 /var/spool/hylafax/config/mainpine-2 /var/spool/hylafax/config/mainpine-20 /var/spool/hylafax/config/mainpine-21 /var/spool/hylafax/config/moto-288 /var/spool/hylafax/config/mt-1432 /var/spool/hylafax/config/nuvo-voyager /var/spool/hylafax/config/ppi-pm14400fxmt /var/spool/hylafax/config/ppi-pm14400fxsa /var/spool/hylafax/config/prometheus /var/spool/hylafax/config/rc144ac /var/spool/hylafax/config/rc144ac-1 /var/spool/hylafax/config/rc288dpi /var/spool/hylafax/config/rc288dpi-1 /var/spool/hylafax/config/rc32acl /var/spool/hylafax/config/rc32acl-1 /var/spool/hylafax/config/rockwell-k56 /var/spool/hylafax/config/rockwell-rc /var/spool/hylafax/config/sierra /var/spool/hylafax/config/skel /var/spool/hylafax/config/t38modem /var/spool/hylafax/config/telebit-qblazer /var/spool/hylafax/config/telebit-t3000 /var/spool/hylafax/config/telebit-wb /var/spool/hylafax/config/topic /var/spool/hylafax/config/tricom2842 /var/spool/hylafax/config/uds-fastalk /var/spool/hylafax/config/umc92144 /var/spool/hylafax/config/umc9624 /var/spool/hylafax/config/usr-2.0 /var/spool/hylafax/config/usr-rts /var/spool/hylafax/config/usr-xon /var/spool/hylafax/config/zyxel-1496e /var/spool/hylafax/config/zyxel-1496e-1 /var/spool/hylafax/config/zyxel-1496e-2.0 /var/spool/hylafax/config/zyxel-2864 /var/spool/hylafax/dev /var/spool/hylafax/docq /var/spool/hylafax/doneq /var/spool/hylafax/etc /var/spool/hylafax/etc/LiberationSans-25.pcf /var/spool/hylafax/etc/cover.templ /var/spool/hylafax/etc/hosts.hfaxd /var/spool/hylafax/etc/lutRS18.pcf /var/spool/hylafax/etc/xferfaxlog /var/spool/hylafax/info /var/spool/hylafax/log /var/spool/hylafax/pollq /var/spool/hylafax/recvq /var/spool/hylafax/sendq /var/spool/hylafax/status /var/spool/hylafax/tmp
# rpm -qil hylafax+-client
Name : hylafax+-client Relocations: (not relocatable) Version : 5.5.4 Vendor: Fedora Project Release : 1.el6 Build Date: Wed 07 Aug 2013 06:55:00 AM CEST Install Date: Thu 02 Jan 2014 06:44:50 PM CET Build Host: buildvm-13.phx2.fedoraproject.org Group : Applications/Communications Source RPM: hylafax+-5.5.4-1.el6.src.rpm Size : 1091198 License: libtiff and BSD with advertising Signature : RSA/8, Wed 07 Aug 2013 06:01:18 PM CEST, Key ID 3b49df2a0608b895 Packager : Fedora Project URL : https://hylafax.sourceforge.net Summary : Client programs for HylaFAX fax servers Description : HylaFAX(tm) is a enterprise-strength fax server supporting Class 1 and 2 fax modems on UNIX systems. This package provides fax clients which may reside on machines different from the server. /etc/hylafax /etc/hylafax/faxcover.ps /etc/hylafax/faxmail /etc/hylafax/faxmail.ps /etc/hylafax/faxmail/application /etc/hylafax/faxmail/application/octet-stream /etc/hylafax/faxmail/application/pdf /etc/hylafax/faxmail/image /etc/hylafax/faxmail/image/tiff /etc/hylafax/pagesizes /etc/hylafax/typerules /usr/bin/faxalter /usr/bin/faxcover /usr/bin/faxmail /usr/bin/faxrm /usr/bin/faxstat /usr/bin/sendfax /usr/bin/sendpage /usr/lib64/libfaxutil.so.5.5.4 /usr/sbin/dialtest /usr/sbin/edit-faxcover /usr/sbin/faxfetch /usr/sbin/faxinfo /usr/sbin/faxsetup /usr/sbin/faxsetup.linux /usr/sbin/faxwatch /usr/sbin/textfmt /usr/sbin/tiffcheck /usr/sbin/typetest /usr/share/doc/hylafax+-client-5.5.4 /usr/share/doc/hylafax+-client-5.5.4/CHANGES /usr/share/doc/hylafax+-client-5.5.4/CONTRIBUTORS /usr/share/doc/hylafax+-client-5.5.4/COPYRIGHT /usr/share/doc/hylafax+-client-5.5.4/README /usr/share/doc/hylafax+-client-5.5.4/TODO /usr/share/doc/hylafax+-client-5.5.4/VERSION /usr/share/man/man1/edit-faxcover.1.gz /usr/share/man/man1/faxalter.1.gz /usr/share/man/man1/faxcover.1.gz /usr/share/man/man1/faxmail.1.gz /usr/share/man/man1/faxrm.1.gz /usr/share/man/man1/faxstat.1.gz /usr/share/man/man1/hylafax-client.1.gz /usr/share/man/man1/sendfax.1.gz /usr/share/man/man1/sendpage.1.gz /usr/share/man/man1/sgi2fax.1.gz /usr/share/man/man1/textfmt.1.gz /usr/share/man/man5/dialrules.5f.gz /usr/share/man/man5/pagesizes.5f.gz /usr/share/man/man5/typerules.5f.gz /usr/share/man/man8/dialtest.8c.gz /usr/share/man/man8/faxfetch.8c.gz /usr/share/man/man8/faxinfo.8c.gz /usr/share/man/man8/faxsetup.8c.gz /usr/share/man/man8/faxsetup.linux.8c.gz /usr/share/man/man8/faxwatch.8c.gz /usr/share/man/man8/pdf2fax.8c.gz /usr/share/man/man8/tiff2fax.8c.gz /usr/share/man/man8/tiffcheck.8c.gz /usr/share/man/man8/typetest.8c.gz /var/spool/hylafax /var/spool/hylafax/bin/common-functions /var/spool/hylafax/bin/genfontmap.ps /var/spool/hylafax/bin/pcl2fax /var/spool/hylafax/bin/pdf2fax.gs /var/spool/hylafax/bin/ps2fax.gs /var/spool/hylafax/bin/tiff2fax /var/spool/hylafax/bin/tiff2pdf /var/spool/hylafax/etc /var/spool/hylafax/etc/dialrules /var/spool/hylafax/etc/dialrules-pabx.be /var/spool/hylafax/etc/dialrules.europe /var/spool/hylafax/etc/dialrules.ext /var/spool/hylafax/etc/dialrules.sf-ba /var/spool/hylafax/etc/dialrules.uk /var/spool/hylafax/etc/dialrules.world
Konfiguration
Bei der Konfiguration unseres Faxservers gibt es nun zu berücksichtigen, an welcher TK-Anlage der Fax-Server betrieben werden soll.
- Analoge Nebenstelle einer TK-Anlage
- Integration in einem VoIP-Server Asterisk
1. Analoge Nebenstelle einer TK-Anlage
Zum Anschluß unseres Fax-Servers an einem analogen Port einer TK-Anlage benötigen wie einen entsprechenden Modem, in dem folgendem Beispiel gehen wir von einem vorhandenen ELSA-USB Modem aus.
Nach dem Anstecken des Modems an den USB-Port wird dies im syslog entsprechend quittiert:
Dez 12 9:30:40 elwms kernel: ohci_hcd 0000:00:12.0: wakeup Dez 12 9:30:40 elwms kernel: usb 3-1: new full speed USB device using ohci_hcd and address 10 Dez 12 9:30:40 elwms kernel: usb 3-1: configuration #2 chosen from 2 choices Dez 12 9:30:40 elwms kernel: cdc_acm 3-1:2.0: ttyACM0: USB ACM device Dez 12 9:30:40 elwms kernel: usbcore: registered new driver cdc_acm Dez 12 9:30:40 elwms kernel: drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters
Somit ist schon mal sichergestellt, dass wir den Modem über das Gerät ttyACM0 ansprechen können.
# ll /dev/ttyACM0
crw-rw---- 1 root uucp 166, 0 27. Sep 16:10 /dev/ttyACM0
Da wir den Modem später über die Gerätedatei /dev/modem ansprechen wollen (wer will schon immer bei einem Gerätewechsel diverse Konfigscripte abändern?) setzen wir uns noch einen symbolischen link.
# ln -s /dev/ttyACM0 /dev/modem
Bei Bedarf können wir nun noch kontrollieren, ob der gewünschte Symlink richtig gesetzt wurde.
# ll /dev/mo*
lrwxrwxrwx 1 root root 12 27. Sep 17:52 /dev/modem -> /dev/ttyACM0
Damit nun bei jedem Neustart des Systemes dieser symlink automatisch gesetzt wird, ergänzen wir in der /etc/udev/rules.d/50-udev.rules einfach folgende Zeilen:
# vim /etc/udev/rules.d/50-udev.rules</code>
- /etc/udev/rules.d/50-udev.rule
# Django : 2012-12-12 # symlink dauerhaft für /dev/modem setzen KERNEL=="ttyACM0", SYMLINK+="modem"
2. Integration in einem VoIP-Server Asterisk
Betreiben wir einen VoIP-Server Asterisk so ist es zweckmäßiger den Faxserver direkt in den Asterisk-Server zu integrieren. Hierzu verwenden wir das Programm IAXmodem, welches einen Modem emuliert.
Download
Im ersten Schritt holen wir uns uns die Programm-Sourcen auf unseren Rechner.
# cd /usr/local/src/
# wget https://downloads.sourceforge.net/project/iaxmodem/iaxmodem/iaxmodem-1.2.0/iaxmodem-1.2.0.tar.gz
Quellen entpacken
Anschließend entpacken wir die Sourcen und setzen uns einen Symlink auf das Programmverzeichnis.
# tar -xzvf iaxmodem-1.2.0.tar.gz
# ln -s iaxmodem-1.2.0 iaxmodem
Zum Schluß verschieben wir noch das tar.gz-Archiv ins Verzeichnis packages.
# mv /usr/local/src/iaxmodem-1.2.0.tar.gz /usr/local/src/packages/
Quellen installieren
Damit wir IAXmodem übersetzen können, installieren wir noch das Paket libtiff-devel, da auf dieses Paket beim nachfolgenden Installtionsablauf zurück gegriffen wird.
# yum install libtiff-devel -y
Bevor wir uns nun daran machen, die Quellen zu übersetzen, werfen wir noch einen Blick in die Hinweisdoku README.
# less /usr/local/src/iaxmodem/README
** ABOUT IAXMODEM ** IAXmodem is a software modem written in C that uses an IAX channel (commonly provided by an Asterisk PBX system) instead of a traditional phone line and uses a DSP library instead of DSP hardware chipsets. To accomplish this, then, IAXmodem interfaces an IAX library known as libiax2 with a DSP library known as spandsp, and then IAXmodem interfaces the DSP library with a tty device node for interfacing with modem (fax) applications. IAXmodem comes with a copy of both libiax2 and spandsp. Both of these libraries may have had bugs fixed or enhancements added for specific use with IAXmodem. Although these changes are submitted to the library authors/maintainers and may be committed to the upstream repositories, it is recommended that the versions here be used for iaxmodem if only for the reason that these versions have been tested and are known to work. If you are using other applications that require a different libiax2 or spandsp version then iaxmodem can be statically linked to the libraries after building the versions here (but not installing them). See the part about "build static" below. Currently supported platforms are GNU/Linux on x86 hardware. The libiax2 source was pulled from iaxclient SVN on December 23, 2007. The spandsp source is spandsp-0.0.5 snapshot 20080725. IAXmodem should usually be installed either on the same machine as the Asterisk server or on a system that is very close to the Asterisk server on a controlled network. Do not even bother trying to use IAXmodem to send faxes through your IAX-supporting VoIP provider, it won't work reliably, if at all. Please see the FAQ file for more information regarding IAXmodem. ** INSTALLING IAXMODEM ** There are two ways to build IAXmodem. One way uses dynamic libraries; the other way uses static libraries. If you already have an installation of an incompatible spandsp or libiax2 on the system, then you should probably build using static libraries. To install libiax2: (if you're not going to 'build static') # cd lib/libiax2 # ./configure # make # make install To install spandsp: (if you're not going to 'build static') # cd lib/spandsp # ./configure # make # make install If you're building with dynamic libraries, make sure that your linker can find these libraries by having a line in your /etc/ld.so.conf file that is "/usr/local/lib" and running 'ldconfig' afterwards. To build IAXmodem with dynamic linking: # ./build To build IAXmodem with static linking: # ./build static This will create the iaxmodem binary. You may run the binary from its present location, or you may copy it to any location that you may choose. The build script also accepts one other command-line option: -bsdptys. This option must come first, like this: # ./build -bsdptys Alternatively you can build IAXmodem with static linking by running the more traditional: # ./configure # make Create the /etc/iaxmodem directory. The modem configuration files will be stored in here. With your favorite editor edit the prototype modem configuration file, iaxmodem-cfg.ttyIAX. Alter the configuration lines as needed and desired. The "device" entry is the full name of the device that you will be using in your modem application. If running multiple instances of iaxmodem then you will need a different device for each instance. The "owner" entry (formatted "user:group") is the system user and group that IAXmodem should use for the created device. The "mode" entry is the permissions mode for the created device. The "port" entry refers to the preferred port number on which to listen for communications from the Asterisk server (so if you're using more than one IAXmodem on a single IP address you will need to have each IAXmodem configuration use a different port). You should not use "4569" if Asterisk is already listening on port 4569. The "refresh" entry indicates the preference on how frequently to refresh the registration with the Asterisk server. (However, the actual refresh value that is used will be negotiated between IAXmodem and the Asterisk server.) By setting this to a value of "0" (zero), IAXmodem will not register with the server, and thus the server should be configured to communicate with IAXmodem on a static address. The "server", "peername", and "secret" entries refer to the server name (or address), the registered peer name for the IAXmodem client, and the registered secret (password) for the IAXmodem client. The entries "cidname" and "cidnumber" refer to the Caller*ID presentation that will be made by IAXmodem to the Asterisk server. The "codec" entry refers to the preferred audio codec. This can be "slinear", "ulaw", or "alaw". The "record" entry causes audio files to be recorded (see below). The "replay" entry causes the audio files to be replayed back (see below). The "nojitterbuffer" entry disables the very simple iaxmodem jitterbuffer (see below). The "iax2debug" entry enables debugging output for IAX2. The "dspdebug" entry enables debugging output for the DSPs. The "nodaemon" entry exempts the modem from inclusion with daemon use. Comments can be placed into the IAXmodem configuration files by beginning them with a semicolon (";"). Now copy this file to the /etc/iaxmodem directory with a unique file name. The name of the file will serve as the identifier, if you choose to launch iaxmodem in non-daemon mode (see below). ** RUNNING IAXMODEM ** Now you are ready to start IAXmodem. IAXmodem can be run in two manners, daemon mode, or non-daemon. Initially you should probably run iaxmodem at least once in non-daemon mode, just to make sure things are working (that iaxmodem registers). ---------- In non-daemon mode, IAXmodem is started by supplying the configuration identifier as the only command-line parameter, like this: /path/to/iaxmodem ttyIAX In this example the modem configuration file is expected to be: /etc/iaxmodem/ttyIAX You should probably run IAXmodem like this at least once to check to see that registration occurs properly (then press ^C to exit). In non-daemon mode IAXmodem does not detach itself from the controlling tty, and it does send logging data both to standard output (informational items) and to standard error (errors). As this logging can be a bit verbose, you may choose to ignore all of it by starting IAXmodem like this: /path/to/iaxmodem ttyIAX >/dev/null 2>&1 Alternatively, if you wish to record this into rotated log files: /path/to/iaxmodem ttyIAX >/tmp/iaxmodem.stdout 2>/tmp/iaxmodem.stderr You may also choose to run IAXmodem from init by placing an entry into the /etc/inittab file like this (and then restarting init): IAX:2345:respawn:/path/to/iaxmodem ttyIAX ---------- In daemon mode, IAXmodem is started by not supplying a configuration identifier on the command-line, like this: /path/to/iaxmodem This will cause iaxmodem to detach itself from the controlling tty and launch a separate iaxmodem instance for every modem configuration file found in /etc/iaxmodem. In daemon mode IAXmodem sends logging data to files in the /var/log/iaxmodem directory, if available. (The /var/log/iaxmodem directory will need to be created.) You may wish to run iaxmodem in daemon mode and start it with a standard init.d script. The provided iaxmodem.init files should serve this purpose. (Choose the appropriate one for your distribution.) ---------- Some people want to launch iaxmodem in a manner like daemon mode, but for various reasons (like runit compatibility) need the parent process to not detach itself from the controlling tty. This is done with the -F option like this: /path/to/iaxmodem -F ** USING IAX MODEM ** Once IAXmodem is running you are ready to use it with your application. If your application is HylaFAX, there is a HylaFAX modem configuration file included with IAXmodem (config.ttyIAX). The config file is for HylaFAX version 4.2.2 and later. Instead of running faxaddmodem, simply edit this config file to your liking and then copy it to /var/spool/hylafax/etc/. (Run faxgetty and the rest of HylaFAX as usual.) If using the "record" option, IAXmodem will create two audio files in the /tmp/ directory. These files are overwritten by each new audio call. The file "ttyIAX-dsp.raw" is the audio that was received by IAXmodem from the DSP library (which IAXmodem delivered to the IAX library), and the file "ttyIAX-iax.raw" is the audio that was received by IAXmodem from the IAX library (which IAXmodem delivered to the DSP library). These audio files can be converted by sox into playable WAV files in this way: sox -s -w -r 8000 -c 1 ttyIAX-iax.raw playable.wav If using the "replay" option, IAXmodem will replay the audio in the audio files previously recorded by "record". So the audio that is passed to the DSP comes from "ttyIAX-iax.raw" instead of from the IAX channel, and the audio that is passed to the IAX channel comes from "ttyIAX-dsp.raw" instead of from the DSP. This feature is indended to provide a simple and reliable way to methodically repeat a call session for debugging. Use of "replay" will disable "record". Jitter occurs when audio is received out of sequence. Normally this involves missing audio packets, but sometimes it can involve mis- ordered audio. Jitter occurs because the UDP communication medium graciously allows packets to be dropped by the network, and so on collision-prone links these audio packets will be dropped when deemed necessary by the network equipment. Jitter should not occur if iaxmodem is communicating directly with the PBX over a loopback or directly-wired (crossover) interface. By default iaxmodem copes with received jitter by replacing missing audio with "fill" from the previously-received audio packet and by dropping mis-ordered audio packets. The intention behind this is to prevent our packet counting from falling behind the other endpoint, to prevent jitter from causing carrier drops or from producing a carrier when there shouldn't be one. In some cases this fill behavior may be undesireable, and instead it would better to just skip the missing audio (thus letting our packet counting fall slightly behind). In order to disable the jitterbuffer put "nojitterbuffer" into the iaxmodem config file. By default iaxmodem, when starting, will examine an existing log file to see if it is larger than 1GB. If it is, then iaxmodem will rename that file with ".old" at the end, deleting any existing ".old" log file. The purpose in this is to prevent iaxmodem logging from consuming too much disk space. However, the astute iaxmodem administrator should probably employ a system-wide logrotate service to rotate the iaxmodem logging independently. An appropriate logrotate.d entry for iaxmodem may look like this: /var/log/iaxmodem/*.log { notifempty missingok postrotate /bin/kill -HUP `cat /var/run/iaxmodem.pid` || true endscript } Modems typically should be reset and reinitialized after each call (in case something within the call put the modem into a bad state). During initialization it is difficult, if not impossible, to properly handle incoming calls. For this reason IAXmodem is "busied-out" for five seconds after going on-hook (ATH0 or ATZ). If the initialization sequence can last longer than that time it would be advisable, then, to take the modem off-hook (ATH1) at the outset of initialization and to place it back on-hook (ATH0) when done (in which case the modem will be busied out during the entire initialization sequence plus five seconds after it finishes). For HylaFAX the five-second automatic busy-out should be sufficient. ** CONTRIBUTING ** * Bug Reports - If you use IAXmodem and encounter a problem please do report it, even if you can work around the problem and even if you do not intend to fix the problem. * Patches - If you develop a patch (bug fix or enhancement) please do share it. If you would like to develop, but don't know what to do, please look at the list of items in the TODO file. * Commission Work - If you use or would like to use IAXmodem and need some work done, hire someone to do it (the author can provide suggestions) and share that work. * Donations - The author is always happy to accept donations of just about any kind. ** CONTACTS and SUPPORT ** Original Author: Lee Howard <faxguy@howardsilvan.com> Website: https://iaxmodem.sourceforge.net Mailing List: iaxmodem-users@lists.sourceforge.net
Wir werden also nun unser Software-Modem aus den Quellen übersetzen und installieren. Als erstes wechseln wir in das neu erstellte Programmverzeichnis:
# cd /usr/local/src/iaxmodem
Als nächstes starten wir das erstellen des Konfigurationslaufes.
# ./configure
Anschließen lassen wir uns das benötigte Programm und die dazu passenden (statischen) Bibliotheken übersetzen.
# make
Zu guter letzt kopieren wir noch das erzeugte Programm iaxmodem nach /usr/local/sbin/.
# cp /usr/local/src/iaxmodem/iaxmodem /usr/local/sbin/
Konfiguration - IAX-Modem
Für die Konfiguration unseres bzw. unserer IAXmodem legen wir uns nun ein Konfigurationsverzeichnis an.
# mkdir /etc/iaxmodem
In dieses Verzeichnis kopieren wir uns nun das in dem Quellpaket enthaltene Konfigurationsdatei.
# cp -a /usr/local/src/iaxmodem/iaxmodem-cfg.ttyIAX /etc/iaxmodem/ttyIAX0
Diese Konfigurationsdatei passen wir nun unserer Umgebung entsprechend an.
# vim /etc/iaxmodem/ttyIAX0
- /etc/iaxmodem/ttyIAX0.conf
device /dev/ttyIAX owner uucp:uucp mode 660 port 4570 refresh 300 server 127.0.0.1 peername iaxmodem secret password cidname John Doe cidnumber 8005551212 codec slinear
Die Parameter haben dabei folgende Bedeutung:
- device Devicename unter dem wir später auf den virtuellen Modem zugreifen. Haben wir mehr als einen iaxmodem im Einsatz, erzeugen wir einfach fortlaufend nummerierte Gerätedateien. ../ttyIAX0, ../ttyIAX1, u.s.w.
- owner Eigentümer und Gruppe der Gerätedatei der später auf das device zugreifen darf.
- mode Dateirechte, der Gerätedatei.
- port Port über den später die Verbindung zum Asterisk-Server eine Verbindung aufgebaut und gehalten wird. Es muss sichergestellt sein, dass jedem virtuellen Modem ein separater eigener Port zugwiwsen wurde.
- refresh Zeitdauer (in Sekunden), wann eine Erneuerung der Registrierung am Asterisk-Server.
- server IP-Adresse des Asterisk-Servers. In der Regel wird man hier 127.0.0.1 verwenden können, es sei denn, man hat in der iax.conf den Asterisk-Server nicht auf allen Adressen, sondern auf eine spezielle IP-Adresse gebunden.
- peername Name, mit dem sich das IAXmodem am Asterisk-Server anmeldet.
- secret Passwort für die Anmeldung am Asterisk-Server.
- cidname CID-Name mit dem sich der IAXmodem beim Asterisk-Server verweist.
- cidnumber CID-Nummer mit dem sich der IAXmodem beim Asterisk-Server verweist.
- codec Definition des Codec, welcher von dem IAXmodem verwendet werden soll. Eine Angabe von Codecs mit Datenkompression macht hier wenig Sinn, da sich die Kompremmierung der daten äußerst negativ auf die Übertragung der Faksimile auswirken wird. Somit wählt man am besten Erlaubt sind hier alaw, ulaw und slinear. Andere machen hier auch wenig Sinn, da diese slinear, alaw oder ulaw aus.
WICHTIG:
Beim Passwort auf gar keinen Fall das Zeichen @ verwenden, da der IAXmodem das Passwort dann als eMailadresse versucht zu interprätieren (was i.d.R. natürlich kläglich scheitern wird) und somit den definierten Asterisk-Knoten nicht mehr erreichen könnte!
Somit ergibt sich für den ersten Test folgende Konfigurationsdatei:
- /etc/iaxmodem/ttyIAX0
device /dev/ttyIAX0 owner uucp:uucp mode 660 port 4570 refresh 300 server 10.10.10.10 peername ttyIAX0 secret P1r4t3n43v3R! cidname nausch.org cidnumber +49 8121 8831-79 codec slinear
Konfiguration - Asterisk (iax.conf)
Damit sich nun unser IAXmodem beim Asterisk-Server auch anmelden kann, müssen wir den entsprechenden Eintrag in der IAX-Konfigurationsdatei /etc/asterisk/iax.conf auch eintragen.
Wir bearbeiten also mit dem Editor unseres Vertrauens die IAX-Konfigurationsdatei.
# vim /etc/asterisk/iax.conf
[general] ... calltokenoptional=127.0.0.1/255.255.255.255 ... [ttyIAX0] context=from-iaxmodems type=friend secret=P1r4t3nP4rTe1 port=4570 host=dynamic defaultip=127.0.0.1 deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.255 disallow=all allow=ulaw allow=alaw jitterbuffer=no requirecalltoken=no ...
WICHTIG:
Da IAXmodem, oder besser gesagt, die verwendete libiax keine CallToken-Unterstützung hat, wird der verwendete Endpunkt localhost entsprechend im Kontext [general] ausgenommen.
calltokenoptional=127.0.0.1/255.255.255.255
Ferner wird beim zugehörigen IAX-Endpunkt die Calltokenunterstützung auf no gesetzt.
requirecalltoken=no
Da ein reload des IAX2-Definitionen die IP-Adresse und Port-Definitionen nicht neu einliest, starten wir den Asterisk-Server 1x durch.
# service asterisk condrestart
Stopping safe_asterisk: [ OK ] Shutting down asterisk: [ OK ] Starting asterisk: [ OK ]
erster Programmstart
Nun ist es an der Zeit unsere zuvor angelegte Konfiguration unseres ersten IAXmodem zu testen. Wir starten hierzu das Programm iaxmodem und geben an, welche Konfigurationsdatei im Verzeichnis /etc/ttyIAX0 verwendet werden soll.
# iaxmodem /etc/ttyIAX0.conf
[2012-12-11 14:18:50] Modem started [2012-12-11 14:18:50] Setting device = '/dev/ttyIAX0' [2012-12-11 14:18:50] Setting owner = 'uucp:uucp' [2012-12-11 14:18:50] Setting mode = '660' [2012-12-11 14:18:50] Setting port = 4570 [2012-12-11 14:18:50] Setting refresh = 50 [2012-12-11 14:18:50] Setting server = '127.0.0.1' [2012-12-11 14:18:50] Setting peername = 'ttyIAX0' [2012-12-11 14:18:50] Setting secret = 'P1r4t3n43v3R!' [2012-12-11 14:18:50] Setting cidname = 'nausch.org' [2012-12-11 14:18:50] Setting cidnumber = '+49 8121 8831-79' [2012-12-11 14:18:50] Setting codec = slinear [2012-12-11 14:18:50] Opened pty, slave device: /dev/pts/0 [2012-12-11 14:18:50] Created /dev/ttyIAX0 symbolic link [2012-12-11 14:18:50] Registration completed successfully.
Die erfolgreiche Registrierung unseres IAXmodem sehen wir auch auf der zuvor geöffneten Komandozeile von Asterisk.
-- Registered IAX2 'iaxmodem0' (AUTHENTICATED) at 10.10.0.2:4570
Rufen wir die definierten IAX2-Peers mit iax2 show peers ab, sehen wir auch unseren definierten IAXmodem.
pml010010*CLI> iax2 show peers
Name/Username Host Mask Port Status ttyIAX0 127.0.0.1 (D) 255.255.255.255 4570 Unmonitored
Bei Bedarf können wir auch noch testen, ob die Gerätetreiberdatei angelegt wurde und ob die Berechtigung so gesetzt wurden, wie wir diese definiert haben.
# ll /dev/ttyIAX1
lrwxrwxrwx 1 root root 10 Dec 9 17:21 /dev/ttyIAX0 -> /dev/pts/1
# ll /dev/pts/1
crw-rw---- 1 uucp uucp 136, 1 Dec 9 17:21 /dev/pts/1
Nun können wir das laufende Programm iaxmodem wieder stoppen, indem wir den laufenden Prozess einfach killen, oder den gerade laufenden Task mit Strg C
beenden.
automatischer Programmstart
Der automatische Start des iaxmodem-Daemon gestaltet sich unter CentOS 6.x etwas anders, als dies noch unter CentOS 5.x der Fall war. Der einmalige Start würde zwar, über einen Eintrag in der /etc/inittab, funktionieren, wie auch noch der Neustart (respawn) des Daemon. Das Anhalten und Wiederstarten des Daemon mit Hilfe des Aufrufs init q
würde aber nicht mehr gehen!
Unter CentOS 6.x erfolgt die Konfiguration nicht mehr in der Datei /etc/inittab.
# cat /etc/inittab
- /etc/inittab
# inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault:
Wir beschreiten hierzu nun den Standardweg, wie es bei CentOS 6.x nun der Fall ist.
- Startscript anlegen Zunächst legen wir zum Starten unseres IAXmodem im Verzeichnis /etc/init ein passendes Script an.
# vim /etc/init/start-ttyIAX0.conf
- start-ttyIAX0.conf
# Django : 2012-12-20 ttyIAX - getty zum automatischen Starten und Wiederbeleben der # softwareemulierten IAXmodems # start on runlevel [2345] stop on runlevel [S016] respawn exec /usr/local/sbin/iaxmodem ttyIAX0
- Optionales Logging Zu Protokollierungszwecken oder zum Debuggen im Rahmen einer Fehlersuche kann es hilfreich sein, das Logging von IAXmodem zu aktivieren. Hierzu nutzen wird einfach den folgenden Programmaufruf in unserem Startscript:
exec /usr/local/sbin/iaxmodem ttyIAX0 >/var/log/iaxmodem/ttyIAX0.log 2>/var/log/iaxmodem/ttyIAX0-error.log
Hierzu ist natürlich das entsprechende Zielverzeichnis
mkdir -p /var/log/iaxmodem
und auch die beiden Logdateien anzulegen.
# touch /var/log/iaxmodem/ttyIAX0.log
# touch /var/log/iaxmodem/ttyIAX0-error.log
Nun können wir unser neu definiertes Softwaremodem IAXmodem starten.
# initctl start start-ttyIAX0
start-ttyIAX0 start/running, process 24557
Auf der (geöffneten) Asterisk Konsole sehen wir nun, dass sich unser IAXmodem am Asterisk-Server angemeldet hat.
# asterisk -r
Asterisk 1.8.18.0, Copyright (C) 1999 - 2012 Digium, Inc. and others. Created by Mark Spencer <markster@digium.com> Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details. This is free software, with components licensed under the GNU General Public License version 2 and other licenses; you are welcome to redistribute it under certain conditions. Type 'core show license' for details. ========================================================================= Connected to Asterisk 1.8.18.0 currently running on pml010010 (pid = 12037) Verbosity is at least 3 pml010010*CLI>
-- Registered IAX2 'ttyIAX0' (AUTHENTICATED) at 127.0.0.1:4570
Fragen wir nun die Prozessliste ab, finden wir dazu auch das entsprechende Programm:
# ps aux | grep iax
uucp 24557 0.0 0.0 18004 1224 pts/3 Ss+ 13:37 0:00 /usr/local/sbin/iaxmodem ttyIAX0
Mit Hilfe des Befehls probemodem kann nun auch getestet werden, welche Funktionen und Standards unser IAXmodem unterstützt.
# probemodem
Serial port that modem is connected to []? ttyIAX0 Now we are going to probe the tty port. This takes a few seconds, so be patient. Note that if you do not have the modem cabled to the port, or the modem is turned off, this may hang (just go and cable up the modem or turn it on, or whatever). Probing for best speed to talk to modem: 38400 OK. This looks like a Class 1 and 1.0 modem. ATI0 RESULT = "OK" RESPONSE = "spandsp" ATI1 RESULT = "ERROR" RESPONSE = "ERROR" ATI2 RESULT = "ERROR" RESPONSE = "ERROR" ATI3 RESULT = "OK" RESPONSE = "www.soft-switch.org" ATI4 RESULT = "ERROR" RESPONSE = "ERROR" ATI5 RESULT = "ERROR" RESPONSE = "ERROR" ATI6 RESULT = "ERROR" RESPONSE = "ERROR" ATI7 RESULT = "ERROR" RESPONSE = "ERROR" ATI8 RESULT = "ERROR" RESPONSE = "ERROR" ATI9 RESULT = "ERROR" RESPONSE = "ERROR" Class 1 stuff... AT+FCLASS=? RESULT = "OK" RESPONSE = "0,1,1.0" AT+FCLASS? RESULT = "OK" RESPONSE = "1" AT+FCLASS=0 RESULT = "OK" RESPONSE = "OK" AT+FCLASS=1 RESULT = "OK" RESPONSE = "OK" AT+FCLASS? RESULT = "OK" RESPONSE = "1" AT+FJUNK=? RESULT = "OK" RESPONSE = "OK" AT+FJUNK? RESULT = "OK" RESPONSE = "OK" AT+FAA=? RESULT = "OK" RESPONSE = "OK" AT+FAA? RESULT = "OK" RESPONSE = "OK" AT+FAE=? RESULT = "OK" RESPONSE = "OK" AT+FAE? RESULT = "OK" RESPONSE = "OK" AT+FTH=? RESULT = "OK" RESPONSE = "3" AT+FRH=? RESULT = "OK" RESPONSE = "3" AT+FTM=? RESULT = "OK" RESPONSE = "24,48,72,73,74,96,97,98,121,122,145,146" AT+FRM=? RESULT = "OK" RESPONSE = "24,48,72,73,74,96,97,98,121,122,145,146" AT+FTS=? RESULT = "OK" RESPONSE = "0-255" AT+FRS=? RESULT = "OK" RESPONSE = "0-255" Class 1.0 stuff... AT+FCLASS=? RESULT = "OK" RESPONSE = "0,1,1.0" AT+FCLASS? RESULT = "OK" RESPONSE = "1.0" AT+FCLASS=0 RESULT = "OK" RESPONSE = "OK" AT+FCLASS=1.0 RESULT = "OK" RESPONSE = "OK" AT+FCLASS? RESULT = "OK" RESPONSE = "1.0" AT+FJUNK=? RESULT = "OK" RESPONSE = "OK" AT+FJUNK? RESULT = "OK" RESPONSE = "OK" AT+FAA=? RESULT = "OK" RESPONSE = "OK" AT+FAA? RESULT = "OK" RESPONSE = "OK" AT+FAE=? RESULT = "OK" RESPONSE = "OK" AT+FAE? RESULT = "OK" RESPONSE = "OK" AT+FTH=? RESULT = "OK" RESPONSE = "3" AT+FRH=? RESULT = "OK" RESPONSE = "3" AT+FTM=? RESULT = "OK" RESPONSE = "24,48,72,73,74,96,97,98,121,122,145,146" AT+FRM=? RESULT = "OK" RESPONSE = "24,48,72,73,74,96,97,98,121,122,145,146" AT+FTS=? RESULT = "OK" RESPONSE = "0-255" AT+FRS=? RESULT = "OK" RESPONSE = "0-255" AT+FAR=? RESULT = "OK" RESPONSE = "0,1" AT+FCL=? RESULT = "OK" RESPONSE = "(0-255)" AT+FIT=? RESULT = "OK" RESPONSE = "+FIT:(0-255),(0-1)" AT+F34=? RESULT = "OK" RESPONSE = "OK"
Konfiguration Asterisk
Modem an SIP/analog TA
Verwendet man einen TA1) zum Anschluß des Modem, gestaltet sich die Einbindung sehr einfach, ist dies ja nur ein weiterer SIP-Teilnehmer in unserer Asterisk-TK-Anlage.
Eine mögliche Konfiguration in der extension.conf könnte wie folgt aussehen.
# vim /etc/asterisk/extension.conf
- /etc/asterisk/extension.conf
... ; ankommende ISDN-Anrufe auf die Rufnummer 883418210 auf den beiden internen Nst. 210 und 211 exten => 883418210,1,NoOp(Anrufer übertrug die Rufnummer ${CALLERID(num)}, Nst. 210 (Fax-a/b) und Nst. 211 (Fax-Server) werden gerufen.) exten => 883418210,n,Dial(SIP/210&SIP/211,30) exten => 883418210,n,Hangup ...
IAXmodem und Asterisk
Die Definition des oder der IAXmodem haben wir ja bereits die entsprechenden Definitionen in der Datei iax.conf im Kapitel Konfiguration - Asterisk (iax.conf) vorgenommen.
- iax.conf
... [ttyIAX0] context=from-iaxmodems type=friend secret=P1r4t3nP4rTe1 port=4570 host=dynamic defaultip=127.0.0.1 deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.255 disallow=all allow=ulaw allow=alaw jitterbuffer=no requirecalltoken=no ...
Jeder Modem kann immer nur jeweils eine Sendung Empfangen, bzw. versenden. Wollen wir gleichzeigtig mehrere Sendungen bearbeiten, müssen wir für die simultane Bearbeitung der Faksimile entsprechend mehrere IAX-Modem (mit unterschiedlichen Ports) und die passenden zugehörigen Definitionen in der iax.conf vornehmen.
# vim /etc/asterisk/extensions.conf
- /etc/asterisk/extensions.conf
... [fax-in] ; ankommende ISDN-Anrufe auf die Nst. 210 zu den IAXmodem durchrouten. exten => 883418210,1,Verbose(1,### Anruf von "from-pstn" ISDN ${EXTEN} an IAXmodem(s) ###) exten => 883418210,n,Dial(IAX2/iaxmodem0/${EXTEN},15,r) exten => 883418210,n,Dial(IAX2/iaxmodem1/${EXTEN},15,r) exten => 883418210,n,Dial(IAX2/iaxmodem2/${EXTEN},15,r) exten => 883418210,n,Dial(IAX2/iaxmodem3/${EXTEN},15,r) exten => 883418210,n,Congestion() exten => 883418210,n,Hangup() [from-iaxmodems] ;Anwahl des internen analogen Faxanschlusses exten => 19,1,NoOp(Anwahl des internen analogen Faxanschlusses vom IAXmodem-Pool) exten => 19,n,Dial(DAHDI/G3,60) exten => 19,n,Hangup() ; Ruf vom IAXMODEM-Pool exten => _XXX.,1,Verbose(### Anruf vom IAXmodem-Pool an die Rufnummer ${EXTEN} via PSTN ###) exten => _XXX.,n,Set(CALLERID(num)=883418210) exten => _XXX.,n,Set(CHANNEL(transfercapability)=3K1AUDIO) exten => _XXX.,n,Dial(DAHDI/G1/${EXTEN}) exten => _XXX.,n,Hangup() ... ... [default] include => fax-in ...
Grundkonfiguration HylaFAX
faxsetup
Die Konfiguration unseres Faxservers wird am einfachsten mit Hilfe des Scriptes faxsetup durchgeführt.
# faxsetup
Setup program for HylaFAX (tm) 5.2.5. Created for x86_64-unknown-linux-gnu on Thu Nov 11 00:26:04 EST 2010. Found encoder: /usr/bin/base64 Found encoder: /usr/bin/uuencode Looks like /usr/bin/base64 supports base64 encoding. Checking system for proper client configuration. Checking system for proper server configuration. ... ... There does not appear to be an entry for the FaxMaster either in the YP/NIS database or in the /etc/aliases file. The FaxMaster is the primary point of contact for HylaFAX problems. The HylaFAX client-server protocol server identifies this alias as the place to register complaints and HylaFAX directs automatic mail messages to this user when problems are identified on a server machine or when the routine server maintainence scripts are run (e.g. faxcron). Should an entry be added for the FaxMaster to /etc/aliases [yes]?
Eingabe: yes
Users to receive fax-related mail [root]?
Eingabe: CR2)
Rebuilt /etc/aliases database.
Update /var/spool/hylafax/status/any.info.
HylaFAX configuration parameters are:
[1] Init script starts faxq: yes
[2] Init script starts hfaxd yes
[3] Start paging protocol: no
Are these ok [yes]?
Eingabe: yes
Modem support functions written to /var/spool/hylafax/etc/setup.modem. Configuration parameters written to /var/spool/hylafax/etc/setup.cache. No scheduler config file exists, creating one from scratch. Country code [1]?
Eingabe: 49
Area code [000]?
Eingabe: 89
Long distance dialing prefix [1]?
Eingabe: 0
International dialing prefix [011]?
Eingabe: 00
Dial string rules file (relative to /var/spool/hylafax) ["etc/dialrules"]?
Eingabe: CR
Tracing during normal server operation [1]?
Eingabe: 527
Default tracing during send and receive sessions [0xFFF]?
Eingabe: 527
Continuation cover page (relative to /var/spool/hylafax) []?
Eingabe: CR
Timeout when converting PostScript documents (secs) [180]?
Eingabe: CR
Maximum number of concurrent jobs to a destination [1]?
Eingabe: CR
Define a group of modems []?
Eingabe: CR
Time of day restrictions for outbound jobs ["Any"]?
Eingabe: CR
Timeout before purging a stale UUCP lock file (secs) [30]?
Eingabe: CR
Max number of pages to permit in an outbound job [0xffffffff]?
Eingabe: 50
Syslog facility name for ServerTracing messages [daemon]?
Eingabe: CR
The non-default scheduler parameters are: CountryCode: 49 AreaCode: 89 LongDistancePrefix: 0 InternationalPrefix: 00 ServerTracing: 527 MaxSendPages: 50 SessionTracing: 527 Are these ok [yes]?
Eingabe: yes
Creating new configuration file /var/spool/hylafax/etc/config... Restarting HylaFAX server processes. Should I restart the HylaFAX server processes [yes]?
Eingabe: yes
/etc/rc.d/init.d/hylafax start Starting HylaFAX queue manager (faxq): [ OK ] Starting HylaFAX server (hfaxd): [ OK ] You do not appear to have any modems configured for use. Modems are configured for use with HylaFAX with the faxaddmodem(8C) command. Do you want to run faxaddmodem to configure a modem [yes]?
Eingabe: no
You do not appear to be using faxgetty to notify the HylaFAX scheduler about new modems and/or their status. This means that you must use the faxmodem program to inform the new faxq process about the modems you want to have scheduled by HylaFAX. Beware that if you have modems that require non-default capabilities specified to faxmodem then you should read faxmodem(8C) manual page and do this work yourself (since this script is not intelligent enough to automatically figure out the modem capabilities and supply the appropriate arguments). Should I run faxmodem for each configured modem [yes]?
Eingabe: no
Verwenden wir für die Anbindung unseres Faxservers nicht IAXmoden, sondern einen herkömmlichen analogen Modem, so müssen wir die Frage:
Do you want to run faxaddmodem to configure a modem [yes]?
entsprechend mit yes beantworten.
Done verifying system setup.
faxaddmodem
Haben wir die Frage
Do you want to run faxaddmodem to configure a modem [yes]?
mit yes bestätigt, geht es nun weiter mit der Konfiguration des Analogen Modems.
Serial port that modem is connected to []?
Eingabe: modem
Ok, time to setup a configuration file for the modem. The manual page config(5F) may be useful during this process. Also be aware that at any time you can safely interrupt this procedure. Reading scheduler config file /var/spool/hylafax/etc/config. No existing configuration, let's do this from scratch. Country code [49]?
Eingabe: CR
Area code [89]?
Eingabe: CR
Phone number of fax modem [+1.999.555.1212]?
Eingabe: +49 89 88031079
Local identification string (for TSI/CIG) ["NothingSetup"]?
Eingabe: www.nausch.org
Long distance dialing prefix [1]?
Eingabe: 0
International dialing prefix [011]?
Eingabe: 0
Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]?
Eingabe: CR
Tracing during normal server operation [1]?
Eingabe: 527
Tracing during send and receive sessions [0xFFF]?
Eingabe: 527
Protection mode for received facsimile [0600]?
Eingabe: 0644
Protection mode for session logs [0600]? 0600
Eingabe: 0600
Protection mode for modem [0600]? 0644
Eingabe: 0644
Rings to wait before answering [1]?
Eingabe: CR
Modem speaker volume [off]?
Eingabe: CR
Command line arguments to getty program ["-h %l dx_%s"]?
Eingabe: „-r -b -s %s %l“
Pathname of TSI access control list file (relative to /var/spool/hylafax) [""]?
Eingabe: CR
Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.pcf]?
Eingabe: CR
Tag line format string ["From %%l|%c|Page %%P of %%T"]?
Eingabe: CR
Time before purging a stale UUCP lock file (secs) [30]?
Eingabe: CR
Hold UUCP lockfile during inbound data calls [Yes]?
Eingabe: CR
Hold UUCP lockfile during inbound voice calls [Yes]?
Eingabe: CR
Percent good lines to accept during copy quality checking [95]?
Eingabe: CR
Max consecutive bad lines to accept during copy quality checking [5]?
Eingabe: CR
Max number of pages to accept in a received facsimile [25]? 50
Eingabe: 50
Syslog facility name for ServerTracing messages [daemon]?
Eingabe: CR
Set UID to 0 to manipulate CLOCAL [""]?
Eingabe: CR
Use available priority job scheduling mechanism [""]?
Eingabe: CR
The non-default server configuration parameters are: CountryCode: 49 AreaCode: 8121 FAXNumber: +49 8121 883179 LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules ServerTracing: 527 SessionTracing: 527 RecvFileMode: 0644 DeviceMode: 0644 RingsBeforeAnswer: 1 SpeakerVolume: off GettyArgs: "-r -b -s %s %l" LocalIdentifier: www.nausch.org TagLineFont: etc/lutRS18.pcf TagLineFormat: "From %%l|%c|Page %%P of %%T" MaxRecvPages: 50 Are these ok [yes]?
Eingabe: yes
Und weiter geht es mit der Konfiguration des Modems:
Now we are going to probe the tty port to figure out the type of modem that is attached. This takes a few seconds, so be patient. Note that if you do not have the modem cabled to the port, or the modem is turned off, this may hang (just go and cable up the modem or turn it on, or whatever). Probing for best speed to talk to modem: 38400 OK. About fax classes: The difference between fax classes has to do with how HylaFAX interacts with the modem and the fax protocol features that are used when sending or receiving faxes. One class isn't inherently better than another; however, one probably will suit a user's needs better than others. Class 1 relies on HylaFAX to perform the bulk of the fax protocol. Class 2 relies on the modem to perform the bulk of the fax protocol. Class 2.0 is similar to Class 2 but may include more features. Class 1.0 is similar to Class 1 but may add V.34-fax capability. Class 2.1 is similar to Class 2.0 but adds V.34-fax capability. HylaFAX generally will have more features when using Class 1/1.0 than when using most modems' Class 2 or Class 2.0 implementations. Generally any problems encountered in Class 1/1.0 can be resolved by modifications to HylaFAX, but usually any problems encountered in Class 2/2.0/2.1 will require the modem manufacturer to resolve it. Use Class 1 unless you have a good reason not to. This modem looks to have support for Class 1 and 2. How should it be configured [1]?
Eingabe: 1
Hmm, this looks like a Class 1 modem. Product code (ATI0) is "OK". Other information (ATI3) is "Version 1.11 / 21.03.2000". DTE-DCE flow control scheme [default]? RTSCTS Modem manufacturer is "Unknown". Modem model is "Unknown". Using prototype configuration file class1... There is no prototype configuration file for your modem, so we will have to fill in the appropriate parameters by hand. You will need the manual for how to program your modem to do this task. In case you are uncertain of the meaning of a configuration parameter you should consult the config(5F) manual page for an explanation. Note that modem commands must be specified exactly as they are to be sent to the modem. Note also that quote marks (") will not be displayed and will automatically be deleted. You can use this facility to supply null parameters as "". Finally, beware that the set of parameters is long. If you prefer to use your favorite editor instead of this script you should fill things in here as best you can and then edit the configuration file "/var/spool/hylafax/etc/config.modem" after completing this procedure. Command to enter Class 1 [AT+FCLASS=1]? Command to stop and wait prior to sending PPM [AT+FTS=7]? Command to stop and wait prior to sending TCF [AT+FTS=7]? Command to stop and wait prior to sending EOP [AT+FTS=9]? Extra bytes in a received HDLC frame [4]? Maximum time to wait for OK after aborting a receive (ms) [200]? Maximum wait for initial identification frame (ms) [40000]? Command to ensure silence after receiving HDLC and before sending [AT+FRS=7]? The modem configuration parameters are: Class1Cmd: AT+FCLASS=1 Class1PPMWaitCmd: AT+FTS=7 Class1TCFWaitCmd: AT+FTS=7 Class1EOPWaitCmd: AT+FTS=9 Class1FrameOverhead: 4 Class1RecvAbortOK: 200 Class1RecvIdentTimer: 40000 Class1SwitchingCmd: AT+FRS=7 Class1TCFMaxNonZero: 10 Class1TCFMinRun: 1000 Are these ok [yes]?
Eingabe: yes
Creating new configuration file /var/spool/hylafax/etc/config.modem... Creating fifo /var/spool/hylafax/FIFO.modem for faxgetty... done. Done setting up the modem configuration. Checking /var/spool/hylafax/etc/config for consistency... ...some parameters are different. The non-default scheduler parameters are: CountryCode: 49 AreaCode: 89 LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules ServerTracing: 527 MaxSendPages: 50 SessionTracing: 527 Are these ok [yes]?
Eingabe: yes
Creating new configuration file /var/spool/hylafax/etc/config... ...saving current file as /var/spool/hylafax/etc/config.sav. Don't forget to run faxmodem(8C) (if you have a send-only environment) or configure init to run faxgetty on modem. Do you want to run faxaddmodem to configure another modem [yes]?
Eingabe: no
You do not appear to be using faxgetty to notify the HylaFAX scheduler about new modems and/or their status. This means that you must use the faxmodem program to inform the new faxq process about the modems you want to have scheduled by HylaFAX. Beware that if you have modems that require non-default capabilities specified to faxmodem then you should read faxmodem(8C) manual page and do this work yourself (since this script is not intelligent enough to automatically figure out the modem capabilities and supply the appropriate arguments). Should I run faxmodem for each configured modem [yes]?
Eingabe: no
Done verifying system setup.
Die Frage Should I run faxmodem for each configured modem ist mit no zu beantworten, da wir HylaFAX+ nicht nur zum Senden, sondern auch zum Beantworten von Faksimileanrufen verwenden wollen.
faxaddmodem
Nutzen wir zur Anbindung an unseren Asterisk-Server IAXmodem brauchen wir das vorgenannte Hilfsprogramm faxaddmodem nicht aufrufen!
Einen entsprechenden Hinweis hierzu finden wir in der Datei /usr/local/src/iaxmodem/README.
If your application is HylaFAX, there is a HylaFAX modem configuration file included with IAXmodem (config.ttyIAX). The config file is for HylaFAX version 4.2.2 and later. Instead of running faxaddmodem, simply edit this config file to your liking and then copy it to /var/spool/hylafax/etc/. (Run faxgetty and the rest of HylaFAX as usual.)
Also kopieren wir die Vorgabedatei config.ttyIAX in das Konfigurationsverzeichnis /var/spool/hylafax/etc von HylaFAX.
# cp /usr/local/src/iaxmodem/config.ttyIAX /var/spool/hylafax/etc/config.ttyIAX0
Anschließend bearbeiten wir diese Datei und ändern sie, unseren Bedürfnis entsprechend, ab.
# vim /var/spool/hylafax/etc/config.ttyIAX0
- /var/spool/hylafax/etc/config.ttyIAX0
CountryCode: 49 AreaCode: 89 FAXNumber: "+49 89 88031079" LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules.europe ServerTracing: 527 SessionTracing: 527 RecvFileMode: 0644 LogFileMode: 0600 DeviceMode: 0644 RingsBeforeAnswer: 1 SpeakerVolume: off #GettyArgs: "-h %l dx_%s" GettyArgs: "-r -b -s %s %l" LocalIdentifier: "www.nausch.org" TagLineFont: etc/lutRS18.pcf TagLineFormat: "From %%l|%c|Page %%P of %%T" MaxRecvPages: 200 # # # Modem-related stuff: should reflect modem command interface # and hardware connection/cabling (e.g. flow control). # ModemType: Class1 # use this to supply a hint # # Enabling this will use the hfaxd-protocol to set Caller*ID # #ModemSetOriginCmd: AT+VSID="%s","%d" ModemDialCmd: ATX3DT%s # # If "glare" during initialization becomes a problem then take # the modem off-hook during initialization, and then place it # back on-hook when done. # #ModemResetCmds: "ATH1\nAT+VCID=1" # enables CallID display #ModemReadyCmds: ATH0 Class1AdaptRecvCmd: AT+FAR=1 Class1TMConnectDelay: 400 # counteract quick CONNECT response # # If you have trouble with V.17 receiving or sending, # you may want to enable one of these, respectively. # #Class1RMQueryCmd: "!24,48,72,96" # enable this to disable V.17 receiving #Class1TMQueryCmd: "!24,48,72,96" # enable this to disable V.17 sending # # You'll likely want Caller*ID display (also displays DID) enabled. # ModemResetCmds: AT+VCID=1 # enables CallID display # # The pty does not support changing parity. # PagerTTYParity: none # # If you are "missing" Caller*ID data on some calls (but not all) # and if you do not have adequate glare protection you may want to # not answer based on RINGs, but rather enable the CallIDAnswerLength # for NDID, disable AT+VCID=1 and do this: # #RingsBeforeAnswer: 0 #ModemRingResponse: AT+VRID=1 # Uncomment DATE and TIME if you really want them, but you probably don't. #CallIDPattern: "DATE=" #CallIDPattern: "TIME=" CallIDPattern: "NMBR=" CallIDPattern: "NAME=" CallIDPattern: "ANID=" #CallIDPattern: "USER=" # username provided by call #CallIDPattern: "PASS=" # password provided by call #CallIDPattern: "CDID=" # DID context in call CallIDPattern: "NDID=" #CallIDAnswerLength: 4
erweiterte Konfiguration HylaFAX
cronjobs faxqclean und faxcron
Das Script faxcron (beheimatet unter /usr/sbin/faxcron) erstellt für den Administrator des FAX-Servers einen Report mit Angaben zur den empfangenen und gesendeten Dokumenten, wie auch ggf. aufgetretenen Problemberichten.
Dank der RPM-Installation wurden für die beiden Aufgaben entsprechende Eintragungen bereits vorgenommen.
Das Sript faxqclean (beheimatet unter /usr/sbin/faxqclean) wird verwendet um das spooling-Verzeichnis von HylaFAX aufzuräumen, in dem es alte nicht mehr benötigte Dateien löscht.
Diese beiden Scripte faxqclean und faxcron sollen in regelmäßigen Abständen als cron-jobs aufgerufen werden.
# ll /etc/cron.hourly/hyla*
-rwxr-xr-x 1 root root 39 20. Jun 15:08 hylafax
# cat /etc/cron.hourly/hylafax
- /etc/cron.hourly/hylafax
#!/bin/sh /usr/sbin/faxqclean exit 0
Das zweite script faxcron (ebenfalls beheimatet unter /usr/sbin/faxcron) erstellt für den Administrator des FAX-Servers einen Report mit Angaben zur den empfangenen und gesendeten Dokumenten, wie auch ggf. aufgetretenen Problemberichten.
# ll /etc/cron.daily/hyla*
-rwxr-xr-x 1 root root 80 20. Jun 15:08 /etc/cron.daily/hylafax
# cat /etc/cron.daily/hylafax
- /etc/cron.daily/hylafax
#!/bin/sh /usr/sbin/faxcron | mail -s "HylaFAX Usage Report" faxmaster exit 0
Der Report, den faxcron täglich erstellt, sieht exeplarisch wie folgt aus:
Facsimile transmitted since : Sender Pages Time Pg/min Errs TypRate TypData ------------------------------------------------------------- Total 0 0:00 0,0 0 Facsimile transmitted since last week: Sender Pages Time Pg/min Errs TypRate TypData ------------------------------------------------------------- Total 0 0:00 0,0 0 Facsimile received since : Sender CIDName CIDNumber Pages Time Pg/min Errs TypRate TypData ------------------------------------------------------------------------------------------ Total 0 0:00 0,0 0 Facsimile received since last week: Sender CIDName CIDNumber Pages Time Pg/min Errs TypRate TypData ------------------------------------------------------------------------------------------ Total 0 0:00 0,0 0 Report failed calls and associated session logs: Nothing to purge in info directory. Truncate merged session logs older than 30 days: Nothing to purge in receive queue. Nothing to purge in the tmp directory.
Ghostscript Fonts Fix
Versuchen wir jetzt schon ein Faksimile zu verschicken, scheitert dies und wir bekommen folgende Fehlermeldung.
# sendfax -n -d 883179 /etc/motd
/usr/sbin/textfmt: No font metric information found for "Courier-Bold". Usage: /usr/sbin/textfmt [-1] [-2] [-B] [-c] [-D] [-f fontname] [-F fontdir(s)] [-m N] [-o #] [-p #] [-r] [-U] [-Ml=#,r=#,t=#,b=#] [-V #] files... >out.ps Default options: -f Courier -1 -p 11bp -o 0 Error converting data; command was "/usr/sbin/textfmt -B -f Courier-Bold -Ml=0.4in -p 11 -s default > '/tmp//sndfaxhrmQpG' < '/etc/motd'"
Zur Beseitigung des Fehlers No font metric information found for „Courier-Bold“ benötigen wir noch ein zusätzliches Ghostscript-Font Paket und eine Anpassunge an den Fontmaps. Bevor wir nun das Paket auf unseren Rechner holen, wechseln wir erst noch in das lokale Installationsverzeichnis.
# cd /usr/local/src/
Anschließend holen wir uns das tar.gz-Archiv auf unseren Server.
# wget https://ghostscript.googlecode.com/files/ghostscript-fonts-std-8.11.tar.gz
Im nächsten Schritt entpacken wir das Paket.
# tar zxf ghostscript-fonts-std-8.11.tar.gz
Nun verschieben wir das entpackte Verzeichnis fonts in Ghostscript-Verzeichnis fonts
# mv fonts/* /usr/share/ghostscript/fonts/ -f
Bevor wir nun Änderungen an der Konfigurationsdatei vornehmen, kopierenn wird die Datei erst mal noch zur Sicherheit.
# cp -a /usr/share/ghostscript/8.70/Resource/Init/Fontmap.GS /usr/share/ghostscript/8.70/Resource/Init/Fontmap.GS.orig
Zum Schluss ersetzen wir noch in der Zeile 92 den Wert /NimbusMonL-Bold mit (n022004l.pfa).
# vim +92 /usr/share/ghostscript/8.70/Resource/Init/Fontmap.GS
/Courier-Bold /NimbusMonL-Bold ; /Courier-Bold (n022004l.pfa) ;
Faxserver starten
manuellen Start
Zum Starten und Stoppen bedienen wir uns am besten der Scripte, die beim Installationsprozess in die dafür vorgesehenen Pfade kopiert worden sind.
Unter CentOS 6.x stoppen wir den Server einfach via service hylafax stop und der Start erfolgt dann analog via service hylafax start.
Den ersten Start unseres Fax-Servers nehmen wir wie folgt vor.
# service hylafax start
Starting HylaFAX queue manager (faxq): [ OK ] Starting HylaFAX server (hfaxd): [ OK ]
Im Syslog wird uns der erfolgreiche Start entsprechend quittiert.
Jan 2 18:48:53 vml000020 HylaFAX[23129]: Listening to 0.0.0.0:4559 Jan 2 18:48:53 vml000020 HylaFAX[23129]: HylaFAX INET Protocol Server: restarted. Jan 2 18:48:53 vml000020 FaxQueuer[23126]: HylaFAX (tm) Version 5.5.4 Jan 2 18:48:53 vml000020 FaxQueuer[23126]: Copyright (c) 1990-1996 Sam Leffler Jan 2 18:48:53 vml000020 FaxQueuer[23126]: Copyright (c) 1991-1996 Silicon Graphics, Inc.
Zur Kontrolle können wir ja noch genau nachprüfen, ob die benötigten deamon's auch wirklich laufen. Dies geschieht am einfachsten via:
# ps auxw | grep fax
uucp 25781 0.0 0.0 10276 1372 ? Ss 20:02 0:00 faxq uucp 25784 0.0 0.0 7840 1000 ? Ss 20:02 0:00 hfaxd -i hylafax
automatischer Serverstart
Damit nun unser HylaFAX-Server beim Booten automatisch gestartet wird, nehmen wir noch folgende Konfigurationsschritte vor.
# chkconfig hylafax+ on
Bei Bedarf können wir überprüfen, ob die Konfigurationsänderung aktiviert wurden.
# chkconfig --list | grep hylafax+
hylafax+ 0:Aus 1:Aus 2:Ein 3:Ein 4:Ein 5:Ein 6:Aus
automatischer Faxempfang
Da wir Faxe nicht nur senden sondern auch empfangen wollen, veranlassen wir den Start des Programms faxgetty bereits beim Hochfahren des Servers.
Genauso wie beim Starten von IAXmodem benötigen wir zum Starten und Wiederanlauf, den für den Faxempfang notwendigen Programms faxgetty, ein entsprechendes Hilfsprogramm.
Der automatische Start von faxgetty gestaltet sich unter CentOS 6.x etwas anders als dies noch unter CentOS 5.x der Fall war. Der einmalige Start würde zwar über einen Eintrag in der /etc/inittab funktionieren, auch noch der Neustart (respawn) des Daemon.
Das Anhalten und Wiederstarten des Daemon mit Hilfe des Aufrufs init q
würde aber nicht mehr gehen!
Wir beschreiten also, genau so wie schon bei iaxmodem hierzu nun den Standardweg, wie es bei CentOS 6.x nun der Fall ist.
- Startscript anlegen Zunächst legen wir zum Starten von faxgetty im Verzeichnis /etc/init ein passendes Script an.
# vim /etc/init/start-faxgetty0.conf
- /etc/init/start-faxgetty0.conf
# Django : 2012-12-11 # Für den Faxempfang das Hilfsprogramm faxgetty mit der Option (Gerätetreiberdatei) # in den Runlevel 2345 automatisch starten und auch neustarten, sollte der Daemon sterben start on runlevel [2345] stop on runlevel [S016] respawn exec /usr/sbin/faxgetty /dev/ttyIAX0
Benutzt man einen analogen Modem ist statt der Gerätetreiberdatei /dev/ttyIAX0
der entsprechende Ort anzugebene, i.d.R. /dev/modem/
, also:
exec /usr/sbin/faxgetty /dev/modem
Nun können wir, den für den Faxempfang notwendigen faxgetty-Prozess starten.
# initctl start start-faxgetty0
start-faxgetty0 start/running, process 27251
Fragen wir die Prozessliste ab, finden wir dazu auch das entsprechende Programm:
# ps aux | grep ttyIAX
uucp 14029 0.0 0.0 17996 1196 pts/3 Ss+ 14:26 0:00 /usr/local/sbin/iaxmodem ttyIAX0 uucp 27251 0.0 0.0 66528 2820 ? Ss 17:29 0:00 /usr/sbin/faxgetty /dev/ttyIAX0
Es läuft also sowohl das IAXmodem wie auch der faxgetty-Prozess.
Sytemcheck
Ob nun unser FAX-Server und die zugehörigen Daemons auch alle laufen und zur Verfügung stehen, können wir wie folgt abfragen.
# service hylafax+ status
hfaxd (pid 1026) is running... faxq (pid 1023) is running...
Genauso gut kann man natürlich auch ermitteln, ob der Port 4559 des Hylafax-Daemon geöffnet ist.
# netstat -tulpen | grep 4559
tcp 0 0 0.0.0.0:4559 0.0.0.0:* LISTEN 10 7981871 1026/hfaxd
Ob beide Daemons für den entsprechend kponfigurierten Modem zur Verfügung stehen, fragen wir so ab:
# ps aux | grep ttyIAX
uucp 14029 0.0 0.0 17996 1196 pts/3 Ss+ 14:26 0:00 /usr/local/sbin/iaxmodem ttyIAX0 uucp 27251 0.0 0.0 66528 2820 ? Ss 17:29 0:00 /usr/sbin/faxgetty /dev/ttyIAX0
In der Regel wird man jedoch mehr als einen Modem verwenden, da jeder Modem während einer Verbindung jeweils nur eine Sendung annehmen oder verschicken kann.
Mit Hilfe des Programms faxstat können wir den Status unseres HylaFAX-Servers abfragen. Im ersten Beispiel läuft zwar der FaxServer schon, aber der definierte Modem wird noch initialisiert.
# faxstat
HylaFAX scheduler on pml010010.nausch.org: Running Modem ttyIAX0 (+49 89 88031079): Initializing server
Das zweite Beispiel zeigt den Server, wie er sich im Wartezustand befindet, also darauf wartet Faksimile anzunehmen oder verschicken zu können.
# faxstat
HylaFAX scheduler on pml010010.nausch.org: Running Modem ttyIAX0 (+49 89 88031079): Running and idle
Im dritten Beispiel sehen wir, dass gerade ein Anruf beim IAXmodem eintrifft, also „anklingelt“.
# faxstat
HylaFAX scheduler on pml010010.nausch.org: Running Modem ttyIAX0 (+49 89 88031079): Answering the phone
Im nächsten Beispiel sehen wir, dass der HylaFAX-Server den Anruf entgegengenommen hat und gerade mit dem Aushandeln der Verbindungsparameter mit dem Sender beschäftigt ist.
# faxstat
HylaFAX scheduler on pml010010.nausch.org: Running Modem ttyIAX0 (+49 89 88031079): Receiving facsimile
Das letzte Beispiel zeigt den Hylafax im Empfangsbetrieb, bei dem er ein Faksimile vom Absender mit der Kennung +49 89 2160 9596 entgegen nimmt.
# faxstat
HylaFAX scheduler on pml010010.nausch.org: Running Modem ttyIAX0 (+49 89 88031079): Receiving from "+49 89 2160 9596"
Fax-Empfang
erster Fax-Empfang
Verbinden wir uns mit dem CLI3) von Asterisk, können wir während eines Faxempfanges sehen, was alles passiert.
pml010010*CLI> -- Accepting call from '0950916' to '88031079' on channel 0/1, span 1 -- Executing [88031079@from-pstn:1] Verbose("DAHDI/i1/0950916-25", "1,### Anruf von "from-pstn" ISDN 88031079 an (DAHDI-Channel 5 ###") in new stack ### Anruf von "from-pstn" ISDN 88031079 an (DAHDI-Channel 5 ### -- Executing [88031079@from-pstn:2] Dial("DAHDI/i1/0950916-25", "IAX2/ttyIAX0/88031079,60,r") in new stack -- Called IAX2/ttyIAX0/88031079 -- Call accepted by 127.0.0.1 (format alaw) -- Format for call is alaw -- IAX2/ttyIAX0-9457 is ringing -- IAX2/ttyIAX0-9457 answered DAHDI/i1/0950916-25 -- Span 1: Channel 0/1 got hangup request, cause 16 -- Hungup 'IAX2/ttyIAX0-9457' == Spawn extension (from-pstn, 88031079, 2) exited non-zero on 'DAHDI/i1/0950916-25' -- Hungup 'DAHDI/i1/0950916-25'
Im Spoolingverzeichnis /var/spool/hylafax/recvq/ befindet sich dann das empfangene Dokument in Form einer TIFF-Datei.
# ll /var/spool/hylafax/recvq/*tif
-rw-r--r-- 1 uucp uucp 144800 14. Dez 15:06 /var/spool/hylafax/recvq/fax000000017.tif
Mit Hilfe des Befehls faxinfo können wir uns die (technischen) Daten des empfangenen Faksilies ansehen.
# faxinfo /var/spool/hylafax/recvq/fax000000017.tif
/var/spool/hylafax/recvq/fax000000017.tif: Sender: +49 89 2161 95916 Pages: 8 Quality: Fine Page: 1728 by 8 Received: 2012:12:14 15:01:43 TimeToRecv: 0:05:12 SignalRate: 9600 bit/s DataFormat: 2-D MR ErrCorrect: No
Fax-Empfang und eMail an Sammelpostkorb
Normalerweise wird man die entgegengenommen Faksimile an eine eMailadresse (Vorzimmer/Büro) weiterleiten wollen. Der Empfänger soll das Faksimile als eMail Anhang als PDF-Datei erhalten.
Hierzu legen wir im Verzeichnis /var/spool/hylafax/etc/ die Datei mit Namen FaxDispatch an.
# vim /var/spool/hylafax/etc/FaxDispatch
- /var/spool/hylafax/etc/FaxDispatch
# Django : 2012-12-21 Empfangene Faxe an einen Sammelpostkorb (Sekretariat) per # eMail mit dem empfangenen Dokument als PDF-Datei im Anhang senden SENDTO=vorzimmer+fax@nausch.org; FILETYPE=pdf;
Die Variablen sind selbsterklärend. Beim FileTYPE wäre auch ps oder tif denkbar.
Nach erfolgreicher Annahme eines Faksimiles wird dann an den Adressaten eine eMail verschickt, die folgenden Aufbau hat:
To: vorzimmer+fax@nausch.org
From: hylafax@faxserver.nausch.org
Subject: Facsimile received from +49 89 2167 950916
Date: Fri, 21 Dec 2012 10:32:12 +0100 (CET)
Sender: +49 89 2161 9596
Pages: 1
Quality: Fine
Size: ISO A4
Received: 2012:12:21 10:31:55
Time To Receive: 0:00:19
Signal Rate: 9600 bit/s
Data Format: 2-D MR
Error Correct: No
CallID1: 0950916
CallID2:=20
CallID3: <NONE>
CallID4: 8813179
Received On: ttyIAX0
CommID: c000000353
Fax-Empfang und eMail an individuelle Empfänger
Sehr oft wird bei Fax-Server-Installationen jedem Mitarbeiter und/oder Bereich neben einer individuellen Nebenstellen-Nummer eine zugehörige individuelle Fax-Rufnummer zugeteilt.
Im folgenden Beispiel gehen wir von folgender Zuordnung aus:
Nebenstellen-Nummer | Fax-Rufnummer | Bezeichnung | eMail-Adresse |
---|---|---|---|
8813179 - 0 | 8813179 - 699 | Zentrale | vermittlung@nausch.org |
8813179 - 10 | 8813179 - 610 | Vertrieb (Vorzimmer) | vorzimmer@nausch.org |
8813179 - 11 | 8813179 - 611 | Geschäftsführer | michael@nausch.org |
8813179 - 20 | 8813179 - 620 | Technik | support@nausch.org |
8813179 - 30 | 8813179 - 630 | Vertrieb | sales@nausch.org |
8813179 - 40 | 8813179 - 640 | Lager | lagermeister@nausch.org |
8813179 - 66 | 8813179 - 666 | BOfH | django@nausch.org |
Schickt nun jemand ein Faksimile an den Geschäftsführer an die Nummer 089/8813179-611, so soll das erhaltene Dokument direkt an die eMail des Scheffs geschickt werden. Eine Sendung an den BOfH4) geht entsprechend an die eMail-Adresse django@nausch.org.
Da uns der IAXmodem in der Variable $CALLID4 die angewählte Rufnummer zum HylaFAX-Server übergibt, brauchen wir nur noch eine logische Verknüpfung zwischen $CALLID4 und der eMail-Adresse aus obiger Tabelle vornehmen.
Im Verzeichnis /var/spool/hylafax/etc/ legen wir uns hierzu eine Datei an, in der wird diese Zuordnungen definieren.
# vim /var/spool/hylafax/etc/Fax2Mail
8813179699 vermittlung@nausch.org 8813179610 vorzimmer@nausch.org 8813179611 michael@nausch.org 8813179620 support@nausch.org 8813179630 sales@nausch.org 8813179640 lagermeister@nausch.org 8813179666 django@nausch.org
Die Konfigurationsdatei für den eMailversand /var/spool/hylafax/etc/ erweitern wir nun um ein kleines Shell-Script.
# vim /var/spool/hylafax/etc/FaxDispatch
- /var/spool/hylafax/etc/FaxDispatch
# Django : 2012-12-21 Empfangene Faxe an einen Sammelpostkorb (Sekretariat) per # eMail mit dem empfangenen Dokument als PDF-Datei im Anhang senden #SENDTO=django@nausch.org #FILETYPE=pdf # Django : 2012-12-21 Empfangene Faxe an die individuellen eMail-Postkörbe per # eMail mit dem empfangenen Dokument als PDF-Datei im Anhang senden DEST_EMAIL=$(/bin/grep $CALLID4 /var/spool/hylafax/etc/Fax2Mail | /bin/sed -e 's/^.* \(.*\)$/\1/g') if [ $DEST_EMAIL == "NIL" ]; then SENDTO=FaxMaster; FILETYPE=pdf; else SENDTO=$DEST_EMAIL; FILETYPE=pdf; fi # Deutsche Rückmeldungen ausgeben LANG=de_DE
Für die Ausgabe der deutschsprachigen Rückmeldungen haben wir den für unseren Sparchbereich geltenden Wert de_DE auch gleich noch gesetzt.
Empfängt nun unser HylaFAX-Server eine Sendung für den BOfH auf der Rufnummer 8813179666, so wird dem Empfänger in seinem eMail-Postfach die Sendung, mit dem zugehörigem Anhang fax000000060.pdf, zugestellt.
An: django@nausch.org
Betreff: Facsimile received from +49 89 2161 9916
Datum: Fri, 21 Dec 2012 15:10:37 +0100 (CET)
Sender: +49 89 2161 9916
Seiten: 1
Qualität: Normal
Größe: 1728 by 78
Empfangen: 2012:12:21 15:10:26
Verarbeitungszeit: 0:00:19
Übertragungsgeschwindigkeit: 14400 bit/s
Datenformat: 2-D MMR
FehlerKorrektur: Ja
Anrufe ID 1: 08921619916
Anrufe ID 2:
Anrufe ID 3: <NONE>
Anrufe ID 4: 8813179666
EmpfangenAn: ttyIAX0
KommunikationsID: c000000391
Fax-Versand
erster Test von der Konsole aus
Für den ersten Versandtest von der Konsole aus, bemühen wir das Programm sendfax
# sendfax -n -d 0892161951916 /etc/motd
request id is 167 (group id 167) for host localhost (1 file)
Mit der Option -n geben wir an, dass kein automatisch generiertes Deckblatt verwendet werden soll.
Mit der Option -d definieren wir die Zielrufnummer.
Weitere Informationen zu den Optionen findet man in der manpage von sendfax.
Die abgehende Faxverbindung wird auf der Konsole entsprechend protokolliert.
pml010010*CLI> -- Accepting AUTHENTICATED call from 127.0.0.1: > requested format = ulaw, > requested prefs = (), > actual format = ulaw, > host prefs = (ulaw|alaw), > priority = mine -- Executing [0892161951916@from-iaxmodems:1] Verbose("IAX2/ttyIAX0-14418", "### Anruf vom IAXmodem-Pool an die Rufnummer 0892161951916 via PSTN ###") in new stack ### Anruf vom IAXmodem-Pool an die Rufnummer 0892161951916 via PSTN ### -- Executing [0892161951916@from-iaxmodems:2] Set("IAX2/ttyIAX0-14418", "CALLERID(num)=898833311121") in new stack -- Executing [0892161951916@from-iaxmodems:3] Set("IAX2/ttyIAX0-14418", "CHANNEL(transfercapability)=3K1AUDIO") in new stack -- Executing [0892161951916@from-iaxmodems:4] Dial("IAX2/ttyIAX0-14418", "DAHDI/G1/0892161951916") in new stack -- Requested transfer capability: 0x10 - 3K1AUDIO -- Called DAHDI/G1/0892161951916 -- DAHDI/i1/0892161951916-b2 is proceeding passing it to IAX2/ttyIAX0-14418 -- DAHDI/i1/0892161951916-b2 answered IAX2/ttyIAX0-14418 -- Hungup 'DAHDI/i1/0892161951916-b2' == Spawn extension (from-iaxmodems, 0892161951916, 4) exited non-zero on 'IAX2/ttyIAX0-14418' -- Hungup 'IAX2/ttyIAX0-14418' -- Channel 0/2, span 1 received AOC-E charging 1 unit pml010010*CLI>
Fax-Versand per eMail
Im Produktivbetrieb werden normaler Weise keine User Zugriff auf Konsole unseres Faxservers haben. Wozu auch? entweder nutzen diese zum Versand ein stand-alone Faxgerät oder einen Mutifunktionsgerät, bei dem Drucken, Scannen und Faxen in einem Gerät vereint wurden. Nachdem unser Anwender Ihre ankommenden Fax-Sendungen direkt in die individuellen eMailpostfächer gestellt bekommen, liegt es nahe auch für den Versand das Medium eMail zu nutzen. In unserem Konfigurationsbeispiel wollen wir ein Fax, genauer gesagt ein Libre-Office-Document an die Empfangsadresse 08121883179 schicken, in dem wir einfach eine eMail an 08121883179@faxserver.nausch.org.
Bevor wir nun das Libreoffice-Dokument verschicken können, ist noch ein kleiner Konfigurationsaufwand notwenig:
- User und Gruppe anlegen: Damit die beiden Dienste faxmail und sendfax nicht unter Root-Rechten laufen muss, legen wir uns einen sowohl einen System-User sendfax und einen Systemgruppe sendfax an.
Als erstes überprüfen wir ob unsere gewüschte User- und Group-ID frei ist.# grep 496 /etc/group
# grep 496 /etc/passwd
Die UID und GID 476 ist demnach nicht belegt und kann für unser Vorhaben verwendet werden.
Als nächstes legen wir uns eine Systemgruppe sendfax mit der GID 496 an.# groupadd -g 496 sendfax
Zum Schluss legen wir uns noch den User sdendfax mit der UID 496 an.# useradd -c HylaFAX_System_User -u 496 -g sendfax -s /sbin/nologin sendfax
- Mail-2-Fax-Gateway: Damit die eMail mit ggf. enthaltenen Dateianhängen an den Faxserver weitergereicht werden können, benötigen wir noch ein kleines Hilfsprogramms. Als Basis verwenden wir das Muster von der HylaFAX-Projektseite. Wir legen das Script im Verzeichnis /usr/local/bin an.
# vim /usr/local/bin/mail2fax
- /usr/local/bin/mail2fax
#!/bin/sh # # simple mail-to-fax utility using both faxmail and sendfax. # # - Lee Howard # - Django (Optionen für Empfangsbestätigung und Übertragungsmodus eingetragen) # # Mail addresses can be three ways: # 1) user@host.org # 2) "User Name" <user@host.org> # 3) user@host.org (User Name) # # in the latter cases, quotes may or may not be used, # there may or may not be any User Name at all, and User Name # may come before or after user@host.org. # # We need to make sure we handle all these possibilities for # both TO and FROM situations. Return-Path is different. # RANDOMFAX=/tmp/mail2fax.$$ mkdir $RANDOMFAX cat >> $RANDOMFAX/_message_ # Uncomment the following three lines for debugging. #set -x #exec > /tmp/mail2faxlog.$$ 2>&1 #cp $RANDOMFAX/_message_ /tmp/mail2faxmail.$$ JOBID=`grep -e "^subject:" -i $RANDOMFAX/_message_ | sed q | sed 's/^[^:]*: *//g'` TOLINE=`grep -e "^to:" -i $RANDOMFAX/_message_ | sed q` FROMLINE=`grep -e "^from:" -i $RANDOMFAX/_message_ | sed q` if [ "`echo $TOLINE | grep '<.*>'`" != "" ]; then TONUMBER=`echo $TOLINE| sed -e 's/.*<\(.*[^@]*\)@.*>.*/\1/'` else TONUMBER=`echo $TOLINE| sed -e 's/^[Tt]o://g' -e 's/[ ]*\(.*[^@]*\)@.*/\1/'` fi if [ "`echo $FROMLINE | grep '<.*>'`" != "" ]; then FROMPATH=`echo $FROMLINE| sed -e 's/.*<\(.*\).*>.*/\1/'` else FROMPATH=`echo $FROMLINE| sed -e 's/^[Ff]rom://g' -e 's/[ ]*\([^ ]*\).*/\1/'` fi # Django : 2013-01-05 # Senden ohne Empfangsbestätigung (Parameter '-R' bei sendfax) #cat $RANDOMFAX/_message_ | faxmail -v -T $FROMPATH | sendfax -vv -n -D -f "$FROMPATH" -i "$JOBID" -d $TONUMBER # Django : 2013-01-05 # Senden mit Empfangsbestätigung (Parameter '-R' bei sendfax) #cat $RANDOMFAX/_message_ | faxmail -v -T $FROMPATH | sendfax -R -vv -n -D -f "$FROMPATH" -i "$JOBID" -d $TONUMBER # Django : 2013-01-06 # Senden mit Empfangsbestätigung und im Feinmodus bei der Faxübertragung (Parameter '-R' und '-G' bei sendfax) cat $RANDOMFAX/_message_ | faxmail -v -T $FROMPATH | sendfax -G -R -vv -n -D -f "$FROMPATH" -i "$JOBID" -d $TONUMBER rm -rf $RANDOMFAX exit 0
Anschließend setzen wir noch die Ausführungsrechte für unser neues Script.
# chmod +x /usr/local/bin/mail2fax
- Postfix anpassen: Für die Annahme und Übergabe der eMails an den Faxserver, nutzen wir den MTA Postfix5), dessen Konfigiration wir nun ein klein wenig erweitern. Zunächst definieren wir einen neue Transportmethode fax in der Postfix-Konfigurationsdatei /etc/postfix/master.cf. Wir fügen also am Ende der master.cf nachfolgende Zeilen ein.
# vim /etc/postfix/master.cf
... # Django : 2013-01-06 # Dienst fax für die Übergabe der Fax-Sendungen vom Mailserver Postfix in Richtung Haylafax definiert # fax unix - n n - 1 pipe flags= user=sendfax argv=/usr/local/bin/mail2fax ${nexthop} ${user}
In der Postfix-Konfigurationsdatei main.cf definieren wir nun die Optionen virtual_alias_maps, transport_maps und fax_destination_recipient_limit.
# vim /etc/postfix/main.cf
... # Django : 2013-01-06 # Fax2Mail Gateway für die Übergabe der Fax-Sendungen vom Mailserver Postfix in Richtung Hylafax definiert # virtual_alias_maps = btree:/etc/postfix/virtual_alias_maps transport_maps = btree:/etc/postfix/transport_maps fax_destination_recipient_limit = 1
Im Anschluss setzen wir dann einen catch-all für die Mail2Fax-Sendungen in der /etc/postfix/virtual_alias_maps.
- /etc/postfix/virtual_alias_maps
# Definition der Weiterleitungen von eMails anhand der Empfangsadresse. eMails, die an den # Faxserver weitergereicht werden, über geben wir dem Dienst fax auf localhost. Alle anderen # eMails reichen wir zum zuständigen Mailgateway weiter. # # Nach dem Ändern und/oder Erweitern der Tabelle, muß noch mittels $ postmap btree:/etc/postfix/virtual_alias_maps # die zugehörige Datenbank erzeugt werden. # # Django : 2013-01-06 # Definitionen für das Mail2Fax-Gateway vorgenommen fax.nausch.org fax: * smtp:[mailgateway.dmz.nausch.org]
Auch hier erstellen wir nun die zugehörige Datenbank mit folgendem Aufruf.
postmap btree:/etc/postfix/virtual_alias_maps
Zum Schluss starten wir unseren Mailserver einmal durch.
# service postfix restart
Beim ersten Testverschicken wir nun eine einfache Textnachricht (eMail) per Faksimile. Wir Adressieren also eine Nachricht an den Empfänger 08121883179 Dies machen wir zu Testzwecken auf der Konsole unseres Clients.
# echo Nachrichtentext | mailx -s "erstes Testfax" 08121883179@fax.nausch.org
Im Maillog sehen wir dann die Annahme der eMail und das Weiterreichen an den Dienst fax.
Jan 6 22:41:00 vml000020 postfix/smtpd[26024]: connect from pml010045.intra.nausch.org[10.0.10.45] Jan 6 22:41:00 vml000020 postfix/smtpd[26024]: B01291D6C: client=pml010045.intra.nausch.org[10.0.10.45] Jan 6 22:41:00 vml000020 postfix/cleanup[26027]: B01291D6C: message-id=<201301062141.r06Lf0pb005589@pml010045.intra.nausch.org> Jan 6 22:41:00 vml000020 postfix/qmgr[25951]: B01291D6C: from=<django@pml010045.intra.nausch.org>, size=959, nrcpt=1 (queue active) Jan 6 22:41:00 vml000020 postfix/pipe[26028]: B01291D6C: to=<mail2fax@vml000020.dmz.nausch.org>, orig_to=<08121883179@fax.nausch.org>, relay=fax, delay=0.19, delays=0.09/0.01/0/0.09, dsn=2.0.0, status=sent (delivered via fax service) Jan 6 22:41:00 vml000020 postfix/qmgr[25951]: B01291D6C: removed Jan 6 22:41:00 vml000020 postfix/smtpd[26024]: disconnect from pml010045.intra.nausch.org[10.0.10.45]
Beim Empfänger sehen wir dann die einfache Textnachricht, die dort als Faksimile zugestellt wurde.
Als nächstes verschicken wir nun das Eingangs erwähnte Libre-Office-Dokument (PDF).
Dazu erstellen wir eine eMail mit dem von uns bevorzugten Mailclient, z.B. Thunderbird.
Beim Empfänger wird dann ein Fax mit 2 Seiten eingehen.
Der erfolgreiche Versand wir uns per eMail bestätigt.