summaryrefslogtreecommitdiffstats
path: root/contrib/wakeonlan/wakeup.pl
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/wakeonlan/wakeup.pl')
-rw-r--r--contrib/wakeonlan/wakeup.pl86
1 files changed, 86 insertions, 0 deletions
diff --git a/contrib/wakeonlan/wakeup.pl b/contrib/wakeonlan/wakeup.pl
new file mode 100644
index 00000000..83cf363a
--- /dev/null
+++ b/contrib/wakeonlan/wakeup.pl
@@ -0,0 +1,86 @@
+#!/usr/bin/perl
+#!/usr/bin/perl -w
+#
+# If called as wakeup.pl -f file it reads lines of the form
+#
+# aa:bb:cc:dd:ee;ff 12.34.56.78 or
+# aa:bb:cc:dd:ee:ff foo.bar.com
+# aa:bb:cc:dd:ee:ff
+#
+# which are MAC addresses and hostnames of NICs to send a wakeup packet.
+# Broadcast is used to send the magic packets, so anybody can run the command.
+# Notice that many routers do NOT forward broadcasts automatically!!
+# Comments in the file start with #.
+#
+# Or MAC addresses can be specified on the command line
+#
+# wakeup.pl aa.bb.cc.dd.ee.ff
+#
+# Or both can be used:
+#
+# wakeup.pl -f addresses.cfg 11:22:33:44:55:66
+#
+# Use option -b to specify broadcast mask.
+# Use option -d for screen output.
+#
+# Perl version by ken.yap@acm.org after DOS/Windows C version posted by
+# Steve_Marfisi@3com.com on the Netboot mailing list
+# Released under GNU Public License, 2000-01-08
+# Modified for use with NetWare by gk@gknw.de, 2000-09-18
+# With NetWare you have to use Socket.NLP from NetWare Perl #334 or higher!
+# You could download Socket.NLP #334 from: http://www.gknw.de/mpform.html
+#
+
+use Getopt::Std;
+use Socket;
+
+getopts('b:df:p:q');
+
+$brc = $opt_b || '255.255.255.255';
+$port = $opt_p || 60000;
+die "Malformed broadcast address: $brc!\n" if ($brc !~ /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)/);
+
+if (defined($opt_f)) {
+ unless (open(F, $opt_f)) {
+ print "open: $opt_f: $!\n";
+ } else {
+ print "Using file $opt_f...\n" if ($opt_d);
+ while (<F>) {
+ next if /^\s*#/; # skip comments
+ my ($mac, $ip) = split;
+ next if !defined($mac) or $mac eq '';
+ &send_broadcast_packet($mac,$ip);
+ }
+ close(F);
+ }
+}
+while (@ARGV) {
+ send_broadcast_packet(shift(@ARGV));
+}
+
+sub send_broadcast_packet {
+ my ($mac,$ip) = @_;
+ if ($mac =~ /-/) {
+ ($bc,$mac) = split(/-/,$mac);
+ } else {
+ $bc = $brc;
+ }
+ if ($mac !~ /^[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}$/i) {
+ print "Malformed MAC address $mac\n";
+ return;
+ }
+ my $nbc = inet_aton($bc);
+ # Remove colons
+ $mac =~ tr/://d;
+ # Magic packet is 6 bytes of FF followed by the MAC address 16 times
+ $magic = ("\xff" x 6) . (pack('H12', $mac) x 16);
+ # Create socket
+ socket(S, PF_INET, SOCK_DGRAM, getprotobyname('udp')) or die "socket: $!\n";
+ # Enable broadcast
+ setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt: $!\n";
+ # Send the wakeup packet
+ printf("$0: Sending wakeup packet to %04X:%08X-%s %s\n",$port,unpack('N',$nbc),uc($mac),$ip) if ($opt_d);
+ defined(send(S, $magic, 0, sockaddr_in($port, $nbc)))
+ or print "send: $!\n";
+ close(S);
+}