Advertisement
Capoeirista

WOL Python

Oct 31st, 2024
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.03 KB | None | 0 0
  1. import socket
  2. import os
  3. import logging
  4. import psutil
  5.  
  6. WOL_PORT = 9999
  7. INTERFACE_NAME = "My Lan"
  8. INTERFACE_NAME_ARCH = "enp37s0"
  9.  
  10. logging.basicConfig(format="%(levelname)s: %(asctime)s %(message)s", level=logging.INFO)
  11. logger = logging.getLogger(__name__)
  12.  
  13.  
  14. def get_ip_mac_address(interface_name: str) -> tuple:
  15.     ip_addr = mac_addr = None
  16.  
  17.     for item in psutil.net_if_addrs()[interface_name]:
  18.         addr = item.address
  19.  
  20.         if "." in addr:
  21.             ip_addr = addr
  22.         elif ("-" in addr or ":" in addr) and "::" not in addr:
  23.             mac_addr = addr.replace(":", "-").upper()
  24.  
  25.     if not ip_addr or not mac_addr or ip_addr == "127.0.0.1":
  26.         raise "Не удалось получить IP или MAC-адрес сетевого интерфейса"
  27.  
  28.     return ip_addr, mac_addr
  29.  
  30.  
  31. def assemble_wol_packet(mac_address: str) -> str:
  32.     return f'{"FF-" * 6}{(mac_address + "-") * 16}'
  33.  
  34.  
  35. def check_is_wol_packet(raw_bytes: bytes, assembled_wol_packet: str) -> int:
  36.     decoded_packet_data = "-".join(f"{byte:02x}" for byte in raw_bytes).upper() + "-"
  37.  
  38.     if decoded_packet_data == assembled_wol_packet:
  39.         return 1
  40.  
  41.     return 0
  42.  
  43.  
  44. def run_udp_port_listener(port: int, interface_name: str):
  45.     ip_addr, mac_addr = get_ip_mac_address(interface_name)
  46.  
  47.     server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  48.     server_socket.bind((ip_addr, port))
  49.     logger.info(f"Listening on {ip_addr}:{port}")
  50.  
  51.     assembled_wol_packet = assemble_wol_packet(mac_addr)
  52.  
  53.     while True:
  54.         data, _ = server_socket.recvfrom(1024)
  55.  
  56.         is_wol_packet = check_is_wol_packet(data, assembled_wol_packet)
  57.  
  58.         if is_wol_packet == 1:
  59.             if os.name == "posix":
  60.                 os.system("reboot")
  61.             elif os.name == "nt":
  62.                 os.system(
  63.                     "shutdown -r -t 0 -f"
  64.                 )
  65.  
  66.  
  67. if os.name == "posix":
  68.     run_udp_port_listener(WOL_PORT, INTERFACE_NAME_ARCH)
  69. elif os.name == "nt":
  70.     run_udp_port_listener(WOL_PORT, INTERFACE_NAME)
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement