Eine schöne Callback-Lösung

allesOK

Mitglied
Mitglied seit
24 Mai 2004
Beiträge
732
Punkte für Reaktionen
0
Punkte
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.
 
Habe das unschöne CUT entfernen können. Skript ist jetzt netter ;-)
 
1) Erweiterungen sind geplant: * soll abheben und per DTMF kann man angeben wo man gerne zurück gerufen werden will ....

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
 
Nee, keine Zeit gehabt. Werde um Weihnachten herum nochmal mehr machen!
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.