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.