Callback Reloaded

FlashIT

Neuer User
Mitglied seit
12 Jul 2005
Beiträge
90
Punkte für Reaktionen
0
Punkte
0
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:

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/[email protected]"           >> $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
 

RobertHerter

Neuer User
Mitglied seit
17 Dez 2004
Beiträge
151
Punkte für Reaktionen
0
Punkte
16
Hallo,

ich habe sowas am laufen:

/var/lib/asterisk/agi-bin/callback.agi

[php:1:264a4940f4]
#!/usr/bin/php

<?php
ob_implicit_flush(true);
$err=fopen("php://stderr","w");
$in = fopen("php://stdin","r");
while (!feof($in)) {
$temp = str_replace("\n","",fgets($in,4096));
$s = split(":",$temp);
$agi[str_replace("agi_","",$s[0])] = trim($s[1]);
if (($temp == "") || ($temp == "\n")) {
break;
}
}
$cf = fopen("/var/spool/asterisk/outgoing/cb".$agi["callerid"],"w+");
#fputs($cf,"Channel: SIP/".$agi["callerid"]."@voipbuster_robert\n");
fputs($cf,"Channel: IAX2/voipbuster_robert/".$agi["callerid"]."\n");
fputs($cf,"Context: rueckruf\n");
fputs($cf,"Extension: ".$agi["callerid"]."\n");
fputs($cf,"Callerid: Callback <".$agi["callerid"].">\n");
fputs($cf,"SetVar: CALLERIDNUM=".$agi["extension"]."\n");
fputs($cf,"Priority: 1\n");
fputs($cf,"MaxRetries: 3\n");
fputs($cf,"WaitTime: 15\n");
fputs($cf,"RetryTime: 30\n");
fputs($cf,"Account: ".$agi["callerid"]."\n");
fclose($cf);
fclose($in);
fclose($err);
?>
[/php:1:264a4940f4]

und hier die auszüge aus der extension.conf

Code:
[globals]
ENUMSEPARATETEL => yes

;Hier die CID's die Callback haben mit 0 Abschließen
CALLBACK1=xxx
CALLBACK2=xxx
CALLBACK3=xxx
CALLBACK4=xxx
CALLBACK5=xxx
CALLBACK6=xxx
CALLBACK7=0

; Nicht erlaubt abspielen
[macro-notallowed]
exten => s,1,Answer
exten => s,2,Wait(1)
exten => s,3,Playback(ss-noservice)
exten => s,4,Playtones(busy)
exten => s,5,Wait(5)
exten => s,6,Hangup

; Nicht erlaubte Nummern bei Callback
[macro-checkallowed]
exten => s,1,GotoIf($[${ARG1:0:3} = 019]?50)
exten => s,2,GotoIf($[${ARG1:0:4} = 0900]?50)
exten => s,3,GotoIf($[${ARG1:0:3} = 015]?50)
exten => s,4,GotoIf($[${ARG1:0:3} = 016]?50)
exten => s,5,GotoIf($[${ARG1:0:3} = 017]?50)
exten => s,6,GotoIf($[${ARG1:0:3} = 018]?50)
exten => s,7,GotoIf($[${ARG1:0:3} = 010]?50)
exten => s,8,GotoIf($[${ARG1:0:4} = 0088]?50)
exten => s,50,Macro(notallowed);

;Überprüfen ob Nummer am Callback teilnimmt
[macro-iscallback]
;   ${ARG1} - CallerID
exten => s,1,SetVar(EINTRAG=0)
exten => s,2,SetVar(EINTRAG=$[${EINTRAG} + 1])
exten => s,3,SetVar(NR=$[${CALLBACK${EINTRAG}}])
exten => s,4,SetVar(L=${LEN(${NR})})
exten => s,5,GotoIf($[${L} < 2]?50)
exten => s,6,SetVar(SUB=$[1 - ${L}])
exten => s,7,GotoIf($[${L} > ${LEN(${ARG1})}]?2)
exten => s,8,GotoIf($[${NR:1} = ${ARG1:${SUB}}]?20:2)

