Asterisk und AGI mit Bash - Variable übergeben

chris-toph

Neuer User
Mitglied seit
11 Dez 2008
Beiträge
55
Punkte für Reaktionen
0
Punkte
0
Hallo Freunde,

ich versuche gerade ein kleines AGI Script auf Bash zu schreiben, damit bei eingehenden Anrufen in meiner SQL Datenbank der Name aufgelöst werden kann.

Das Script funktioniert bereits, wenn ich es auf der Shell ausführe, ich frage mich jedoch, wie ich es schaffen kann, dass ich aus dem AGI, BASH Script die Variable dem Asterisk übergeben kann.

Mein Script:
Code:
#/bin/bash -x
IP_ADDR=localhost
TABLE_NAME=kurzwahl
USER_NAME=XXX
IP_ADDR=localhost
PASSWORD=XXX

SQL=`echo "SELECT name from telephone_nr where durchwahl=$1" | mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $TABLE_NAME `
CIDNAME=`echo $SQL | cut -d " " -f2-3`

echo "SET VARIABLE NAME \"$CIDNAME\"\n"

exit 0;

Wenn ich im Asterisk ein Noop auf $NAME durchführe, ist es leer. Wenn ich es per Shell mit der Rufnummer starte, ist die Variable gefüllt.

Hat jemand eine Ahnung, wie ich aus dem Bash Script die Variable dem Asterisk übergeben kann ?

Danke!
 
echo "SET VARIABLE NAME \"$CIDNAME\"\n"

dieses Kommando ist falsch. Wenn du den stdout deines Scriptes dumpst muss es zum Setzen der Variable 'CALLERID(name)' beispielsweise so aussehen:

Code:
exec Set CALLERID(name)="testname"

dein Script muss also irgendwann mal etwas wie
Code:
echo 'exec Set CALLERID(name)="testname"'
ausfuehren.

- sparkie
 
Hallo,

vielen Dank für Deine schnelle Antwort. Irgendwie scheint aber auch das nicht zu funktionieren. Selbst wenn ich die CallerId(name) auf den festen wert "Testname" lasse, es wird nicht angezeigt. Auch die Variable ist leer.

An was könnte das liegen ?

Danke!
 
An was könnte das liegen ?

hast du mal Asterisk mit debug laufen lassen? Dann muss dort sowas wie:
Code:
[Jul 23 10:12:03]     -- AGI Script Executing Application: (Set) Options: (CALLERID(name)=testname)

erscheinen, wenn dein Script eine entsprechende Anweisung auf stdout ausgibt.

- sparkie
 
Mmm, der macht irgendwie garnichts:

Code:
AGI Tx >> agi_request: lookup.sh
AGI Tx >> agi_channel: mISDN/2-1
AGI Tx >> agi_language: de
AGI Tx >> agi_type: mISDN
AGI Tx >> agi_uniqueid: 1279873741.62772
AGI Tx >> agi_callerid: XXXXXX
AGI Tx >> agi_calleridname: unknown
AGI Tx >> agi_callingpres: 0
AGI Tx >> agi_callingani2: 0
AGI Tx >> agi_callington: 0
AGI Tx >> agi_callingtns: 0
AGI Tx >> agi_dnid: unknown
AGI Tx >> agi_rdnis: unknown
AGI Tx >> agi_context: incoming
AGI Tx >> agi_extension: XXXXX
AGI Tx >> agi_priority: 1
AGI Tx >> agi_enhanced: 0.0
AGI Tx >> agi_accountcode:

Du sagst, dass mein script auf stdin muss, mein script sieht nun wie folgt aus:

Code:
#/bin/bash -x
IP_ADDR=localhost
TABLE_NAME=kurzwahl
USER_NAME=XXX
IP_ADDR=localhost
PASSWORD=XXX

SQL=`echo "SELECT name from telephone_nr where durchwahl=$1" | mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $TABLE_NAME `
TCIDNAME=`echo $SQL | cut -d " " -f2-3`

echo 'exec Set CALLERID(NAME)="$TCIDNAME"'

exit 0;

...muss da noch was geaendert werden ? - ich bin verwirrt. :)
 
Mmm, der macht irgendwie garnichts:

starte ihn z.B. so:
Code:
asterisk -vvvvvvvvvncT

die Shell im Debug Mode 'bash -x' zu starten ist uebrigens sehr schlecht, da der Debug-Output evtl. zu Fehlinterpret. im Asterisk fuehren kann..

- sparkie
 
Mm..ne - ich seh im Debug garnichts..das bash -x hab ich entfernt.. :)

EDIT: Ohje - ich habe bei meinem Script das "!" vergessen. Also im "#!/bin/bash". Das war das Problem. Nun funktioniert es - vielen dank für alles!
 
Zuletzt bearbeitet:
Mmm,

das Script läuft zwar perfekt - jedoch hab ich irgendwie, weshalb auch immer ein "Broken Pipe" in meinem Debug. An was könnte das denn liegen ?

