Here's a Perl version of the wakeup program. Let me know if it works and send me any improvements. It's GPLed.
#!/usr/bin/perl -w
#
# Reads from stdin or a file lines of the form
#
# 12.34.56.78 aa:bb:cc:dd:ee;ff or
# foo.bar.com aa:bb:cc:dd:ee:ff
#
# which are hostname and MAC addresses of NICs to send a wakeup packet.
#
# This program may have to be run with superuser privilege because it
# may need to inject an ARP entry into the cache.
# Be careful, you could corrupt valid entries if those NICs are
# already active.
#
# 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-05
#
use Socket;
while (<>) {
($ip, $mac) = split;
next if !defined($ip) or !defined($mac) or $ip eq '' or $mac eq '';
&send_wakeup_packet($ip, $mac);
}
sub send_wakeup_packet {
($ip, $mac) = @_;
if (!defined($iaddr = inet_aton($ip))) {
print "Cannot resolve $ip\n";
return;
}
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;
}
# Inject entry into ARP table, in case it's not there already
system("arp -s $ip $mac") == 0
or print "Warning: arp command failed, you need to be root\n";
# 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";
# Send the wakeup packet
print "Sending wakeup packet to $ip at MAC address $mac\n";
defined(send(S, $magic, 0, sockaddr_in(0x2fff, $iaddr)))
or print "send: $!\n";
close(S);
}
For requests or suggestions regarding this mailing list archive please write to netboot@gkminix.han.de.