exten => s,20,Macro(callback,${NR})
exten => s,21,Hangup

exten => s,50,Macro(stdexten,${MACRO_EXTEN},SIP/${MACRO_EXTEN})
exten => s,51,Hangup

;Callback setzen
[macro-callback]
exten => s,1,NoCDR()
exten => s,2,Wait(1)
exten => s,3,SetCallerID(0049${ARG1:1})
exten => s,4,AGI,callback.agi
exten => s,5,Hangup

; Wird beim Callback ausgeführt
[rueckruf]
exten => s,1,SetLanguage(de)
exten => s,2,SetVar(NR=)
exten => s,3,Noop
exten => s,4,Noop(${CALLERID})
exten => s,5,Wait(2)
exten => s,6,Background(callback)
exten => s,7,ResponseTimeout(60)
exten => s,8,WaitExten

exten => _X,1,SetVar(NR=${NR}${EXTEN})
exten => _X,2,Goto(s,8)

exten => *,1,Goto(s,1)

exten => #,1,Macro(checkallowed,${NR})
exten => #,2,GotoIf($[${NR:0:2} = 00]?5)
exten => #,3,Macro(dialout,0049${NR:1},voipbuster_robert,IAX2)
exten => #,4,Goto(#,6)
exten => #,5,Macro(dialout,${NR},voipbuster_robert,IAX2)
exten => #,6,GotoIf($[${DIALSTATUS} = NOANSWER]?7)
exten => #,7,GotoIf($[${DIALSTATUS} = CONGESTION]?2)
exten => #,8,Playback(vm-nobodyavail)
exten => #,9,Goto(s,1)

exten => t,1,Playback(tt-allbusy)
exten => t,2,Playtones(busy)
exten => t,3,Wait(5)
exten => t,4,HangUp

