Asterisk - Faxempfang mit XMPP Ausgabe

Faxe mit Asterisk empfangen und über XMPP anzeigen lassen

asterisk-xmpp-faxempfang

Warum das Ganze?

Da der Faxempfang in meiner Fritzbox gestört ist, musste ich mir eine Ersatzlösung einfallen lassen.

Da mein Asterisk ja eh schon läuft und auch schon externe Nummern verwaltet, lag es nahe, dort eine Lösung zu implementieren. Und wenn man schon mal dran ist, warum nicht an seine eigenen Wünsche anpassen? Mein Messenger Client läuft eh die ganze Zeit und dort sehe ich eher nach, ob es irgendetwas Neues gibt als in den ganzen eMails, welche mittlerweile einen nicht unerheblichen Teil an SPAM beinhalten.

Herausgekommen ist eine Lösung, welche den Faxempfang über Asterisk ermöglicht und mittels Dialplan das empfangene Fax via XMPP an einen beliebigen (allerdings dann fest eingestellten) XMPP-Empfänger senden kann.

Die Konfiguration der externen Rufnummer spare ich mir an dieser Stelle, ich habe hier im Blog schon verschiedene Beispiele dafür gegeben, z. B. Telekom Konfiguration oder Sipgate Konfiguration.

Der Dialplan (extensions.conf)

exten => +49vvvvnnnnnn,1,NoOp(Faxempfang von ${CALLERID(num)})
 same => n,Answer()
 same => n,Set(FAXOPT(headerinfo)=Empfangenes Fax)
 same => n,Set(FAXFILE=/var/spool/asterisk/fax/fax-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID}.tif)
 same => n,ReceiveFAX(${FAXFILE})
 same => n,GotoIf($["${FAXOPT(status)}" = "SUCCESS"]?success:failed)
 same => n(success),NoOp(Fax erfolgreich empfangen: ${FAXFILE})
 same => n,JabberSend(xmpp-kontext,empfaenger@xmpp-server.de,Asterisk hat ein Fax von ${CALLERID(num)} empfangen unter ${FAXFILE})
 same => n,System(/usr/local/bin/fax2pdf-xmpp.sh "${FAXFILE}" "${CALLERID(num)}")
 same => n,Hangup()
 same => n(failed),NoOp(Faxempfang fehlgeschlagen: ${FAXOPT(error)})
 same => n,JabberSend(xmpp-kontext,empfaenger@xmpp-server.de,fehlgeschlagener Faxempfang von ${CALLERID(num)})
 same => n,Hangup()

Erklärung: die erste Zeile ist einfach die ankommende Rufnummer als extension (vvvv steht für die Vorwahl, nnnnnn für die Telefonnummer, auf der Asterisk reagieren soll). Die nächsten Zeilen legen fest, wo Asterisk das empfangene Fax hinspeichern soll und unter welchem Namen es wiederzufinden ist. Danach erfolgt mit der Funktion ReceiveFAX der eigentliche Faxempfang.

Je nach Erfolg oder Mißerfolg wird in unterschiedliche Verzweigungen abgebogen. Die beiden JabberSend Funktionen benachrichtigen den Empfänger mit der Adresse empfaenger@xmpp-server.de über den Erfolg oder Mißerfolg des (vermeintlichen) Faxempfangs.

Die XMPP/Jabber Konfiguration (/etc/asterisk/xmpp.conf)

Damit der Versand über XMPP funktioniert, muss der o. g. Kontext xmpp-kontext in der Datei /etc/asterisk/xmpp.conf definiert werden, in etwa so:

[xmpp-kontext]
type=client
serverhost=xmpp-server.org
username=asterisk@xmpp-server.org
secret=StrenggeheimesPasswort
priority=25
port=5222
usetls=yes
usesasl=yes
status=available
statusmessage="Immer da"
timeout=5

Mit diesen Zugangsdaten loggt sich Asterisk bei dem (hier fiktiven) XMPP-Server xmpp-server.org ein. Diese müssen natürlich den realen Bedingungen angepasst werden.

Das Bash-Script (/usr/local/bin/fax2pdf-xmpp.sh)

Im obigen Dialplan wird aus Asterisk das Bash-Script /usr/local/bin/fax2pdf-xmpp.sh mit 2 Parametern aufgerufen. Der erste Parameter ist der Name der gespeicherten Faxdatei inklusive Pfad, der zweite Parameter beinhaltet die Rufnummer, von der aus das Fax gesendet wurde. Nachfolgend das eigentliche Bash-Script:

#!/bin/bash
set -euo pipefail

TIFF="$1"
CALLER="${2:-unbekannt}"

# Pfade löschen/erneuern und Endung umbennen
dateiname_ohne_ende="${TIFF##*/}"  # "datei.tif"
dateiname_neu="${dateiname_ohne_ende%.tif}.pdf"
PDF="/tmp/${dateiname_neu}"

tiff2pdf -o "$PDF" "$TIFF"

/usr/bin/go-sendxmpp -h $PDF empfaenger@xmpp-server.de && rm -f "$PDF"

# optional: TIFF nach erfolgreichem Versand löschen
# /tmp/ Verzeichnis aufräumen
#rm -f "$TIFF"

exit 0

Damit das Script funktioniert, bedarf es der Installation zweier weiterer Programme:

  • go-sendxmpp mittels apt install go-sendxmpp und
  • tiff2pdf mittels apt install libtiff-tools

go-sendxmpp sendet das Fax als Anhang (Option -h kurz für http-upload) an den XMPP-Empfänger empfaenger@xmpp-server.de. Dieser Empfänger sollte sinnvollerweise der Gleiche sein wie im Asterisk Dialplan.

tiff2pdf macht davor die Umwandlung der empfangenen Faxdatei (im TIFF-Format) in das bekannte PDF-Format

Das Script muss natürlich für den Asterisk-Benutzer (oder global) ausführbar sein, z. B. mithilfe von chmod +x /usr/local/bin/fax2pdf-xmpp.sh

Schlussbemerkung

Bei mir läuft das Ganze aktuell unter Debian 13 (trixie). Bei anderen Distributionen müssen ggf. die Paketnamen angepasst oder andere Lösungen implementiert werden.

Nach der Installation von go-sendxmpp ist dessen Konfiguration noch anzupassen.