Hallo!
Wollt ihr CALLBACK? OK, here it is:
Als erstes brauchen wir ein AGI-Skript:
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!)
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
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.
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
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.