[macro-stdexten];
;
; Standard extension macro:
;   ${ARG1} - Extension  (we could have used ${MACRO_EXTEN} here as well
;   ${ARG2} - Device(s) to ring
;
exten => s,1,Dial(${ARG2},60,thw)
exten => s,2,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(u${ARG1})
exten => s-NOANSWER,2,Goto(default,s,1)
exten => s-BUSY,1,Voicemail(b${ARG1})
exten => s-BUSY,2,Goto(default,s,1)
exten => _s-.,1,Goto(s-NOANSWER,1)
exten => a,1,VoicemailMain(${ARG1})

[macro-dialout]
;   ${ARG1} - Extension  (we could have used ${MACRO_EXTEN} here as well
;   ${ARG2} - outprovider
;   ${ARG3} - ProtoKoll (SIP oder IAX2)

exten => s,1,GotoIf($["${ARG1:0:2}" = "00"]?2:4)
exten => s,2,SetVar(ENUMEXTEN=${ARG1:2})
exten => s,3,Goto(6)
exten => s,4,GotoIf($["${ARG1:0:1}" = "0"]?5:6)
exten => s,5,SetVar(ENUMEXTEN=49${ARG1:1})
;exten => s,6,Goto(51)
exten => s,6,agi,enumlookup.agi
exten => s,7,SetCDRUserField(${ARG1})
exten => s,8,SetVar(EINTRAG=0)
exten => s,9,GotoIf($[${ENUMENTRIES}]?10:51)

exten => s,10,SetVar(EINTRAG=$[${EINTRAG} + 1])
exten => s,11,GotoIf($[$[${ENUMENTRY${EINTRAG}:0:3} = IAX] | $[${ENUMENTRY${EINTRAG}:0:3} = SIP]]?12:14)

; What to do with IAX(2) and SIP entries:
exten => s,12,BackGround(enum-lookup-successful)
exten => s,13,Dial(${ENUMENTRY${EINTRAG}},120,THW)
exten => s,14,GotoIf($[${EINTRAG} < ${ENUMENTRIES}]?10:51)

; If there are no enum entries or if all of them fail:
exten => s,51,GotoIf($[${ARG3} = IAX2]?54)
exten => s,52,Dial(${ARG3}/${ARG1}@${ARG2},120,THW)
exten => s,53,Hangup
exten => s,54,Dial(${ARG3}/${ARG2}/${ARG1},120,rTHW)
exten => s,55,Hangup

exten => t,1,Playtones(busy)
exten => t,2,Wait(4)
exten => t,3,Hangup


[default]
exten => 7227988,1,Macro(iscallback,${CALLERIDNUM}) ; Nummer die auf Callbacks reagieren soll
Ich hoffe das Hilft etwas weiter. Ist quick and dirty aber funktioniert.

Grüße

Rivendel
 

FlashIT

Neuer User
Mitglied seit
12 Jul 2005
Beiträge
90
Punkte für Reaktionen
0
Punkte
0
Ui Danke!
Das SetVar im Callfile war nun genau das was ich gebraucht hab ;-)
Simpel, aber nach 2 Tagen Studieren kann man ja nich alles kennen hrhr...

Das ENUM-Lookup ist auch nicht schlecht, kann ja aber gern jeder selbst einbauen dann, also eher optional, da nicht direkt fürs eigentliche Callback zuständig...

Derzeit mach ich einen normalen SIP-Anruf, so wie er auch hineinkommt und dieses Dial kann dann ja problemlos erweitert werden...

Nun bin ich soweit, dass es über eine Settingsfile möglich ist:
- zu sagen ob nur die eingetragenen Nummern aus der Settingsfile Callback dürfen oder global offen
- zu sage, ob ein password abgefragt werden soll(dieses steht hinter den Nummern jeweils ODER wenn "global offen" das globale passwort)
 

FlashIT

Neuer User
Mitglied seit
12 Jul 2005
Beiträge
90
Punkte für Reaktionen
0
Punkte
0
Ich such derzeit noch eine etwas bessere Variante deines checkallowed-Teils!
Denn ich möchte diese Config-Sachen alle in meiner callback.settings Datei haben, wo auch alles andere liegt und dafür nicht immer zusätzlich in der extensions.conf rumfummeln müssen

Ich möhte über das agi-Script eine Liste von Vorwahlnummern übergeben, welche nicht genutzt werden dürfen...
Das Problem ist, wie übergeb ich eine Liste...

Da es scheinbar kein Command dafür gibt, dachte ich daran, die Liste mit ":"'s zu einer Zeile zusammenzufügen und hab dann:
01234:3132:123:...

Dies übergeb ich im setVar und muss nun auch QuickAndDirty die Liste Zeichen für Zeichen durchgehen und jeweils immer bis zu einem ":" durchgehen und dann das Gelesene in eine neue Var speichern jeweils...

Dann hab ich eine schöne Liste die ich durchgehen kann, wenn der User etwas anwählt...

Jemand was besseres oder kann ichs nur so machen?
Evtl. gibts ja doch eine Möglichkeit eine Liste als Liste mit dem CallFile mitzugeben...
 

FlashIT

Neuer User
Mitglied seit
12 Jul 2005
Beiträge
90
Punkte für Reaktionen
0
Punkte
0
Obwohl...
Eigentlich ists erstmal egal, jeder der Callback darf, sollte auch wissen was er anrufen darf ;-)
 

FlashIT

Neuer User
Mitglied seit
12 Jul 2005
Beiträge
90
Punkte für Reaktionen
0
Punkte
0
Posting 1 hab ich mal überarbeitet und das Script etc. nun damit vorzustellen!

