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

Eine schöne Callback-Lösung

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von allesOK, 27 Okt. 2004.

  1. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo!

    Wollt ihr CALLBACK? OK, here it is:

    Als erstes brauchen wir ein AGI-Skript:

    Code:
    #!/bin/bash
    callbacks="/etc/asterisk/callback.conf"
    callpath="/var/spool/asterisk/outgoing/tmp/callback/"
    callfile=$callpath"call`date +%Y%m%d_%H%M%S`"
    date=`date +%Y%m%d-%H%M%S`" > "
    logfile=/var/log/asterisk/full
    
    i=0
    read -a name
    while [ "${name[0]}" != "agi_callerid:" ]
    do
      read -a name
      i=`expr $i + 1`
      if [ $i -ge 20 ] ; then
       break
      fi
    done
    if [ ${name[0]} = "agi_callerid:" ] ; then
      callerid=${name[1]}
      echo $date"new incoming call from: $callerid " >> $logfile
    
      line=`grep "^SRC=$callerid" $callbacks`
     echo $line >> $logfile
    
      if [ -n "$line" ]; then
        callback_msn=`echo $line | sed -e 's/SRC=[0-9]* *//g' -e 's/CMSN=//g' -e 's/DEST=[0-9]* *//g' -e 's/ *GMSN=[0-9]* *//g'`
        destination=`echo $line | sed -e 's/SRC=[0-9]* *//g' -e 's/CMSN=[0-9]* *//g' -e 's/DEST=//g' -e 's/ *GMSN=[0-9]* *//g'`
        msn=`echo $line | sed -e 's/SRC=[0-9]* *//g' -e 's/CMSN=[0-9]* *//g'  -e 's/DEST=[0-9]* *//g' -e 's/GMSN= *//g'`
    
        sleep 1
    
        echo $date"callback to $destination over $msn" >> $logfile
        echo "Channel: Local/$destination@callback/n"                >> $callfile
        echo "Callerid: $callback_msn"                               >> $callfile
        echo "Context: callback-disa"                                >> $callfile
        echo "Extension: $msn"                                       >> $callfile
        echo "MaxRetries: 0"                                         >> $callfile
        echo "RetryTime: 10 "                                        >> $callfile
    
        sleep 3
     mv $callfile /var/spool/asterisk/outgoing
      fi
    fi
    
    echo $date"end of entry" >> $logfile
    
    Es ist nicht das Beste vom Besten, aber es funktioniert gut. Insbesondere das Logging kann noch verbessert werden.

    Dann brauchen wir die Config-Datei /etc/asterisk/callback.con (falls ihr eine andere bevorzugt, oben anpassen nicht vergessen!)

    Code:
    SRC=SOURCE CMSN=CALLBACK_MSN DEST=DESTINATION GMSN=GOING_MSN
    
    SRC=069123456 CMSN=11111 DEST=069654321 GMSN=22222
    SRC=089123456 CMSN=33333 DEST=089654321 GMSN=44444
    
    
    Die erste Zeile dient nur der Erklärung. Die zweite ist interessanter:
    Nur wenn eine SRC-Nummer passiert überhaupt etwas. Und zwar folgendes: Über die MSN CMSN wird dann eine Verbidung zu DEST aufgebaut. Ja das ist schön, denn so kann man zum sich zum Beispiel vom Handy aus auf seiner Homezone zurück rufen lassen. GMSN wird dann später benutzt um die eigentliche Externverbindung aufzubauen. Mehr dazu gleich.

    Jetzt müssen wir das noch einbinden: extensions.conf
    Code:
    [macro-callback]
    
    exten => s,1,Wait(0.2)
    exten => s,2,AGI(callback.agi)
    exten => s,3,Hangup
    
    [tcom-in]
    ; 55555 ist die Callback-Init-MSN
    exten => 55555,1,Macro(callback)
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; callback ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    [macro-disa]
    ;ARG1 context
    exten => s,1,DigitTimeout(7)
    exten => s,2,ResponseTimeout(30)
    exten => s,3,DISA,no-password|${ARG1}
    
    [callback]
    
    exten => _X.,1,Wait(10)
    exten => _X.,2,Macro(user${CALLERIDNUM})
    exten => _X.,3,Goto(callout,${EXTEN},1)
    
    [callback-disa]
    
    exten => _X.,1,Macro(user${EXTEN})
    exten => _X.,2,Macro(disa,intern-post)
    
    
    Wer die user-Macros noch nicht kennt, sollte sich in diesem Thread mal informieren.

    Ok, erster Teil: Wir warten zunächst etwas. Dann splitten wir die Exten in zwei Teile (wusste nicht wie ich anders per Callfile gehende MSN und Destination zu einem Kontext schicken soll. Das Macro setzt vor allem die CALLERID richtig. in [callout] geht es raus - wie ist mir egal, dass müsst ihr selbst hinbiegen. Ich verwende natürlich wieder die Preselection/LCR Methode auf meinem schon eben verlinkten Thread. (Freaks können somit auch leicht alle Rückrufe über einen bestimmten Sip-Provider laufen lassen).

    OK, zweiter Teil: Dieser ist wichtig, wenn der Rückruf kam und du angenommen hast. Dann landest du in [callback-disa]. Die Extension _X. setzt nur die neue abgehende MSN mittels user-Macro wieder richtig. Und dann ab in DISA in einen beliebigen Kontext. Was ihr da erlaubt ist mir auch wieder egal. Ich lande dann in einem Kontext der die gleichen Rechte hat wie SIP-Telefone (also intern & amt per '0').

    Viel Spass mit dem ganzen!

    Anhang:

    1) Erweiterungen sind geplant: * soll abheben und per DTMF kann man angeben wo man gerne zurück gerufen werden will ....

    2) BUG suchen: Wenn man nicht schnell genug im DISA-Kontext wählt, bleibt die Verbindung hängen ;-( Hat dazu jemand eine Idee?
    EDIT: Scheint nur zu hängen, wenn die Verbindung über SIP rausging. Mehr Details folgen.
     
  2. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Habe das unschöne CUT entfernen können. Skript ist jetzt netter ;-)
     
  3. chase

    chase Neuer User

    Registriert seit:
    22 Sep. 2004
    Beiträge:
    3
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo allesOK und alle anderen Asterisk-Profis :)
    Lese schon seit einiger Zeit hier im tollen Forum mit und habe schon sehr viel im Bereich Asterisk gelernt.
    Dein LCR-Script ist echt Sahne....

    Leider habe ich selbst von agi-Scripten etc. noch nicht soviel Ahnung.
    Interessieren würde mich Deine CallBack-Lösung unter Punkt 1.
    Bist Du da schon weiter?

    tschuessi
    chase
     
  4. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Nee, keine Zeit gehabt. Werde um Weihnachten herum nochmal mehr machen!
     
  5. allesOK

    allesOK Mitglied

    Registriert seit:
    24 Mai 2004
    Beiträge:
    732
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
  6. chase

    chase Neuer User

    Registriert seit:
    22 Sep. 2004
    Beiträge:
    3
    Zustimmungen:
    0
    Punkte für Erfolge:
    0