--- /dev/null
+#!/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 <brian@freeswitch.org> http://www.amazon.com/gp/registry/wishlist/1BWDJUX5LYQE0
+# Raymond Chandler <intralanman@freeswitch.org> 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 <url> [-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())
+ }
+}
--- /dev/null
+#!/usr/bin/perl
+#
+# Snom PNP Daemon that can provide URL for provisioning.
+#
+# Authors: (and wish lists)
+#
+# Brian West <brian@freeswitch.org> http://www.amazon.com/gp/registry/wishlist/1BWDJUX5LYQE0
+# Raymond Chandler <intralanman@freeswitch.org> 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 <ipaddress> -u <url> [-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/<sip:(.*)>/$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' => "<sip:$local_host:$local_port>");
+ $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);
+}