]> git.datanom.net - pve-dhcp-server.git/commitdiff
Added test scripts for server and client
authorMichael Rasmussen <mir@datanom.net>
Tue, 22 Jul 2014 12:18:17 +0000 (14:18 +0200)
committerMichael Rasmussen <mir@datanom.net>
Tue, 22 Jul 2014 12:18:17 +0000 (14:18 +0200)
dhcp.pl [new file with mode: 0644]
dhcpd.pl [new file with mode: 0644]

diff --git a/dhcp.pl b/dhcp.pl
new file mode 100644 (file)
index 0000000..56f9502
--- /dev/null
+++ b/dhcp.pl
@@ -0,0 +1,130 @@
+#!/usr/bin/perl
+# Simple DHCP client - sending a broadcasted DHCP Discover request
+
+use strict;
+use warnings;
+use IO::Socket::IP -register;
+
+use Net::DHCP::Packet;
+use Net::DHCP::Constants;
+
+use POSIX qw(setsid strftime);
+
+my ($request, $send, $receive, $discover, $response, $buf, $serverip, $myip, $mymac);
+
+$mymac = qx/ \/sbin\/ifconfig | grep -P '^eth0.+HWaddr\\s*' | awk '{print \$5}' /;
+$mymac =~ tr/://d;
+
+# Overrule when testing
+#$mymac = '001cc0c33317';
+logger("mac: $mymac");
+
+# sample logger
+sub logger{
+    my $str = shift;
+    print STDOUT strftime "[%d/%b/%Y:%H:%M:%S] ", localtime;
+    print STDOUT "$str\n";
+}
+
+logger("DHCPd tester - dummy client");
+
+logger("Opening socket");
+$send = IO::Socket::IP->new(  Proto => 'udp',
+                                Broadcast => 1,
+                                PeerPort => 'bootps(67)',
+                                PeerAddr => inet_ntoa(INADDR_LOOPBACK),#(INADDR_BROADCAST),
+                                )
+      || die "Socket (send) creation error: $@\n";     # yes, it uses $@ here
+
+# create DHCP Packet DISCOVER
+$discover = Net::DHCP::Packet->new(
+                         Chaddr => $mymac,
+                         Giaddr => $send->sockhost(),
+              Xid => int(rand(0xFFFFFFFF)), # random xid
+              DHO_DHCP_MESSAGE_TYPE() => DHCPDISCOVER(),
+              Flags => 0x8000,
+                         DHO_VENDOR_CLASS_IDENTIFIER() => 'foo',
+              );
+
+logger("Sending DISCOVER to " . $send->peerhost . ":" . $send->peerport);
+logger($discover->toString());
+$send->send($discover->serialize(), 0)
+              or die "Error sending:$!\n";
+
+$receive = IO::Socket::IP->new(  Proto => 'udp',
+                                Broadcast => 1,
+                                LocalPort => 'bootpc(68)',
+                                #LocalAddr => inet_ntoa(INADDR_LOOPBACK),#(INADDR_ANY),
+                                )
+      || die "Socket (receive) creation error: $@\n";     # yes, it uses $@ here
+
+logger("Listen: " . $receive->sockhost . ":" . $receive->sockport);
+logger("Waiting for response from server");
+$receive->recv($buf, 1024, 0);
+logger("Got response from " . $receive->peerhost . ":" . $receive->peerport);
+$receive->close;
+$response = new Net::DHCP::Packet($buf);
+$serverip = $response->getOptionValue(DHO_DHCP_SERVER_IDENTIFIER());
+$myip = $response->yiaddr();
+
+logger($response->toString());
+
+# create DHCP Packet REQUEST
+$request = Net::DHCP::Packet->new(
+                      Xid => int(rand(0xFFFFFFFF)), # random xid
+                      Chaddr => $mymac,
+                      Giaddr => $send->sockhost(),
+                      DHO_DHCP_MESSAGE_TYPE() => DHCPREQUEST(),
+                                         DHO_VENDOR_CLASS_IDENTIFIER() => 'foo',
+                      DHO_DHCP_REQUESTED_ADDRESS() => $myip,
+                      );
+
+logger("Sending REQUEST to " . $send->peerhost . ":" . $send->peerport);
+logger($request->toString());
+
+$send->send($request->serialize())
+              or die "Error sending:$!\n";
+$send->close;
+
+$receive = IO::Socket::IP->new(  Proto => 'udp',
+                                Broadcast => 1,
+                                LocalPort => 'bootpc(68)',
+                                #LocalAddr => inet_ntoa(INADDR_LOOPBACK),#inet_ntoa(INADDR_ANY),
+                                )
+      || die "Socket creation error: $@\n";     # yes, it uses $@ here
+
+logger("Waiting for response from server");
+$receive->recv($buf, 1024, 0);
+logger("Got response from " . $receive->peerhost . ":" . $receive->peerport);
+$receive->close;
+$response = new Net::DHCP::Packet($buf);
+logger($response->toString());
+
+if ($response->getOptionValue(DHO_DHCP_MESSAGE_TYPE()) == DHCPACK()) {
+       $send = IO::Socket::IP->new(  Proto => 'udp',
+                                                                 Broadcast => 1,
+                                                                 PeerPort => 'bootps(67)',
+                                                                 PeerAddr => $serverip,
+                                                               )
+                 || die "Socket (send) creation error: $@\n";     # yes, it uses $@ here
+
+       # create DHCP Packet REQUEST
+       $request = Net::DHCP::Packet->new(
+                                                 op => BOOTREQUEST(),
+                                                 Xid => int(rand(0xFFFFFFFF)), # random xid
+                                                 Chaddr => $mymac,
+                                                 Ciaddr => $myip,
+                                                 Giaddr => $send->sockhost(),
+                                                 DHO_VENDOR_CLASS_IDENTIFIER() => 'foo',
+                                                 DHO_DHCP_MESSAGE_TYPE() => DHCPRELEASE()
+                                                 );
+
+       logger("Sending REQUEST to " . $send->peerhost . ":" . $send->peerport);
+       logger($request->toString());
+
+       $send->send($request->serialize())
+                                 or die "Error sending:$!\n";
+       $send->close;
+} else {
+       logger("Request for ip $myip was denied")
+}
diff --git a/dhcpd.pl b/dhcpd.pl
new file mode 100644 (file)
index 0000000..2afdbcd
--- /dev/null
+++ b/dhcpd.pl
@@ -0,0 +1,15 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use PVE::DHCPServer qw(:constants);
+use Data::Dumper;
+
+my $server = PVE::DHCPServer->new(
+    NODAEMON => 1,
+    DEBUG => 1,
+    LOG_LEVEL => DEBUG);
+
+#print Dumper($server);
+$server->run;
+
This page took 0.036895 seconds and 5 git commands to generate.