.titleBar { margin-bottom: 5px!important; }

Rufauswertung wenn ausgehender Ruf nicht erfolgreich

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von konabi, 1 Dez. 2005.

  1. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo,

    ich habe nun Erfolgreich den Asterisk dazu gebracht Emails per FAX zu versenden. ( http://wpkg.org/email2fax/index.php )
    Das Script wird mit einer Email gefüttert und erwartet eine Rufnummer im Betreff Feld, sowie eine PDF pder TIFF Datei im Anhang.
    Ist beides vorhanden, wird ein call über Asterisk erzeugt und der Sender bekommt eine Bestätigungsmail FAX erfolgreich versendet.

    ABER....
    wenn Asterisk nun das FAX nicht versenden kann weil beispielsweise die FAX Rufnummer ungültig oder das FAX Gerät besetzt war wird der Sender nicht benachrichtigt.
    Also suche ich nach einer Möglichkeit den Ruf von Asterisk auszuwerten.
    Erfolgreich oder nicht Erfolgreich.


    Im Falle eines Misserfolg müsste dann ein SCRIPT ausgeführt werden, welches eine E-MAIL an den Sender generiert.


    Hat da jemand eine Idee wie ich eine Auswertung bekomme Ruf Erfolgreich oder Nicht Erfolgreich?


    Auf Wunsch kann ich auch eine Anleitung posten wie ich email2fax eingerichtet habe.


    Gruß Sven
     
  2. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    ich kenne zwar Deinen Lösungsweg nicht, aber generell liefert die Variable ${DIALSTATUS} eine Rückmeldung zum letzten Dial() Befehl der ausgeführt wurde.

    Steht diese Variabla auf ANSWERED dann wurde die Verbindung zumindest mal aufgebaut und die Gegenstelle hat abgenommen.

    http://voip-info.org/wiki/index.php?page=Asterisk+variable+DIALSTATUS
     
  3. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Genau das ist der richtige Ansatzpunkt.

    Aber vieleicht kannst Du mir noch mal auf die Sprünge helfen.

    Das Script erzeugt ein Callfile und kopiert es nach /var/spool/asterisk/outgoing

    Das Callfile sieht folgendermaßen aus:

    Code:
    Channel: CAPI/contr1/25
    MaxRetries: 1
    WaitTime: 20
    Application: txfax
    Data: /tmp/email2fax/1133447586-251216000/datei.pdf.tif|caller
    

    Jetzt müsste ich ein Macro basteln welches nur verwendet wird wenn
    ein Ruf durch dieses CallFile erzeugt wird.


    Wie könnte das gehen?

    Danke Sven
     
  4. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Ich habe nun das call File etwas verändert:

    Code:
    Channel: CAPI/contr1/25
    MaxRetries: 0
    WaitTime: 20
    Context: outgoing-fax
    Extension: sendfax
    Priority:1
    SetVar: FAXFILE=/tmp/email2fax/1133447586-251216000/install.tif
    
    und meine extensions.conf angepasst:

    Code:
    [outgoing-fax]
    exten => sendfax,1,txfax(${FAXFILE}|caller)
    exten => sendfax,n,Goto(s-${DIALSTATUS},1)
    
    exten => s-ANSWER,1,Dial(SIP/510)
    exten => s-NOANSWER,1,Dial(SIP/510)
    exten => s-CANCEL,1,Dial(SIP/510)
    exten => s-BUSY,1,Dial(SIP/510)
    exten => s-CHANUNAVAIL,1,Dial(SIP/510)
    exten => s-CONGESTION,1,Dial(SIP/510)
    exten => _s-.,1,Dial(SIP/510)
    
    Testweise wird erst einmal der SIP Teilnehmer SIP/510 angerufen.
    Leider habe ich das Problem dass die Variable ${DIALSTATUS} immer leer bleibt.


    Asterisk CLI:

    Code:
    *CLI>     -- Saved useragent "PA168S" for peer 510
        -- Attempting call on CAPI/contr1/25 for sendfax@outgoing-fax:1 (Retry 1)
    Dec  2 12:42:22 NOTICE[7474]: channel.c:2406 __ast_request_and_dial: Don't know what to do with control frame 15
      == ISDN1: Setting up DTMF detector (PLCI=0x101, flag=1)
           > Channel CAPI/ISDN1/25-0 was answered.
        -- Executing TxFAX("CAPI/ISDN1/25-0", "/tmp/email2fax/1133447586-251216000/install.tif|caller") in new stack
        -- Executing Goto("CAPI/ISDN1/25-0", "s-|1") in new stack
        -- Goto (outgoing-fax,s-,1)
        -- Executing Dial("CAPI/ISDN1/25-0", "SIP/510") in new stack
        -- Called 510
        -- SIP/510-6401 is ringing
        -- SIP/510-6401 answered CAPI/ISDN1/25-0
      == Spawn extension (outgoing-fax, s-, 1) exited non-zero on 'CAPI/ISDN1/25-0'
      == ISDN1: CAPI Hangingup
    Dec  2 12:43:11 NOTICE[7474]: pbx_spool.c:276 attempt_thread: Call completed to CAPI/contr1/25
           > CAPI INFO 0x3490: Normal call clearing
    

    Kann mir da jemand weiterhelfen?


    Danke Sven
     
  5. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Dialstatus und txfax

    Ich habe jetzt noch mal auf www.voip-info.org gesucht.
    Könnte es sein dass man ${DIALSTATUS} nicht mit der Anwendung txfax verwenden kann sondern nur mit dem DIAL Befehl?


    Gruß Sven
     
  6. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    ich weiß nicht, wie txfax arbeitet
    Aber die Variable steht nur nach einem Dial() Befehl zur Verfügung.
     
  7. cmmehl

    cmmehl Aktives Mitglied

    Registriert seit:
    15 Juni 2004
    Beiträge:
    812
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    kleinschreiber
    Ort:
    Derzeit im Irak
    Das waere in der tat hoechst loeblich!

    Lippenleckend
    Chris
     
  8. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Damit das ganze Vollständig ist zwei Kapitel Fax empfangen und Fax versenden aus dem Buch Asterisk Kompakt (BETA)
    Ein Feedback wäre gut um Unklarheiten noch zu verbessern.


    Ein Fax mit Asterisk entgegennehmen

    Ist der Asterisk mit einer ISDN Karte ausgestattet, so kann man ihn auch dazu bewegen Faxe entgegenzunehmen oder zu versenden. Dazu benötigt Asterisk zwei weitere Anwendungen, app_rxfax und app_txfax, welche sich in der Bibliothek spandsp befinden. Spandsp ist eine Bibliothek für Digital Signal Processing kurz DSP. Mit Hilfe von DSP kann man Bilder in Töne konvertieren und umgekehrt und somit auch Faxe empfangen (Ton zu Bild) oder versenden (Bild zu Ton).

    Erhältlich ist spandsp auf folgender Webseite: http://soft-switch.org/downloads/spandsp/
    Dort existieren verschieden Versionen von spandsp. Für die Asterisk Version 1.2 kann das Packet spandsp-0.0.2pre21c verwendet werden. Neben der benötigten Bibliothek spandsp gibt es ein weiteres Verzeichnis asterisk-1.2.x aus welchem die Programme app_rxfax und app_txfax heruntergeladen werden müssen, sowie das dazugehörige Patchfile apps_makefile.patch.

    Bevor man mit dem kompilieren beginnen kann muß noch sichergestellt werden dass folgende Packete installiert sind:

    libtiff, libtiff-devel
    libjpeg, libjpeg-devel
    libxml2, libxml2-devel
    libstdc++, libstdc++-devel

    Das Packet spandsp wird in das Verzeichnis /usr/src entpackt und mit folgenden Befehlen compiliert:

    ./configure
    make
    make install

    Installieret wird spandsp in folgende Verzeichnisse:

    /usr/local/include
    /usr/local/lib
    /usr/local/share

    Die beiden Anwendungen app_rxfax.c und app_txfax.c sowie das Patchfile apps_makefile.patch werden in das Anwendungsverzeichnis der Asteriskquellen. /usr/src/asterisk-version/apps/ kopiert. Anschließend muß noch das Makefile in diesem Verzeichnis mit folgendem Befehl gepatcht werden:

    patch < apps_makefile.patch

    Zum Schluß werden noch die Asterisk Quellen neu kompiliert, indem man in das Verzeichnis /usr/src/asterisk-version wechselt und die bekannten Befehle ausführt:

    make clean
    make
    make install

    Der Befehl make samples sollte diesmal nicht ausgeführt werden, da sonst die Asterisk Konfigurationsdateien im Verzeichnis /etc/asterisk überschrieben werden.
    Nach erfolgreicher Installation befinden sich die beiden Programme app_rxfax.so und app_tx_fax.so im Modulverzeichnis /usr/lib/asterisk/modules.

    Asterisk soll so konfiguriert werden, dass Faxe auf der internen Rufnummer 52 entgegengenommen werden. Diese sollen dann per E-Mail Anhang als PDF Datei an eine zentrale Adresse fax@domain weitergeleitet werden.

    Da die ankommenden Faxe von der Anwendung rxfax in eine tiff Datei geschrieben werden, müssen wir noch das Programm tiff2pdf installieren welches sich in dem Packet tiff befindet und in der Lage ist Bilddateien des Formates TIFF in PDF Dateien umzuwandeln.

    Die Konvertierung der Bilddatei in das PDF Format, sowie die Zustellung per E-MAIL an den lokalen MTA (Mail Transport Agent) erfolgt mit Hilfe des bash Scriptes fax2mail. Gegebenfalls muß der MTA für die Weiterleitung der E-Mail an den zuständigen Mailserver des Benutzers der die Mail empfangen soll eingerichtet werden. Im Fall von Postfix geschieht dies in der der Datei /etc/postfix/main.cf mit Hilfe des Eintrages relayhost= mailserver.


    Gefunden habe ich das Skript in ähnlicher Form auf der Webseite http://www.voip-info.org und etwas modifiziert. Die Hauptidee des Skriptes stammt von Scott Laird: http://scottstuff.net/scott/archives/000152.html.

    fax2mail:
    Code:
    #!/bin/sh#
    # $1 ${CALLERIDNUM}
    # $2 ${MAILADDRE}
    # $3 ${FAXFILE}
    #echo Received paramters $1 $2 $3  >>/var/log/faxmail.log
    MAILBODY=$3.txtDATETIME=`date +"%A %d %b %Y %H:%M"`
    PAGES=$(tiffinfo $3 | tail -21 |grep "Page" | cut -d "-" -f2)
    DT=$(tiffinfo $3 | tail -21 |grep "Date" |cut -d "-" -f2)
    DTFAX=${DT#*:}
    COUNT=${PAGES#*-}
    rm -f $MAILBODY
    tiff2pdf $3 -o $3.pdf
    echo >> $MAILBODY
    echo ------------------------------------------------------------- >> $MAILBODY
    echo Sie haben ein neues Fax bekommen. >> $MAILBODY
    echo >> $MAILBODYecho Sendenummer: $1 >> $MAILBODY
    echo Empfangszeit: $DTFAX >> $MAILBODY
    echo Anzahl der Seiten: $COUNT >> $MAILBODY
    echo >> $MAILBODY
    echo Das Fax befindet sich im Anhang als PDF Datei. >> $MAILBODY
    echo ------------------------------------------------------------- >> $MAILBODY
    echo >> $MAILBODY
    echo Thank you for using Open Source Software ! >> $MAILBODY
    cat $3.txt | mail -r "Asterisk" -s "FAXEINGANG" -a "$3.pdf" $2
    rm -f $MAILBODY
    

    Das Script wird in ein passendes Verzeichnis auf den Asterisk Server kopiert und muß für den Asterisk Nutzer unter dem der Asterisk Server läuft die Rechte ausführen besitzen. In meiner Konfiguration befindet sich das Script im Verzeichnis /var/lib/asterisk/scripts.

    Damit Faxe entgegen genommen werden können muß in der capi.conf die Rufnummer 52 für ankommende Rufe aktiviert sein. Der Rufnummernplan wird um ein Macro namens „faxempfang“ und einem Kontext für ankommende Faxe erweitert:

    Code:
    [macro-faxempfang]
    exten => s,1,SetVar(SCRIPTFILE=/var/lib/asterisk/scripts/fax2mail)
    exten => s,n,SetVar(FAXFILE=/var/spool/asterisk/fax/${UNIQUEID})
    exten => s,n,SetVar(MAILADDR=fax@domain)
    
    [incoming_fax]
    exten => 52,1,Wait(3)
    exten => 52,n,Macro(faxempfang)
    exten => 52,n,rxfax(${FAXFILE})
    exten => 52,n,system("${SCRIPTFILE}" "${CALLERIDNUM}" "${MAILADDR}" "${FAXFILE}")
    exten => 52,n,Hangup
    


    Im Marco faxempfang werden folgende die Variablen gesetzt:

    SCRIPTFILE
    Das Script welches das ankommende Fax in eine PDF Datei umwandelt und anschließend die PDF Datei als E-Mailanhang versendet.

    FAXFILE
    Der Speicherort des ankommenden Faxes. Mit Hilfe der Variablen ${UNIQUEID} wird dafür gesorgt dass jedes ankommende fax einen eindeutigen Dateinamen in Form einer Zahl erhält.

    MAILADDR
    Die E-Mailadresse an der das FAX gesendet werden soll.


    [incoming_fax]
    exten => 52,1,Wait(3)
    Im Kontext [incomming_fax] wird nun bei einem ankommenden FAX auf der Rufnummer 52 als erstes für 3 Sekunden gewartet.

    exten => 52,n,Macro(faxempfang)
    Danach wird das Macro Faxempfang aufgerufen.

    exten => 52,n,rxfax(${FAXFILE})
    Im dritten Schritt nimmt die Anwendung rxfax das Fax entgegen und erstellt eine tif Datei im Verzeichnis /var/spool/asterisk/fax

    exten => 52,n,system("${SCRIPTFILE}" "${CALLERIDNUM}" "${MAILADDR}" "${FAXFILE}")
    Mit Hilfe des Befehls system wird auf der Linux Shell das Script fax2mail (${SCRIPTFILE}) ausgeführt. Dem Scriptfile werden dabei die Parameter die CallerID des Sendenten (${CALLERIDNUM}), E-Mailadresse des Empfängers "(${MAILADDR) sowie das empfangene Faxdokument (${FAXFILE}) übergeben.

    Asterisk ist nun bereit Faxe entgegen zu nehmen.


    Ein Fax versenden

    Nachdem Asterisk nun Faxe annehmen, und als E-Mail an Benutzer weiterleiteten kann wollen wir nun den entgegengesetzten Weg probieren. Wieder kommt uns ein kleines Linux Script namens email2fax zur Hilfe. Email2fax wurde von Tomasz Chmielewsky geschrieben und bietet die Möglichkeit TIFF und PDF Dokumente per E-Mail als Fax zu versenden.
    Dazu wird eine E-Mail mit der zu sendeten Datei als Anhang an den Asterisk Server gesendet und in der Betreffzeile die entprechende Rufnummer angegeben. Das Script wertet diese Informationen aus konvertiert den Anhang und übergibt das ganze an Asterisk, welcher dann ein Fax an die entsprechende Rufnummer mit Hilfe der Anwendung app_txfax.c sendet.

    Email2Fax kann auf der Webseite http://wpkg.org/email2fax/index.php heruntergeladen werden und ist unter der GPL Lizenz veröffentlicht. Für das Versenden kommt wieder die Bibliothek spandsp, sowie die schon besprochene Asterisk Anwendung app_txfax.c zum Einsatz.
    Außerdem müssen das Packet munpack installiert sein, welches in der Lage ist MIME Nachrichten zu decodieren. Munpack befindet sich im Packet mpack , welches leider nicht in jeder Distribution enthalten ist. In diesem Fall kann man versuchen die im Packet email2fax mitgelieferten Programme mpack und mupack zu verwenden. Sollte dies fehlschlagen, sucht man sich am besten ein passendes rpm Packet über http:/fr2.rpmfind.net.
    Als letztes muß noch sichergestellt werden dass die Packete libtiff sowie Ghostscript installiert sind. Ghostscript sollte dabei in einer Version >= 8 vorliegen.

    Nach dem Download von email2fax in das Verzeichnis /usr/src/ wird dieses mit Hilfe von tar entpackt:

    # cd usr/src
    # tar –xvjf email2fax-version

    Anschließend wird die in dem Archiv befindliche ausführbare Datei email2fax in das Verzeichnis /usr/local/bin kopiert:

    # cp /usr/src/email2fax-version/ /usr/local/bin

    Im Verzeichnis bin des Archivs befinden sich außerdem die beiden Programme mpack und munpack, welche nach /usr/bin/ kopiert werden:

    # cp /usr/src/email2fax-version/usr/bin/m* /usr/bin


    In dem Script email2fax müssen nun noch ein paar Variablen angepasst werden:

    FAXMAIL=Asterisk FAX <asterisk@domain.de>
    Nach dem versenden eines Faxes durch Asterisk oder bei Problemen erhält der der Sender eine E-Mail welche als Absender diesen Namen enthält.

    CHANNEL="CAPI/contr1"
    Über welchen Channel das Fax versendet wird.

    LOGFILE=/var/log/asterisk/faxlog
    In dieser Datei wird der Fax Versand protokolliert.

    TMPDIR=/tmp/email2fax
    In diesem Verzeichnis wird die E-Mail entpackt.

    MAXAGE=300
    Zeit in Minuten wie lange die Dateien in TEMPDIR aufbewahrt werden.

    ASTERISKUSER=asterisk
    Hier muß der Nutzer angegeben werden unter welchem der Asterisk Dienst läuft.


    Bevor wir email2fax in Verbindung mit Asterisk nutzen, sollten wir auf der Linux Shell prüfen ob unsere Installation erfolgreich und alle Einstellungen richtig sind.
    Dazu erzeugt man am besten eine E-Mail mit einer PDF- oder TIF-Datei im Anhang und einer gültigen Fax Rufnummer im Betreff, welche als eml Datei abgespeichert wird. Für Windows Benutzer ist es dabei wichtig diese Datei mit dem Zeilenumbruchformat für UNIX zu speichern. Ich hatte das nicht beachtet und lange lange lange… nach dem Fehler gesucht.

    Diese Datei wird dann auf den Asterisk Server kopiert und über die Linux Shell durch folgenden Befehl an Asterisk übergeben:

    # cat mail.eml | sudo –u asteriskuser email2fax –-debug

    Läuft alles glatt, haben Sie nun Ihr erstes Fax über Asterisk versendet. Bei Problemen hilft ein Blick in das Logfile:

    # tail –f /var/log/asterisk/faxlog


    Als nächstes muß noch der auf dem Asterisk Server laufende MTA (Mail Transfer Agent) eingerichtet werden um die entsprechenden E-Mails entgegenzunehmen um sie anschließend an das Script email2fax zu übergeben.

    Im folgenden Beispiel verwende ich Postfix als MTA. E-Mails die als Fax über Asterisk versendet werden sollen werden an die Adresse sendefax@asterisk.local geschickt. Um diese an das Scrip tzu übergeben eignet sich beispielsweise der lokale Mailer Procmail.

    Damit Procmail von Postfix Beachtung findet muß in der Datei /etc/postfix/main.cf folgender Eintrag vorgenommen werden:


    mailbox_comand = /usr/bin/procmail


    Möchte man Procmail global verwenden erstellt man im Verzeichnis /etc/ die Datei procmailrc mit entsprechenden Rechten für den Benutzer root:

    # touch /etc/procmailrc
    # chown root:root /etc/procmailrc
    # chmod 644 /etc/procmailrc

    In der Datei wird folgende Regel erstellt:


    VERBOSE=YES
    LOGFILE=/var/log/procmail
    :0fw#* ^To: <sendefax@asterisk.local>| /usr/local/bin/email2fax


    Dadurch werden E-Mails, welche an sendefax@asterisk.local adressiert sind, ab sofort an das Script email2fax übergeben, und über Asterisk als Fax versendet.


    ______________________________________
    Auszug aus dem Buch "Asterisk Kompakt"
    www.bomots.de
    ______________________________________
     
  9. cmmehl

    cmmehl Aktives Mitglied

    Registriert seit:
    15 Juni 2004
    Beiträge:
    812
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Beruf:
    kleinschreiber
    Ort:
    Derzeit im Irak
    Tolle sache, konabi,

    vielen dank fuer dies detaillierte beschreibung!

    Eine frage haett' ich da noch: wo wird denn festgelegt, aus welchem context und mit welcher nummer das zielfax angewaehlt wird? Das sollte ja idealerweise je nach destination festgelegt werden koennen, oder? Wie hast du das geloest?

    Viel gruesse!
    Chris
     
  10. konabi

    konabi Mitglied

    Registriert seit:
    11 Apr. 2005
    Beiträge:
    424
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo Chris,
    die Zielnummer zum versenden des Faxes wird im Betreff Teil der E-Mail angegeben.
    Das Script email2fax "pflückt dann die Email auseinander" und erzeugt ein Asterisk call File welches in das Verzeichnis /var/spool/asterisk kopiert wird. Darauf hin startet Asterisk einen Ruf.
    und sendet ein FAX an die angegebene Rufnummer im Betreff Teil.
    Das call File kannst Du dir übrigens im /tmp/ email2fax Verzeichnis anschauen. Du kannst es auch verändern und einfach mal in das Verzeichnis /var/spool/asterisk kopieren und sehen was der Asterisk macht.
    Ein Kontext ist dabei nicht angegeben. Es handelt sich ja auch um einen ausgehenden RUF welcher nicht zu einem Kontext zugeordnet werden muß.

    Ich werde aber das SCRIPT noch verändern und einen Kontext im callfile angeben. Siehe weiter oben [outgoing-fax]. Eine Auswertung des Rufs mittels ${DIALSTATUS} geht aber dabei nicht aber es könnte so gehen:

    Callfile mit Angabe Kontext:
    Code:
    Channel: CAPI/contr1/25
    MaxRetries: 0
    WaitTime: 20
    Context: outgoing-fax
    Extension: sendfax
    Priority:1
    SetVar: FAXFILE=/tmp/email2fax/1133447586-251216000/install.tif 
    
    extension.conf:

    Code:
    [outgoing-fax]
    exten => sendfax,1,txfax(${FAXFILE}|caller)
    exten => sendfax.101,system(errorscript)
    
    Das heist wenn der Faxversand nicht erfolgreich war erzeuge ich mit dem Hilfe von scriptfile eine Email und sende sie an den Faxversender.
    Werde das mal nächtse Woche probieren.


    Gruß Sven