[asterisk-users] AGI perl script set timeout within script?

JR Richardson jmr.richardson at gmail.com
Thu Jan 7 21:17:52 CST 2010


> >> On Thu, Jan 7, 2010 at 6:27 PM, JR Richardson
> <jmr.richardson at gmail.com>
> > wrote:
> >>> problem I'm running into is if the DNS server is not responding, the
> >>> script hangs and waits for 30 seconds before returning to the Asterisk
> >>> dialplan. ?I would like a timeout of 1 second, then return.
> >>
> > On Thursday 07 January 2010 18:59:24 David Backeberg wrote:
> >>
> >> * stop using DNS? Problem solved. * put nagios monitoring on your DNS
> >> server? * put in a second DNS server, and tune your DNS timeout to a
> >> very low value in /etc/resolv.conf (read the man page) before jumping
> >> to next server?
> >>
> >> Or you could use the Perl language feature, which is called 'alarm'.
> >> Google around for some code samples.
> 
> On Thu, 7 Jan 2010, Tilghman Lesher wrote:
> 
> > Ah, but Perl isn't actually doing the DNS lookup.  If you examine his
> > script, he's merely passing back a name to the Asterisk process, which
> > is then calling inet_aton(), which is the reason why he cannot control
> > it from within the script.  What he'd actually need to do is to start
> > using Net::DNS to do the resolution on that name, first, perhaps even
> > going as far as to connect to the server himself, and relay the channel
> > between the AGI interface and the remote TCP interface.
> >
> > Then, he could use alarm() or the Time::Hires module to ensure his own
> > timeouts override the builtins.  But as it stands now, it's all
> > Asterisk.
> 
> If the DNS lookup is being done by Asterisk to resolve the FastAGI server
> name. If the DNS lookup is for the (assumed) database server in his script
> then the suggestions to use alarm() would do the trick.
> 
> I guess we need clarification from the OP.

I tend to agree with Tilghman on this. I tried the perl script eval, alarm,
$SIG{ALRM} functions till I was blue in the face from cussing at the screen.
It does not appear that the perl script is doing the DNS query, otherwise
the eval alarm would timeout and pass control back to asterisk.  Another
indication is that '#define MAX_AGI_CONNECT 2000' in res_agi is not being
invoked because the timeout is around 30 seconds.  Is that 30 second timeout
built into Asterisk?  Can I put an absolute timeout on an agi script from
the dialplan prior to calling the agi application?  Maybe I'll fork a macro
with a timeout, yea, that's it, let start forking, something new to cuss at.

Thanks for your input guys.

JR




More information about the asterisk-users mailing list