Capoeirista

WOL Listen

Oct 20th, 2024 (edited)
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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('sudo shutdown -h now')
  61.             elif os.name == 'nt':
  62.                 os.system('D:\\EasyUEFI\\bin\\EasyUEFIC.exe --one-time-boot --index 6 & shutdown -r -t 0 -f')
  63.  
  64. if os.name == 'posix':
  65.     run_udp_port_listener(WOL_PORT, INTERFACE_NAME_ARCH)
  66. elif os.name == 'nt':
  67.     run_udp_port_listener(WOL_PORT, INTERFACE_NAME)
Advertisement
Add Comment
Please, Sign In to add comment