#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ wake_z230_v1.0.py ----------------- Nazev: Wake-on-LAN budic Z230 Verze: 1.0 Datum: 2026-06-19 Popis: Posle Wake-on-LAN "magic packet" pro probuzeni pocitace v MISTNI siti. Cista stdlib (socket), zadne zavislosti. Urceno ke spusteni z PC, ktery je na stejnem LAN segmentu jako cilovy pocitac (broadcast). Magic packet = 6x 0xFF + 16x MAC cile. Posila se jako UDP broadcast na port 9 (a 7) na 255.255.255.255 i na broadcast podsite, aby to chytlo bez ohledu na konfiguraci. Pouziti: python wake_z230_v1.0.py # probudi Z230 (vychozi MAC) python wake_z230_v1.0.py AA:BB:CC:DD:EE:FF python wake_z230_v1.0.py --mac 1C-86-0B-2B-1F-B4 --broadcast 192.168.1.255 Pozn.: Funguje jen v LOKALNI siti. Pres routovanou VPN se broadcast obvykle neprenese (resi se relayem na segmentu) — viz planovany wake-agent na Toweru. """ import argparse import re import socket import sys # === Vychozi cil: Z230 (Realtek Gaming 2.5GbE) === DEFAULT_MAC = "1C-86-0B-2B-1F-B4" DEFAULT_BROADCAST = "192.168.1.255" # broadcast domaci podsite WOL_PORTS = (9, 7) # standardni WoL discard/echo porty def _norm_mac(mac: str) -> bytes: """Normalizuje MAC ('1C-86-..' / '1c:86:..' / '1c86...') na 6 bajtu.""" hexstr = re.sub(r"[^0-9A-Fa-f]", "", mac) if len(hexstr) != 12: raise ValueError(f"Neplatna MAC adresa: {mac!r} (ocekavam 12 hex znaku)") return bytes.fromhex(hexstr) def build_magic_packet(mac: str) -> bytes: """Sestavi magic packet: 6x 0xFF + 16x MAC.""" mac_bytes = _norm_mac(mac) return b"\xff" * 6 + mac_bytes * 16 def send_wol(mac: str, broadcasts, ports=WOL_PORTS) -> int: """Posle magic packet na vsechny zadane broadcast adresy a porty. Vrati pocet uspesne odeslanych paketu.""" packet = build_magic_packet(mac) sent = 0 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) try: for addr in broadcasts: for port in ports: try: sock.sendto(packet, (addr, port)) sent += 1 print(f" -> magic packet poslan na {addr}:{port}") except OSError as e: print(f" !! {addr}:{port} selhalo: {e}") finally: sock.close() return sent def main(argv=None): p = argparse.ArgumentParser(description="Wake-on-LAN budic (lokalni sit)") p.add_argument("mac", nargs="?", default=DEFAULT_MAC, help=f"MAC cile (vychozi {DEFAULT_MAC} = Z230)") p.add_argument("--mac", dest="mac_opt", default=None, help="MAC cile (alternativa k pozicnimu argumentu)") p.add_argument("--broadcast", action="append", default=None, help="Broadcast adresa (lze vicekrat; vychozi 255.255.255.255 + podsit)") args = p.parse_args(argv) mac = args.mac_opt or args.mac broadcasts = args.broadcast or ["255.255.255.255", DEFAULT_BROADCAST] print(f"Wake-on-LAN -> MAC {mac}") sent = send_wol(mac, broadcasts) if sent: print(f"Hotovo: odeslano {sent} paketu. Pocitac by se mel probudit (pokud spi/je vypnuty s WoL).") return 0 print("Nic se neodeslalo — zkontroluj sit.", file=sys.stderr) return 1 if __name__ == "__main__": sys.exit(main())