52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
import socket
|
|
import struct
|
|
# import logging
|
|
|
|
# Setup logging
|
|
# logging.basicConfig(level=logging.DEBUG)
|
|
|
|
def create_magic_packet(mac_address):
|
|
"""Create a magic packet for the given MAC address."""
|
|
|
|
# Remove any separation characters from the MAC address
|
|
mac_address = mac_address.replace(":", "").replace("-", "")
|
|
|
|
# Verify length of MAC address
|
|
# if len(mac_address) != 12:
|
|
# raise ValueError("Invalid MAC address format")
|
|
|
|
# Create the magic packet by repeating the MAC address 16 times
|
|
mac_bytes = bytes.fromhex(mac_address)
|
|
magic_packet = b'\xff' * 6 + mac_bytes * 16
|
|
|
|
return magic_packet
|
|
|
|
def send_magic_packet(mac_address, iface="eth0"):
|
|
try:
|
|
|
|
magic_packet = create_magic_packet(mac_address)
|
|
|
|
# Create a raw socket
|
|
sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
|
|
# logging.debug(f"Binding to interface: {iface}")
|
|
sock.bind((iface, 0))
|
|
|
|
# Log the packet for debugging
|
|
# logging.debug(f"Sending Magic Packet: {magic_packet.hex()} on interface {iface}")
|
|
|
|
# Construct the Ethernet frame (magic packet)
|
|
dest_mac = b'\xff\xff\xff\xff\xff\xff' # Broadcast MAC address
|
|
src_mac = sock.getsockname()[4] # Source MAC address of the interface
|
|
ether_type = struct.pack('!H', 0x0842) # Wake-on-LAN
|
|
frame = dest_mac + src_mac + ether_type + magic_packet
|
|
|
|
# Send the Ethernet frame
|
|
sock.send(frame)
|
|
sock.close()
|
|
# logging.debug(f"Magic packet sent to {mac_address} on interface {iface}")
|
|
except Exception as e:
|
|
logging.error(f"Failed to send WoL packet: {e}")
|
|
|
|
# Example usage
|
|
# send_magic_packet("mac goes here")
|