[Asterisk-Users] Polycom Reboot Script PRI errors!!
John Baker
JohnB at listbrokers.com
Sun Nov 28 23:28:40 MST 2004
Kevin wrote:
> There is a reboot script posted on the wiki to reboot Polycom
> telephones. When I execute this script, I get the following messages.
> I am concerned as this is causing issues with asterisk and the PRI.
> Does anyone have any ideas why this would be happening?
>
>
>
> asterisk console:
>
> -- Remote UNIX connection
> -- Remote UNIX connection disconnected
>
> and in the Asterisk Log:
>
> Nov 28 22:30:42 NOTICE[1099909936]: PRI got event: 6 on Primary
> D-channel of span 1
> Nov 28 22:43:08 NOTICE[1099909936]: PRI got event: 6 on Primary
> D-channel of span 1
>
>
> Script:
>
> #!/usr/bin/perl -w
>
> use Net::Ping;
> use Socket;
>
> $polycompath = '/home/XXXX/'; # Where you keep your config files
> $arp = '/sbin/arp'; # Location of arp command
> $sipserver = '192.168.XXX.XXX'; # IP of asterisk server
>
> $phone = shift;
>
> checkphone("$phone");
> touch( arp2config("$phone") );
>
> reboot_sip_phone( "$phone", "$sipserver", "Reboot" );
>
> sub checkphone { # Checks for existence of phone, makes sure
> # it's in arp table
> $activephone = shift;
>
> # Populate ARP table
> print "Checking ARP table.\n";
> $p = Net::Ping->new("icmp");
> if ( $p->ping( $activephone, 2 ) ) {
> print "$activephone is ";
> print "reachable.\n";
> }
> else { die "Polycom at ", $activephone, " is not reachable!"; }
> sleep(1);
> $p->close();
>
> }
>
> sub arp2config { # Gets mac address from arp table, converts
> # to a polycom config filename, makes sure
> # the config file exists
> $arpip = shift;
> open( ARP, "$arp -an|" ) || die "Couldn't open arp table: $!\n";
> print "checking for polycom config name...", "\n";
> while (<ARP>) {
> chomp;
> $addr = $_;
> $ip = $_;
> $addr =~ s/.*
> ([\d\w]+:[\d\w]+:[\d\w]+:[\d\w]+:[\d\w]+:[\d\w]+).*/$1/;
> $addr =~ s/://g;
> $addr = lc($addr) . '.cfg';
> $ip =~ s/.*?(\d+\.\d+\.\d+\.\d+).*/$1/;
> if ( $ip eq $arpip ) {
> last;
> }
> }
>
> $polycomconfig = "$polycompath" . "$addr";
>
> unless ( -e "$polycomconfig" ) {
> print "sorry, polycom config file ", "$polycomconfig",
> " is not found.\n\n";
> exit;
> }
>
> return $polycomconfig;
> }
>
> sub touch { # We need to touch the config files or the phone
> # won't reboot - it depends on time synchronization
>
> print "touching config file ", $polycomconfig, "\n";
> my $now = time;
> local (*TMP);
> foreach my $file (@_) {
> utime( $now, $now, $file )
> || open( TMP, ">>$file" )
> || die ("$0: Couldn't touch file: $!\n");
> }
> }
>
> sub reboot_sip_phone { # Send the phone a check-sync to reboot it
> $phone_ip = shift;
>
> $local_ip = shift;
> $sip_to = shift;
> $sip_from = "0";
> $tm = time();
> $call_id = $tm . "msgto$sip_to";
> $httptime = `date -R`;
> $MESG = "NOTIFY sip:$sip_to\@$phone_ip:5060 SIP/2.0
> Via: SIP/2.0/UDP $local_ip
> From: <sip:$sip_from\@$local_ip>
> To: <sip:$sip_to\@$phone_ip>
> Event: check-sync
> Date: $httptime
> Call-ID: $call_id\@$local_ip
> CSeq: 1300 NOTIFY
> Contact: <sip:$sip_from\@$local_ip>
> Content-Length: 0
>
> ";
>
> $proto = getprotobyname('udp');
> socket( SOCKET, PF_INET, SOCK_DGRAM, $proto );
> $iaddr = inet_aton("$phone_ip");
> $paddr = sockaddr_in( 5060, $iaddr );
> bind( SOCKET, $paddr );
> $port = 5060;
>
> $hisiaddr = inet_aton($phone_ip);
> $hispaddr = sockaddr_in( $port, $hisiaddr );
>
> if ( send( SOCKET, $MESG, 0, $hispaddr ) ) {
> print "reboot of phone ", "$phone_ip", " was successful", "\n";
> }
> else { print "reboot of phone ", "$phone_ip", " failed", "\n"; }
>
> }
> exit;
>
> _______________________________________________
> Asterisk-Users mailing list
> Asterisk-Users at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-users
> To UNSUBSCRIBE or update options visit:
> http://lists.digium.com/mailman/listinfo/asterisk-users
>
>
Kevin -
I rewrote this some time ago because of some issues with Polycom's
latest bootroom/sip update. Try this:
Also, serctl, part of the ser package, has a cisco_restart parameter
that works on Polycoms as well.
John
#!/usr/bin/perl -w
use Net::Ping;
use Socket;
$polycompath = '/home/PlcmSpIp/'; # Where you keep your polycom files
$arp = '/sbin/arp'; # Location of arp command
$sipserver = '192.168.XXX.XXX'; # IP of asterisk server
$phone = shift;
checkphone("$phone");
touch( arp2config("$phone") );
reboot_sip_phone( "$phone", "$sipserver", get_extension($phone) );
sub checkphone { # Checks for existence of phone,
makes sure
# it's in arp table
$activephone = shift;
# Populate ARP table
print "Checking ARP table.\n";
$p = Net::Ping->new("icmp");
if ( $p->ping( $activephone, 2 ) ) {
print "$activephone is ";
print "reachable.\n";
}
else { die "Polycom at ", $activephone, " is not reachable!"; }
sleep(1);
$p->close();
}
sub arp2config { # Gets mac address from arp table, converts
# to a polycom config filename, makes sure
# the config file exists
$arpip = shift;
open( ARP, "$arp -an|" ) || die "Couldn't open arp table: $!\n";
print "checking for polycom config name...", "\n";
while (<ARP>) {
chomp;
$addr = $_;
$ip = $_;
$addr =~ s/.*
([\d\w]+:[\d\w]+:[\d\w]+:[\d\w]+:[\d\w]+:[\d\w]+).*/$1/;
$addr =~ s/://g;
$addr = lc($addr) . '.cfg';
$ip =~ s/.*?(\d+\.\d+\.\d+\.\d+).*/$1/;
if ( $ip eq $arpip ) {
last;
}
}
$polycomconfig = "$polycompath" . "$addr";
unless ( -e "$polycomconfig" ) {
print "sorry, polycom config file ", "$polycomconfig",
" is not found.\n\n";
exit;
}
return $polycomconfig;
}
sub get_extension { # This returns the extension of the Sip
# phone IP address
my @sippeers = `asterisk -rx \'sip show peers\'`;
foreach $testline (@sippeers) {
if ( $testline =~ m{\s+(.*?)\/.*$_[0].*}i ) {
$extension = $1;
last;
}
}
return $extension;
}
sub touch { # We need to touch the config files or the phone
# won't reboot - it depends on time synchronization
print "touching config file ", $polycomconfig, "\n";
my $now = time;
local (*TMP);
foreach my $file (@_) {
utime( $now, $now, $file )
|| open( TMP, ">>$file" )
|| die ("$0: Couldn't touch file: $!\n");
}
}
sub reboot_sip_phone { # Send the phone a check-sync to reboot it
$phone_ip = shift;
$local_ip = shift;
$sip_to = shift;
$sip_from = "asterisk";
$tm = time();
$call_id = $tm . "msgto$sip_to";
$httptime = `date -R`;
$MESG = "NOTIFY sip:$sip_to\@$phone_ip:5060 SIP/2.0
Via: SIP/2.0/UDP $local_ip
From: <sip:$sip_from\@$local_ip>
To: <sip:$sip_to\@$phone_ip>
Event: check-sync
Date: $httptime
Call-ID: $call_id\@$local_ip
CSeq: 1300 NOTIFY
Contact: <sip:$sip_from\@$local_ip>
Content-Length: 0
";
$proto = getprotobyname('udp');
socket( SOCKET, PF_INET, SOCK_DGRAM, $proto );
$iaddr = inet_aton("$phone_ip");
$paddr = sockaddr_in( 5060, $iaddr );
bind( SOCKET, $paddr );
$port = 5060;
$hisiaddr = inet_aton($phone_ip);
$hispaddr = sockaddr_in( $port, $hisiaddr );
if ( send( SOCKET, $MESG, 0, $hispaddr ) ) {
print "reboot of phone ", "$phone_ip", " was successful", "\n";
}
else { print "reboot of phone ", "$phone_ip", " failed", "\n"; }
}
exit;
More information about the asterisk-users
mailing list