Code:
[Jul 26 14:59:54] VERBOSE[11385] logger.c:     -- Launched AGI Script /var/lib/asterisk/agi-bin/lookup.agi
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_request: lookup.agi
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_channel: DAHDI/12-1
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_language: en
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_type: DAHDI
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_uniqueid: 1280149194.789690
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_callerid: XXX 
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_calleridname: unknown
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_callingpres: 1
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_callingani2: 0
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_callington: 33
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_callingtns: 0 
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_dnid: XXX  
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_rdnis: unknown
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_context: s2m
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_extension: XXXX
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_priority: 2  
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_enhanced: 0.0
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> agi_accountcode:
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> 
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Rx << exec Set lookupcid="8002"
[Jul 26 14:59:54] VERBOSE[11385] logger.c:     -- AGI Script Executing Application: (Set) Options: (lookupcid=8002)
[Jul 26 14:59:54] VERBOSE[11385] logger.c: AGI Tx >> 200 result=0
[Jul 26 14:59:54] ERROR[11385] utils.c: write() returned error: Broken pipe
[Jul 26 14:59:54] VERBOSE[11385] logger.c:     -- AGI Script lookup.agi completed, returning 0

Mein Script:

Code:
#!/bin/bash
TELNR=$1
IP_ADDR=localhost
TABLE_NAME=kurzwahl
USER_NAME=XXX
IP_ADDR=localhost
PASSWORD=ZZZZ

SQL=`echo "SELECT kurzwahl from telephon_nr where durchwahl=$TELNR" | mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $TABLE_NAME `
TCIDNAME=`echo $SQL | cut -d " " -f2-3`
if [ "$TCIDNAME" > "1" ]; then
echo "exec Set lookupcid=FIL:\"$TCIDNAME"\"

else
exit 0;

fi

exit 0;

Vielen Dank im Voraus!
 
Mmm,

das Script läuft zwar perfekt - jedoch hab ich irgendwie, weshalb auch immer ein "Broken Pipe" in meinem Debug. An was könnte das denn liegen ?

weil das Script seinen Input von Asterisk auf stdin nicht 'wegliest'.

- sparkie
 
hey,

vielen Dank für Deine Antwort. Und wie kann ich das anpassen, dass es klappt ?

Danke!
 
vielen Dank für Deine Antwort. Und wie kann ich das anpassen, dass es klappt ?

also ich verwende fuer AGI nur awk (keine Shell) Scripten:)

wie es bei einer Shell geht kann ich nicht genau sagen. Vielleicht das
Code:
while read a;do :;done

moeglichst weit vorne im Script ausfuehren. Ohne Gewaehr. Natuerlich stehen hier nuetzliche Daten drin, die du aber offenbar nicht brauchst. Deswegen Daten einlesen und wegwerfen.

Jedes 'exec ' Kommando erzeugt auch noch etwas Input (Status) von Asterisk.
Abe vielleicht reicht es schon so wie beschrieben.

- sparkie
 
Hallo,

sollte man nicht grundsätzlich nach jedem Befehl, den man an Asterisk schickt, den stdin auslesen und auswerten? Sonst erkennt man im AGI doch nicht, wenn der Befehl aus irgendwelchen Gründen nicht richtig verarbeitet wurde.

Ich lese am Ende jedes AGIs den stdin einfach nochmal komplett aus. Damit kommt die Warnung mit der Broken Pipe bei mir kaum mehr vor. Und wenn, dann hab ich sie ehrlich gesagt immer ignoriert. Außer dass die Daten ungenutzt bleiben, kann doch eigentlich nicht passieren, oder?

Svenja
 
sollte man nicht grundsätzlich nach jedem Befehl, den man an Asterisk schickt, den stdin auslesen und auswerten?

doch, sicherlich. Ich mache das in meinen awk Scripten immer so. Aber fuer eine Minimalloesung geht's wie beschrieben evtl. noch einfacher.

Ich lese am Ende jedes AGIs den stdin einfach nochmal komplett aus. Damit kommt die Warnung mit der Broken Pipe bei mir kaum mehr vor

richtig.

Außer dass die Daten ungenutzt bleiben, kann doch eigentlich nicht passieren, oder?

ich habe auch noch keine anderen 'Nebenwirkungen' gesehen:)

- sparkie
 
Hallo,

leider scheint das mit dem

Code:
while read a;do :;done

nicht zu funktionieren. Gibt es ggf. noch andere Tipps ? ;-)

Danke!
 
So,

nach langem hin und her, hab ich es nun endlich hinbekommen:


Code:
#!/bin/bash
TELNR=$1
IP_ADDR=localhost
TABLE_NAME=kurzwahl
USER_NAME=XX
IP_ADDR=localhost
PASSWORD=XXX
stdin="0"

while [ "$stdin" != "" ]
do
read stdin
if [ "$stdin" != EOF ]
then
echo $stdin >> /dev/null
fi
done

SQL=`echo "SELECT kurzwahl from telephon_nr where durchwahl=$TELNR" | mysql -h $IP_ADDR -u $USER_NAME -p$PASSWORD $TABLE_NAME `
TCIDNAME=`echo $SQL | cut -d " " -f2-3`
if [ "$TCIDNAME" > "1" ]; then
echo "exec Set lookupcid=FIL:\"$TCIDNAME"\"

read response
echo $response >> /dev/null

else
exit 0;

fi

exit 0;

Danke an alle, die mir hier geholfen haben.
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
246,274
Beiträge
2,249,293
Mitglieder
373,863
Neuestes Mitglied
RuthBeatty
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.