z230
This commit is contained in:
@@ -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.
|
||||
@@ -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())
|
||||
Reference in New Issue
Block a user