#!/usr/bin/python # # Original version by Fadly Tabrani (via ASPN) # Modified by Wilfredo Sanchez, wsanchez@wsanchez.net # import string import struct import socket def normalize_mac_address(mac_address): """ Normalize the given MAC address format to 12 digits and return the result. The given address may use a separator character (typically ":" or " "), which is removed from the result. """ if len(mac_address) > 2: separator = mac_address[2] if separator not in string.hexdigits: mac_address = mac_address.replace(mac_address[2], '') if len(mac_address) != 12: raise ValueError("Invalid MAC address format") for digit in mac_address: if digit not in string.hexdigits: raise ValueError("Invalid MAC address format") return mac_address def wake_on_lan(mac_address): """ Broadcast a Wake-On-LAN packet with the given MAC address. """ # Normalize MAC address mac_address = normalize_mac_address(mac_address) # Pad the synchronization stream. data = "FFFFFFFFFFFF" + (mac_address * 20) send_data = [] # Split up the hex values and pack. for i in range(0, len(data), 2): send_data.append(struct.pack("B", int(data[i: i + 2], 16))) send_data = "".join(send_data) # Broadcast it to the LAN. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.sendto(send_data, ("", 7)) if __name__ == '__main__': import sys for mac_address in sys.argv[1:]: try: wake_on_lan(mac_address) except Exception, e: print "Unable to send Wake-On-LAN packet to %s: %s" % (mac_address, e)