Sorry fürs 3fach-Posten! Next time editier ich ;-)
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Hatte heute einen recht "lustigen" Bug...
Habe von der Arbeit aus auf dem * angerufen. Leider überträgt das Telefon die Rufnummer der Zentrale (also die 0) und nicht meine interne Durchwahl.
Das Script hat, wie es soll, gleich aufgelegt und den Anruf garnicht angenommen, und dann gleich bei der Zentrale zurückgerufen :)
Die wussten damit natürlich nix anzufangen :-/

Lässt sich das irgendwie ändern, sodass der automatische Rückruf nur auf Telefonnummern erfolgt, die in der Liste eingetragen sind, und bei anderen in die "callback-withoutcallid" gesprungen wird?
Will eh nicht, dass jemand fremdes von seinem Handy anrufen kann, und sich zurückrufen lassen kann.
 

FlashIT

Neuer User
Mitglied seit
12 Jul 2005
Beiträge
90
Punkte für Reaktionen
0
Punkte
0
hatte auch noch dran gedacht bei dem withoutCallID eine passwortabfrage zu machen...
das problem ist aber noch, dass ich keinen weg fand das passwort aus der settings-file einzulesen, da der eingehende anruf ja nicht durch das shellscript gesteuert wird...
muss mal schauen ob man mit nem agiGestarteten shellscript irgendwie ne ausgabe davon einlesen kann...
oder hat jemand ne idee?


denn das gleiche problem besteht dabei bei deiner idee...
wie les ich die nummern aus der settingsfile ein, die anwählen dürfen...
hmmm...
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Nunja, das Posting von Besserso hat mich auf eine Idee gebracht... man könnte die User doch auch in eine MySQL Datenbank stecken... die Ansteuerung scheint recht einfach zu sein.
Code:
exten => 1,1,MYSQL(Connect connid localhost asterisk asterisk asterisk) 
exten => 1,2,MYSQL(Query resultid ${connid} SELECT\ email\ from\ voicemail_users\ where\ mailbox=${CALLERIDNUM}) 
exten => 1,3,MYSQL(Fetch fetchid ${resultid} em) 
exten => 1,4,MYSQL(Clear ${resultid}) 
exten => 1,5,MYSQL(Disconnect ${connid})
Hätte da folgende Idee:
Wenn die Caller-ID übermittelt wird, dann schaut er in seine Datenbank. Findet er die entsprechende Nummer, dann startet er nen Rückruf, und verlangt das dort eingetragene Passwort.
Wird keine Caller-ID übermittelt, oder findet er kein Passwort zu der gemeldeten ID, dann fragt er die Datenbank nach dem User "0000" ab, und nimmt das dort eingetragene Passwort. Danach könnte er wählen, ob er auf der gesendeten Nummer zurückgerufen werden möchte, oder auf einer anderen...

Hatte auch schon überlegt, die Übermittlung mit DISA zu machen... hmm, mal schauen... aber traue es mir eigentlich zu, das so irgendwie hinzubekommen.
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Habe heute Morgen noch etwas daran getüftelt, und mir ein Konzept zusammengestellt, wie ich es demnächst probieren möchte umzusetzen.

Siehe Anhang :)

EDIT: Uff, ganz schön groß... ich dachte er würde es nicht gleich anzeigen. Sorry!
 

Anhänge

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Für diejenigen, die MySQL umgehen möchten, hätte ich zumindest noch den Tipp die Asterisk interne Datenbank für die Authentifizierung zu nehmen...
Also die Benutzer via database put auth_user 123456 1234 hinzufügen, und dann in etwa so überprüfen wie in diesem Beispiel hier:
Code:
;password system

