96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
#!/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())
|