Fax-Server mit HylaFAX+ unter CentOS 6.x

Bild: HylaFax Schriftzug

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.

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

Bei der Konfiguration unseres Faxservers gibt es nun zu berücksichtigen, an welcher TK-Anlage der Fax-Server betrieben werden soll.

  1. Analoge Nebenstelle einer TK-Anlage
  2. Integration in einem VoIP-Server Asterisk

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"

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.

  1. 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
  2. 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"

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
 
...

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

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)          ;

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

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

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.

  1. 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.

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"

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


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

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


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>


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:

  1. 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
  2. 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
  3. 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.

Bildschirmhardcopy Mail2FAX

Beim Empfänger wird dann ein Fax mit 2 Seiten eingehen.

Der erfolgreiche Versand wir uns per eMail bestätigt.

Versandbestätigung des Faxes per eMail

Links


1)
TerminalAdapter
2)
Datenfreigabe, RETURN
3)
Command Line Interface
4)
Bastard Operator from Hell
5)
Mail Transport Agent
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • centos/hylafax_c6.txt
  • Zuletzt geändert: 31.10.2023 19:26.
  • von 127.0.0.1