This commit is contained in:
2026-06-19 14:28:54 +02:00
parent 6dd13a9198
commit 1cb825dcff
93 changed files with 41247 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# wake_z230 — Wake-on-LAN budič (v1.0)
**Soubor:** `wake_z230_v1.0.py` · **Datum:** 2026-06-19
Pošle Wake-on-LAN „magic packet" pro probuzení počítače **Z230** v místní síti.
Čistě stdlib (`socket`), bez závislostí.
## Cíl
- **Z230** — Realtek Gaming 2.5GbE, MAC `1C-86-0B-2B-1F-B4`, IP `192.168.1.87`
- Broadcast: `255.255.255.255` + `192.168.1.255`, UDP porty 9 a 7
## Použití
```bash
python wake_z230_v1.0.py # probudí Z230 (výchozí)
python wake_z230_v1.0.py AA:BB:CC:DD:EE:FF # jiná MAC
python wake_z230_v1.0.py --mac 1C-86-0B-2B-1F-B4 --broadcast 192.168.1.255
```
## Podmínky funkčnosti
- Spouštět z PC na **stejném LAN segmentu** jako cíl (broadcast).
- Na Z230 musí být zapnutý WoL (je: *Wake on Magic Packet* Enabled, *Shutdown WOL* Enabled, Fast Startup vypnutý) — probudí ze spánku S3 i z vypnutí S5.
## Omezení
- **Jen lokální síť.** Přes routovanou VPN (WireGuard končí na Mikrotiku) se broadcast obvykle nepřenese.
Pro vzdálené buzení z dovolené je v plánu **wake-agent na Toweru** (Telethon, vlastní session `wake`,
trigger přes Telegram Reply) — Tower je always-on a emituje packet přímo na LAN segment.
## Než pojedeš na dovolenou (TODO)
- DHCP rezervace `192.168.1.87 ↔ 1C-86-0B-2B-1F-B4` na Mikrotiku (jinak po probuzení může mít jinou IP).
- Ověřit `AllowedIPs` ve WG profilu, že kryje `192.168.1.0/24`.
- Reálný test: nechat Z230 usnout a probudit přes plánovaný wake-agent.
+95
View File
@@ -0,0 +1,95 @@
#!/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())