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

Callback Reloaded

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von FlashIT, 30 Aug. 2005.

  1. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    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:


    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:123456@sip.1und1.de/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
     
  2. RobertHerter

    RobertHerter Neuer User

    Registriert seit:
    17 Dez. 2004
    Beiträge:
    151
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Beruf:
    Softwareentwickler
    Ort:
    Kolbermoor, Bayern
    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
     
  3. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    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)
     
  4. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    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...
     
  5. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Obwohl...
    Eigentlich ists erstmal egal, jeder der Callback darf, sollte auch wissen was er anrufen darf ;-)
     
  6. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Posting 1 hab ich mal überarbeitet und das Script etc. nun damit vorzustellen!

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

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  8. FlashIT

    FlashIT Neuer User

    Registriert seit:
    12 Juli 2005
    Beiträge:
    90
    Zustimmungen:
    0
    Punkte für Erfolge:
    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...
     
  9. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  10. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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:

  11. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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)
    
     
  12. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  13. mime71

    mime71 Neuer User

    Registriert seit:
    18 Mai 2005
    Beiträge:
    21
    Zustimmungen:
    0
    Punkte für Erfolge:
    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
     
  14. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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 ?
     
  15. mime71

    mime71 Neuer User

    Registriert seit:
    18 Mai 2005
    Beiträge:
    21
    Zustimmungen:
    0
    Punkte für Erfolge:
    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?
     
  16. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  17. mime71

    mime71 Neuer User

    Registriert seit:
    18 Mai 2005
    Beiträge:
    21
    Zustimmungen:
    0
    Punkte für Erfolge:
    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
     
  18. aha

    aha Neuer User

    Registriert seit:
    25 Aug. 2005
    Beiträge:
    52
    Zustimmungen:
    0
    Punkte für Erfolge:
    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.
     
  19. mime71

    mime71 Neuer User

    Registriert seit:
    18 Mai 2005
    Beiträge:
    21
    Zustimmungen:
    0
    Punkte für Erfolge:
    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!
     
  20. ploieel

    ploieel Aktives Mitglied

    Registriert seit:
    13 März 2005
    Beiträge:
    1,728
    Zustimmungen:
    1
    Punkte für Erfolge:
    36
    Ort:
    Vogtland
    Kann der Fehler daran liegen, dass bei Dir dieser Pfad nicht existiert? Fass das so ist, kannst Du ja den Pfad im Asterisk anlegen. ;-)