Once again you prove your wisdom. I'm going to look into the AMI think, but this is a good working solution. My original code was copied from an early daemon I wrote in PERL, thus the bad problems.
-----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Steve Edwards Sent: Friday, June 05, 2009 6:09 PM To: Asterisk Users Mailing List - Non-Commercial Discussion Subject: Re: [asterisk-users] broken pipe in perl agi On Fri, 5 Jun 2009, Danny Nicholas wrote: > You're on the right track, Steve but that didn't do it either. Here is > the Perl snippet: > use strict; > use warnings; > my $towatch = $ARGV[0]; > my $a=0; > my $retval=undef; > # show hints will get hint information from the dialplan > while ($a<1) { > my $cmda = '/usr/sbin/asterisk -rx "core show hints"|'; > #### Get Trunk Information #### > my %lines; > my $lineseq=0; > $SIG{'PIPE'} = 'IGNORE'; > open (my $trunk_info,$cmda) or print STDOUT "Broken pipe\n"; > if ($trunk_info) { > while (<$trunk_info>) { > if ($_ =~ /internal/) { > if ($_ =~ /$towatch/) { > $lines{$lineseq} = $_; > $lineseq++; > } > } > } > close $trunk_info; > } > sleep 2; > > for (my $i=0;$i<=$lineseq;$i++) { > if ($lines{$i}) { > my $c = unpack("x74 a16", $lines{$i}); > $c =~ s/\s//gx; > $retval=1; > print STDOUT "SET VARIABLE LINESTAT \"$c\" \r\n"; > <STDIN>; > } > } > $a++; > } > # if /var/run/asterisk.ctl is not mod 777, no result so we return a dummy > Idle > if (! $retval) { > my $c = "Idle"; > print STDOUT "SET VARIABLE LINESTAT \"$c\" \r\n"; > <STDIN>; > } > exit; > > If there is an active call on the extension, it works. If not, the > "broken pipe" message is returned. I'm still thinking its a protocol issue. I couldn't replicate the error on my 1.2 box. I don't use hints, so I read "hint data" from a file. I noticed: 0) You don't use an AGI library 1) You don't turn off I/O buffering 2) You aren't reading the AGI environment 3) You have a "sleep" in between your 2 loops 4) You have a "while" loop on $a I don't think is needed 5) You could read Asterisk's output from "show hints" and process it in a single loop 6) "\r" is not needed 7) A space before the request terminator is not needed I'm not much of a Perl weenie, but I made some changes you're welcome to use or discard :) #!/usr/bin/perl use strict; use warnings; # define variables # show hints will get hint information from the dialplan my $cmda = '/usr/sbin/asterisk -rx "show hints"|'; # read hint data from a file for testing # my $cmda = 'cat /home/sedwards/hints|'; my $towatch = $ARGV[0]; # turn off I/O buffering $| = 1; # read the AGI environment while (<STDIN>) { chomp($_); last if 0 == length($_); } # assume idle print STDOUT "SET VARIABLE LINESTAT \"Idle\"\n"; <STDIN>; # get trunk information $SIG{'PIPE'} = 'IGNORE'; open (my $trunk_info, $cmda) or exit; while (<$trunk_info>) { if (($_ =~ /internal/) && ($_ =~ /$towatch/)) { my $c = unpack("x74 a16", $_); $c =~ s/\s//gx; print STDOUT "SET VARIABLE LINESTAT \"$c\"\n"; <STDIN>; } } close $trunk_info; # (end of hintcheck.agi) OT, but I think I'm liking AMI more than "rx" in the new code I'm writing. Thanks in advance, ------------------------------------------------------------------------ Steve Edwards [email protected] Voice: +1-760-468-3867 PST Newline Fax: +1-760-731-3000 _______________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- asterisk-users mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/asterisk-users _______________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- asterisk-users mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/asterisk-users