exten => 567,1,Answer ; Answer the line
exten => 567,2,Background,Welcome-to-test
exten => 567,3,DBget(passkey=auth_user/${CALLERIDNUM})
exten => 567,4,Authenticate(${passkey}|a)
exten => 567,5,SetAccount(${passkey})
exten => 567,6,WaitMusicOnHold(60)
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
UPDATE: Habe das Ganze nun so umgesetzt, wie ich es in dem oberen Gif dargestellt habe.
Da sich die MYSQL-Addons leider nicht installieren ließen, habe ich auf die Asterisk-Interne DB zugegriffen.
Dort liegen nun zwei DBs, die zum einen die erlaubten Nummern (und ggf. deren Hinterlegte Rückrufnummern), und zum anderen die Benutzer mit deren Passwort beinhalten.
Zudem habe ich das AGI-Script durch ein paar System-Calls ersetzt - habe die Parameterübergabe irgendwie nicht hinbekommen.

Wenn Interesse besteht, kann ich es gerne hier posten, bzw. einen neuen Thread dazu eröffnen.
 

mime71

Neuer User
Mitglied seit
18 Mai 2005
Beiträge
21
Punkte für Reaktionen
0
Punkte
0
Hallo,
also ich habe die hier beschriebene Callback Lösung mal ausprobiert.
Leider bekomme ich von * keinen Rückruf. Auf der Konsole sehe ich den incoming Call -->* springt in die richtige Extension-->dann sagt er dass er
das Callback AGI ohne Fehler ausgeführt hat und macht einen Hangup.
Soweit so gut, aber danach passiert einfach gar nichts mehr.
Hat jemand eine Idee wo man da ansetzen muss??

Danke Mime71
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Es könnte womöglich an den Modulen liegen... macht er denn einen Callback, wenn du von Hand ein Callfile nach /var/spool/asterisk/outgoing schiebst? Ist der Pfad vielleicht anders?
Wenn er hier auch nichts macht, dann musst du noch das Entsprechende Modul in der modules.conf laden. Glaube es war war mit spool oder queue.
Was sagt deine /var/log/asterisk/full ? Und gibt es einen Eintrag in der /var/log/asterisk/queue_log ?
 

mime71

Neuer User
Mitglied seit
18 Mai 2005
Beiträge
21
Punkte für Reaktionen
0
Punkte
0
Hallo aha,
wenn ich manuell ein Callfile ins Outgoing schiebe, bekomme ich sofort
einen Anruf.
/var/log/asterisk/full existiert bei mir nicht??Ich hab an der Stelle nur drei
Logfiles:"event_log","messages" und queue"
Im Queue-Log stehen zwar einige Einträge drin, aber an der fortlaufenden Numerierung (erste lange zahl??) ändert sich nichts wenn ich einen Callback auslöse. Also vermute ich dass irgendwas bei der Erstellung des Callfiles klemmt - oder?
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
So siehts aus, ja... ich vermute den Fehler in dem AGI-Script...
Kannst du denn mal am Anfang von dem script ein
echo hallo > /tmp/test.txt
einfügen, und schauen, ob die Datei erstellt wird?
Verfügt die Datei über die entsprechenden Ausführungsrechte? (chmod +x filename)
Existiert die Bash bei dir unter /bin/bash?
Liegt das Script in /var/lib/asterisk/agi-bin/?
Und ist dieser Pfad auch nicht "noexec" gemounted?

Ggf. könntest du statt dem Call des AGI-Scriptes auch das Callfile via "System" erzeugen, und in den Ordner schicken.
Also am besten einen einmaligen Dateinamen via
Set(Filename="/var/spool/asterisk/tmp/${TIMESTAMP}")
in die Variable "Filename" ablegen, und dann einzeln via
System(echo "......" > ${Filename})
in diese Datei hineinschreiben. Am Ende musst du sie nur noch entsprechend mit
System(mv ${Filename} /var/spool/asterisk/outgoing)
platzieren.
 

mime71

Neuer User
Mitglied seit
18 Mai 2005
Beiträge
21
Punkte für Reaktionen
0
Punkte
0
Hallo aha,
das mit dem echo hallo im AGI klappt, also er erzeugt mir die Datei.
Wenn er demnach kein Problem mit der Ausführung des Script's hat, kann es ja nur noch irgendein Systaxfehler im Script selber sein, welcher ihn an der Erzeugung des Callfiles hindert - oder? Aber dann wundert's mich
dass er nach der Abarbeitung des Scriptes einen Returncode 0 liefert!??

