[288] | 1 | #!/usr/bin/env python
|
---|
| 2 | #
|
---|
| 3 | # Credits: http://code.activestate.com/recipes/358449-wake-on-lan/
|
---|
| 4 |
|
---|
| 5 | import socket
|
---|
| 6 | import struct
|
---|
| 7 | import sys
|
---|
| 8 |
|
---|
[372] | 9 | def wake_on_lan(macaddress, broadcast):
|
---|
[288] | 10 | """ Switches on remote computers using WOL. """
|
---|
| 11 |
|
---|
| 12 | # Check macaddress format and try to compensate.
|
---|
| 13 | if len(macaddress) == 12:
|
---|
| 14 | pass
|
---|
| 15 | elif len(macaddress) == 12 + 5:
|
---|
| 16 | sep = macaddress[2]
|
---|
| 17 | macaddress = macaddress.replace(sep, '')
|
---|
| 18 | else:
|
---|
| 19 | raise ValueError('Incorrect MAC address format')
|
---|
| 20 |
|
---|
| 21 | # Pad the synchronization stream.
|
---|
| 22 | data = ''.join(['FFFFFFFFFFFF', macaddress * 20])
|
---|
| 23 | send_data = ''
|
---|
| 24 |
|
---|
| 25 | # Split up the hex values and pack.
|
---|
| 26 | for i in range(0, len(data), 2):
|
---|
| 27 | send_data = ''.join([send_data,
|
---|
| 28 | struct.pack('B', int(data[i: i + 2], 16))])
|
---|
| 29 |
|
---|
| 30 | # Broadcast it to the LAN.
|
---|
| 31 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
---|
| 32 | sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
---|
[372] | 33 | sock.sendto(send_data, (broadcast, 7))
|
---|
[288] | 34 |
|
---|
| 35 |
|
---|
| 36 | if __name__ == '__main__':
|
---|
[289] | 37 | hostmac = { 'brahm' : '00:13:d3:a7:24:51',
|
---|
[371] | 38 | 'hp' : '00:02:e3:3c:c9:3b',
|
---|
| 39 | 'sb' : '00:13:d4:06:0c:79' }
|
---|
[288] | 40 | if len(sys.argv) == 1:
|
---|
[372] | 41 | print "Usage: %s <macaddr|host> [<broadcast>]" % sys.argv[0]
|
---|
[288] | 42 | print ""
|
---|
| 43 | print "Hosts configured: "
|
---|
| 44 | for host, mac in hostmac.iteritems():
|
---|
| 45 | print " - %s : %s" % (host, mac)
|
---|
| 46 | sys.exit(64)
|
---|
| 47 |
|
---|
[372] | 48 | try:
|
---|
| 49 | mac = hostmac[sys.argv[1]]
|
---|
| 50 | except KeyError:
|
---|
| 51 | mac = sys.argv[1]
|
---|
| 52 |
|
---|
| 53 | try:
|
---|
| 54 | broadcast = sys.argv[2]
|
---|
| 55 | except IndexError:
|
---|
| 56 | broadcast = '<broadcast>'
|
---|
| 57 |
|
---|
| 58 | wake_on_lan(mac, broadcast)
|
---|