Files
WOL-LY/app/wol_utils.py
2024-12-13 18:08:44 +02:00

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")