[asterisk-users] Concurrent calls including mysql taking lot of time for execution

Steve Edwards asterisk.org at sedwards.com
Wed Oct 21 20:36:59 CDT 2009


>> On Wed, 21 Oct 2009, Steve Edwards wrote:
>>
>>> I'd take a look at using AGIs written in C. They make nice little 
>>> building blocks. They execute very quickly and can cleanup your 
>>> dialplan.
>>
>> And you can debug them (AGIs in any language) from the command line 
>> completely outside of Asterisk.

On Wed, 21 Oct 2009, covici at ccs.covici.com wrote:

> OK, are there include files available for the appropriate functionality? 
> Sounds like it might be very nice.

If you're referring to "debugging outside of Asterisk," it's dead obvious 
-- once you know the "secret."

The AGI protocol is just communications over STDIN and STDOUT in a 
specific format.

Thus, running outside of Asterisk just means feeding the right stuff going 
in and observing the right stuff coming out.

For example:

 	./block-ani <dummy-input-for-block-ani

where dummy-input-for-block-ani contains:

agi_accountcode:
agi_callerid: 1234567890
agi_calleridname: sedwards
agi_callingani2: 0
agi_callingpres: 0
agi_callingtns: 0
agi_callington: 0
agi_channel: SIP/201-09456478
agi_context: newline
agi_dnid: *
agi_enhanced: 0.0
agi_extension: *
agi_language: en
agi_priority: 1
agi_rdnis: unknown
agi_request: block-ani
agi_type: SIP
agi_uniqueid: 1195070681.28

200 result=1 (5555551212)
200 result=1 (localhost)
200 result=1 (example)
200 result=1 (example)
200 result=1 (example)

The first "block" is the standard AGI environment. The second block is 
specific to this AGI and supplies the answers to the AGI requests "GET 
VARIABLE ANI, "GET VARIABLE DATABASE-SERVER," "GET DATABASE-DATABASE," 
"GET DATABASE-USERNAME," and "GET DATABASE PASSWORD."

I prefer to use an executable script so I can include comments. The script 
looks like:

# agi-environment.sh

# the standard AGI environment variables
         echo "agi_accountcode: "
         echo "agi_callerid: 1234567890"
         echo "agi_calleridname: sedwards"
         echo "agi_callingani2: 0"
         echo "agi_callingpres: 0"
         echo "agi_callingtns: 0"
         echo "agi_callington: 0"
         echo "agi_channel: SIP/201-09456478"
         echo "agi_context: newline"
         echo "agi_dnid: *"
         echo "agi_enhanced: 0.0"
         echo "agi_extension: *"
         echo "agi_language: en"
         echo "agi_priority: 1"
         echo "agi_rdnis: unknown"
         echo "agi_request: block-ani"
         echo "agi_type: SIP"
         echo "agi_uniqueid: 1195070681.28"
         echo ""

# cruft specific to my AGI

# AGI Rx << GET VARIABLE "ANI"
         echo "200 result=1 (5555551212)"
# AGI Rx << GET VARIABLE "DATABASE-SERVER"
         echo "200 result=1 (localhost)"
# AGI Rx << GET VARIABLE "DATABASE-DATABASE"
         echo "200 result=1 (example)"
# AGI Rx << GET VARIABLE "DATABASE-USERNAME"
         echo "200 result=1 (example)"
# AGI Rx << GET VARIABLE "DATABASE-PASSWORD"
         echo "200 result=1 (example)"

# (end of agi-environment.sh)

And you use it like:

 	./agi-environment.sh | ./block-ani

or

 	./agi-environment.sh >dummy-input-for-block-ani
 	./block-ani <dummy-input-for-block-ani

Since I'm an "old-school" C programmer, I use emacs as my editor. I fire 
up gdb (the GNU C (amongst other languages) debugger) in a window, give it 
a command like "b main; r <dummy-input-for-block-ani" and I can step 
through my program line by line, examining and changing variables at will.

Beats the hell out of peppering your code with prints/puts/echos and 
crossing your fingers.

-- 
Thanks in advance,
-------------------------------------------------------------------------
Steve Edwards       sedwards at sedwards.com      Voice: +1-760-468-3867 PST
Newline                                              Fax: +1-760-731-3000



More information about the asterisk-users mailing list