Mahlzeit!
Dank vieeeeler Infos in diesem Forum und etlichen Seiten hab ich mich vor 2 Tagen nun doch mal rangewagt mir AGI, Extensions etc. anzulernen um endlich meine 1und1-Phoneflat sinnvoller ausnutzen zu können ;-)
Leider ist hier im Forum noch keiner soweit gewesen ein lauffähiges Callback niederzuschreiben. "AllesOK" hat er derzeit leider nur angekündigt.
Also musste ich ran und hab nun denk ich eine recht lauffähige aber sicherlich auch ausbaufähige Configuration zustande bekommen.
Das Ganze ist auf die 1und1 Phoneflat ausgelegt und nutzt daher SIP, kann sicherlich aber auch leicht angepasst werden!!!
Folgendes ist derzeit möglich:
Soviel zur Theorie, aber nun zur Praxis ;-)
Meine /etc/asterisk/sip.conf
(Natürlich noch die eigene Nummer und das Passwort/Secret und ggf. einige global's anpassen)
Meine /etc/asterisk/extensions.conf
(hier muss noch die eigene Nummer in "callback-in" angepasst werden)
Die nötige /etc/asterisk/callback.settings
(hier kann so einiges eingestellt werden...)
Und natürlich noch die /var/lib/asterisk/agi-bin/callback.agi
(eigentlich nix anzupassen nötig)
So...
Ich hoff es wird noch einiges erweitert und hoff auch einigen damit geholfen zu haben!
Wie schon gesagt, evtl. werden sich noch viele beteiligen und mithelfen das Ganze zu verbessern... Ideen, Vorschläge & natürlich auc Kritik ist herzlich willkommen!
MfG
Björn
Dank vieeeeler Infos in diesem Forum und etlichen Seiten hab ich mich vor 2 Tagen nun doch mal rangewagt mir AGI, Extensions etc. anzulernen um endlich meine 1und1-Phoneflat sinnvoller ausnutzen zu können ;-)
Leider ist hier im Forum noch keiner soweit gewesen ein lauffähiges Callback niederzuschreiben. "AllesOK" hat er derzeit leider nur angekündigt.
Also musste ich ran und hab nun denk ich eine recht lauffähige aber sicherlich auch ausbaufähige Configuration zustande bekommen.
Das Ganze ist auf die 1und1 Phoneflat ausgelegt und nutzt daher SIP, kann sicherlich aber auch leicht angepasst werden!!!
Folgendes ist derzeit möglich:
Callback-Initiierung:
- initiieren des Callback erfolgt ohne Rufannahme seitens Asterisk, sofern Nummer übertragen wurde
- falls nicht übertragen, nimmt der Asterisk ab und fragt den User nach seiner TelNr und legt wieder auf
---------------
Settings:
[folgendes ist komfortabel über eine Settings-Datei einstellbar!]
- es ist möglich anzugeben, dass JEDER Callback durchführen kann(Achtung, kann teuer werden!)
- zudem ist aber möglich vor dem Callback ein Passwort abfragen zu lassen
- jedem CallbackUser kann ein Passwort zugeordnet werden, ansonsten
- im Falle dass jeder Callback darf wird ein globales Passwort genutzt, wenn der User nicht bekannt ist
----------------
CallbackRückruf:
- ruft nun den User zurück
- fragt den User ggf. nach dem Passwort(gefolgt von einer Raute)
- teilt ihm nun mit, eine ZielNummer einzugeben
- nimmt diese entgegen(gefolgt von einer Raute, über einen * auch zurücksetzen möglich)
- wählt diese nun ebenfalls an und verbindet die beiden Teilnehmer, wenn der andere abnimmt
- falls nicht abgenommen, folgt ebenfalls eine Info und ggf. kann eine andere Nummer angewählt werden
Soviel zur Theorie, aber nun zur Praxis ;-)
Meine /etc/asterisk/sip.conf
(Natürlich noch die eigene Nummer und das Passwort/Secret und ggf. einige global's anpassen)
Code:
[general]
context=default
bindport=5070
bindaddr=0.0.0.0
srvlookup=yes
tos=lowdelay
maxexpirey=3600
defaultexpirey=600
disallow=all
allow=alaw,ulaw,g729,gsm,slinear
language=de
externhost=blubb.homeip.net
localnet=192.168.0.0/255.255.0.0
nat=yes
register => 49123456789:[email protected]/49123456789
[1und1_callback]
type=friend
username=49123456789
secret=123456
host=sip.1und1.de
fromuser=49123456789
fromdomain=sip.1und1.de
context=callback-in
canreinvite=no
qualify=yes
insecure=very
Meine /etc/asterisk/extensions.conf
(hier muss noch die eigene Nummer in "callback-in" angepasst werden)
Code:
[general]
static=yes
writeprotect=yes
autofallthrough=yes
clearglobalvars=no
priorityjumping=no
[globals]
[callback-in]
exten => 49123456789,1,GotoIf($[${CALLERIDNUM} = Anonymous]?callback-withoutcallid,s,1:callback-withcallid,s,1)
[callback-withoutcallid]
exten => s,1,Set(LANGUAGE()=de)
exten => s,2,Answer
exten => s,3,Wait,1
; EingabeSchleife zur Zieleingabe
exten => s,4,Set(MYNR=)
exten => s,5,Background(privacy-prompt)
exten => s,6,Set(TIMEOUT(response)=10)
exten => s,7,WaitExten
exten => _X,1,Set(MYNR=${MYNR}${EXTEN})
exten => _X,2,Goto(s,6)
; Zuruecksetzen
exten => *,1,Goto(s,4)
; Eigene Rufnummer uebergeben
exten => #,1,Background(queue-thankyou)
exten => #,2,SetCallerID(${MYNR})
exten => #,3,AGI(callback.agi)
exten => #,4,Hangup
; Handling fuer Timeout & bye
exten => t,1,Playback(vm-goodbye)
exten => t,2,HangUp
[callback-withcallid]
exten => s,1,AGI(callback.agi)
exten => s,2,Hangup
;;;;;;;;;;;
[callback-dial]
exten => _X.,1,Dial(SIP/${EXTEN}@1und1_callback,,)
[callback-go]
exten => s,1,Set(LANGUAGE()=de)
exten => s,2,Wait,1
; Soll ein Passwort abgefragt werden?
exten => s,3,GotoIf($[${ask4pass} = true]?4:7)
; Erstmal Passwort ueberpruefen
exten => s,4,DigitTimeout(5)
exten => s,5,Set(TIMEOUT(response)=10)
exten => s,6,Authenticate(${password})
; EingabeSchleife zur Zieleingabe
exten => s,7,Set(NR=)
exten => s,8,Background(vm-enter-num-to-call)
exten => s,9,Set(TIMEOUT(response)=10)
exten => s,10,WaitExten
exten => _X,1,Set(NR=${NR}${EXTEN})
exten => _X,2,Goto(s,9)
; Zuruecksetzen
exten => *,1,Goto(s,7)
; Nummer uebergeben
exten => #,1,Dial(SIP/${NR}@1und1_callback,,)
exten => #,2,Goto(#-${DIALSTATUS},1) ; Jump based on status (NOANSWER,BUSY,CHANUNAVAIL,CONGESTION,ANSWER)
; DialingStates
exten => #-NOANSWER,1,Playback(vm-nobodyavail)
exten => #-NOANSWER,2,Goto(s,7)
exten => #-BUSY,1,Playback(tt-allbusy)
exten => #-BUSY,2,Goto(#,1)
exten => #-CHANUNAVAIL,1,Playback(tt-somethingwrong)
exten => #-CHANUNAVAIL,2,Goto(t,1)
exten => #-CONGESTION,1,Playback(vm-nobodyavail)
exten => #-CONGESTION,2,Goto(s,7)
exten => _#-.,1,Goto(t,1)
; Handling fuer Timeout & bye
exten => t,1,Playback(vm-goodbye)
exten => t,2,HangUp
Die nötige /etc/asterisk/callback.settings
(hier kann so einiges eingestellt werden...)
Code:
# If set to true: the user will be promted for a password on callback
ask4pass=true
# If set to true: only the following numbers are accepted for callback
restricted=true
# If restricted=false + ask4pass=true + noUserPassFound > this password will be used
generalpass=0000
# Accepted numbers with password
TELNUMBER:PASSWORD
499876543:0001
499876542:0001
499876541:0002
Und natürlich noch die /var/lib/asterisk/agi-bin/callback.agi
(eigentlich nix anzupassen nötig)
Code:
#!/bin/bash
callbackAllow="/etc/asterisk/callback.settings"
callpath="/var/spool/asterisk/tmp/"
callfile=$callpath"call`date +%Y%m%d_%H%M%S`"
date=`date +%Y%m%d-%H%M%S`
logfile=/var/log/asterisk/full
mkdir -p $callpath
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=`echo ${name[1]} | sed 's/+//g'`
search=`grep "$callerid" $callbackAllow`
rtest=`grep "restricted=true" $callbackAllow`
ptest=`grep "ask4pass=true" $callbackAllow`
if [ -n "$rtest" ] && [ -n "$ptest" ]
then
restricted=true
ask4pass=true
password=`echo $search | sed 's/.*://g'`
elif [ -z "$rtest" ] && [ -n "$ptest" ]
then
restricted=false
ask4pass=true
if [ -n "$search" ]
then
password=`echo $search | sed 's/.*://g'`
else
password=`grep "generalpass=" $callbackAllow | sed 's/.*=//g'`
fi
elif [ -n "$rtest" ] && [ -z "$ptest" ]
then
restricted=true
ask4pass=false
password="noPass"
else
restricted=false
ask4pass=false
password="noPass"
fi
echo -n $date" : restricted=$restricted ask4pass=$ask4pass" >> $logfile
if [ $restricted == false ] || [ -n "$search" ]
then
echo " : accepting incoming call from '$callerid'!" >> $logfile
touch $callfile
echo "Channel: Local/$callerid@callback-dial" >> $callfile
echo "Callerid: $callerid" >> $callfile
echo "Context: callback-go" >> $callfile
echo "Extension: s" >> $callfile
echo "MaxRetries: 0" >> $callfile
echo "RetryTime: 10" >> $callfile
echo "SetVar: ask4pass=$ask4pass" >> $callfile
echo "SetVar: password=$password" >> $callfile
sleep 10
cp $callfile /var/spool/asterisk/outgoing
else
echo " : incoming call from '$callerid' rejected!" >> $logfile
fi
fi
So...
Ich hoff es wird noch einiges erweitert und hoff auch einigen damit geholfen zu haben!
Wie schon gesagt, evtl. werden sich noch viele beteiligen und mithelfen das Ganze zu verbessern... Ideen, Vorschläge & natürlich auc Kritik ist herzlich willkommen!
MfG
Björn