skeleton for wake on lan
authorDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 26 Aug 2009 10:21:44 +0000 (10:21 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 26 Aug 2009 10:21:44 +0000 (10:21 +0000)
lib/PXElator/t/wol.t [new file with mode: 0755]
lib/PXElator/wol.pm [new file with mode: 0644]

diff --git a/lib/PXElator/t/wol.t b/lib/PXElator/t/wol.t
new file mode 100755 (executable)
index 0000000..6f1456d
--- /dev/null
@@ -0,0 +1,11 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use autodie;
+
+use Test::More tests => 2;
+
+use_ok 'wol';
+
+ok( wol::power_on( 'aa:bb:cc:dd:ee:ff' ), 'power_on' );
diff --git a/lib/PXElator/wol.pm b/lib/PXElator/wol.pm
new file mode 100644 (file)
index 0000000..0e7bcdd
--- /dev/null
@@ -0,0 +1,27 @@
+package wol;
+
+use warnings;
+use strict;
+
+use IO::Socket::INET;
+
+sub power_on {
+       my ($mac,$host,$port) = @_;
+
+       $mac  ||= 'FF:FF:FF:FF:FF:FF';
+       $host ||= '255.255.255.255';
+       $port ||= 9;    # discard
+
+       my $sock = IO::Socket::INET->new( Proto=>'udp' );
+       my $ip_addr = inet_aton($host);
+       my $sock_addr = sockaddr_in($port, $ip_addr);
+       $mac =~ s{:}{}g;
+
+       my $packet = pack('C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac x 16);
+
+       setsockopt($sock, SOL_SOCKET, SO_BROADCAST, 1);
+       send($sock, $packet, 0, $sock_addr);
+       close ($sock);
+}
+
+1;