Die andere Lösung über SET(Filename... bezieht sich aber dann auf die extensions.conf, sodass ich das AGI gar nicht mehr brauch - oder hab ich das falsch verstanden??

Danke Mime71
 

aha

Neuer User
Mitglied seit
25 Aug 2005
Beiträge
52
Punkte für Reaktionen
0
Punkte
0
Das hast du richtig verstanden. Ich habe bei mir das Callback komplett ohne AGI-Script realisiert, und die paar Zeilen via System in das Callfile geschrieben.

Wenn dein AGI-Script läuft, dann muss es wohl wirklich etwas innerhalb deines Scriptes sein, was die Erzeugung des Callfiles verhindert.
Was mich dann nur wundert ist, dass bei dir auch "/var/log/asterisk/full" fehlt. Denn jenes wird ebenfalls von dem AGI erzeugt.
Verstehe ich irgendwie nicht. Du hast jenes Script von hier oben via Copy&Paste übernommen?
Gab da doch auch ne Möglichkeit diese AGI-Scripte zu debuggen... *grübel* Könnte man vielleicht hier über die Suche finden.
 

mime71

Neuer User
Mitglied seit
18 Mai 2005
Beiträge
21
Punkte für Reaktionen
0
Punkte
0
Ja ich hab das AGI hier aus dem Forum genommen.
Nun weiss ich aber nicht recht ob diese Hochkommas dort wirklich reingehören. Also zB callerid=`echo ${name[1]}|sed 's/+//g'`
Zumal da einmal die sogenannten "Apostrophe" als auch das einfache
Hochkomma verwendet wird!??
Im Cli hab ich dann einen "agi debug" gemacht.Das sieht dann so aus:

Code:
AGI Debugging Enabled
    -- Executing GotoIf("SIP/118XXXX-7c26", "0?callback-withoutcallid|s|1:callback-withcallid|s|1") in new stack
    -- Goto (callback-withcallid,s,1)
    -- Executing AGI("SIP/118XXXX-7c26", "callback.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/callback.agi
AGI Tx >> agi_request: callback.agi
AGI Tx >> agi_channel: SIP/118XXXX-7c26
AGI Tx >> agi_language: de
AGI Tx >> agi_type: SIP
AGI Tx >> agi_uniqueid: asterisk-23927-1126777830.11
AGI Tx >> agi_callerid: "037XXXXXX" <037XXXXXX>
AGI Tx >> agi_dnid: 118XXXX
AGI Tx >> agi_rdnis: unknown
AGI Tx >> agi_context: callback-withcallid
AGI Tx >> agi_extension: s
AGI Tx >> agi_priority: 1
AGI Tx >> agi_enhanced: 0.0
AGI Tx >> agi_accountcode:
AGI Tx >>
    -- AGI Script callback.agi completed, returning 0
    -- Executing Hangup("SIP/118XXXX-7c26", "") in new stack
Was er hier ausgibt sind im Grossen und Ganzen die Sachen welche
eben nicht diese Syntax mit den Kommas verwenden!
 

ploieel

Aktives Mitglied
Mitglied seit
13 Mrz 2005
Beiträge
1,735
Punkte für Reaktionen
5
Punkte
38
#!/bin/bash

callbackAllow="/etc/asterisk/callback.settings"
callpath="/var/spool/asterisk/tmp/"
...
Kann der Fehler daran liegen, dass bei Dir dieser Pfad nicht existiert? Fass das so ist, kannst Du ja den Pfad im Asterisk anlegen. ;-)
 

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
231,831
Beiträge
2,015,699
Mitglieder
348,885
Neuestes Mitglied
Paul der erste