diff --git a/scripts/perl/dhcp-inform.pl b/scripts/perl/dhcp-inform.pl new file mode 100644 index 0000000000..b3d39ece67 --- /dev/null +++ b/scripts/perl/dhcp-inform.pl @@ -0,0 +1,72 @@ +#!/usr/bin/perl +# +# Send DHCPACK when you receive a DHCPINFORM from a polycom +# so we can provide the provisioning URL to the phone +# +# Authors: (and wish lists) +# +# Brian West http://www.amazon.com/gp/registry/wishlist/1BWDJUX5LYQE0 +# Raymond Chandler http://www.amazon.com/gp/registry/wishlist/1BWDJUX5LYQE0 +# +# + +use IO::Socket::INET; +use Net::DHCP::Packet; +use Net::DHCP::Constants; +use Getopt::Std; + +getopt("du"); + +$| = 1; + +if (!$opt_u) { + print "Usage: $0 -u [-d 1]\n"; + exit; +} + +$sock = IO::Socket::INET->new( + LocalPort => '67', + Proto => 'udp', + Broadcast => 1, + ReuseAddr => 1, + ) or die "socket: $@"; + +while ($sock->recv($newmsg, 1024)) { + my $dhcpreq = Net::DHCP::Packet->new($newmsg); + if ($opt_d) { + print $dhcpreq->toString(); + print "\n---------------------------------------------------------------------\n"; + } + $tmp = $dhcpreq->chaddr(); + + print "--$tmp--\n"; + + if ($dhcpreq->getOptionValue(DHO_DHCP_MESSAGE_TYPE()) == 8 && $dhcpreq->chaddr() =~ /^0004f2/) { + my $dhcpresp = new Net::DHCP::Packet( + Op => BOOTREPLY(), + Hops => $dhcpreq->hops(), + Xid => $dhcpreq->xid(), + Htype => $dhcpreq->htype(), + Ciaddr => $dhcpreq->ciaddr(), + Chaddr => $dhcpreq->chaddr(), + DHO_DHCP_MESSAGE_TYPE() => DHCPACK(), + DHO_DHCP_SERVER_IDENTIFIER() => $sock->sockhost, + DHO_TFTP_SERVER() => "$opt_u", + ); + + + if ($opt_d) { + print $dhcpresp->toString(); + print "\n---------------------------------------------------------------------\n"; + } + print "Sending option 66 as $opt_u\n"; + + $handle = IO::Socket::INET->new(Proto => 'udp', + PeerPort => '68', + LocalPort => '67', + ReuseAddr => 1, + PeerAddr => $dhcpreq->ciaddr(), + ) or die "socket: $@"; + $handle->send($dhcpresp->serialize()) + } +} diff --git a/scripts/perl/snom-pnpd.pl b/scripts/perl/snom-pnpd.pl new file mode 100755 index 0000000000..821e1f713e --- /dev/null +++ b/scripts/perl/snom-pnpd.pl @@ -0,0 +1,90 @@ +#!/usr/bin/perl +# +# Snom PNP Daemon that can provide URL for provisioning. +# +# Authors: (and wish lists) +# +# Brian West http://www.amazon.com/gp/registry/wishlist/1BWDJUX5LYQE0 +# Raymond Chandler http://www.amazon.com/gp/registry/wishlist/1BWDJUX5LYQE0 +# +# + +use Data::Dumper; +use Net::SIP; +use IO::Socket::Multicast; +use Getopt::Std; + +my $count = 0; + +getopt("dui"); + +$| = 1; + +if (!$opt_u && !$opt_i) { + print "Usage: $0 -i -u [-d 1]\n"; + exit; +} + +my $local_addr = $opt_i; +my $local_port = '8160'; + + +sub reply($;) { + my ($body) = shift; + + if($opt_d) { + print Dumper $body; + } + + if($body =~ m/^SUBSCRIBE/i) { + my $pkt = Net::SIP::Request->new( $body ); + + my $resp = $pkt->create_response(200, "OK"); + my $contact = $pkt->get_header('contact'); + $contact =~ s//$1/i; + my $leg = Net::SIP::Leg->new( + addr => $local_addr, + port => $local_port, + ); + $leg->deliver( $resp, "$contact" ); + + my $hash = {}; + + + my @version = split(";", $pkt->get_header('event')); + foreach my $blah (@version) { + if($blah =~ /=/) { + my($var,$val) = split(/=/,$blah); + $val =~ s/\"//g; + $hash->{$var} = $val; + } + } + + my $prov_url = "$opt_u/{mac}.xml"; + print "Sending pnp provisioning URL as $opt_u/{mac}.xml\n"; + + $notify = Net::SIP::Request->new('NOTIFY', $contact, {}); + $notify->set_header('From' => $pkt->get_header('to')); + $notify->set_header('To' => $pkt->get_header('to')); + $notify->set_header('User-Agent' => 'test'); + $notify->set_header('Event' => $pkt->get_header('event')); + $notify->set_header('Contact' => ""); + $notify->set_header('Call-ID' => rand()); + $notify->set_header('CSeq' => '1 NOTIFY'); + $notify->set_body("$prov_url"); + $leg->deliver($notify, $contact); + } +} + +my $socket = IO::Socket::Multicast->new( + LocalPort => '5060', + LocalAddr => '224.0.1.75', + Proto => 'udp', + ReuseAddr => 1 + ); + +$socket->mcast_add('224.0.1.75'); + +while($socket->recv($data,8192)) { + &reply($data); +}