From 5bf296e6a82939d4a1e17712a4ea16d263259d9f Mon Sep 17 00:00:00 2001 From: quietsy Date: Wed, 24 Jun 2026 12:23:54 +0300 Subject: [PATCH 1/4] add wol support --- root/app/swag-ondemand.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/root/app/swag-ondemand.py b/root/app/swag-ondemand.py index e99b0aa6..43e2e85d 100644 --- a/root/app/swag-ondemand.py +++ b/root/app/swag-ondemand.py @@ -4,6 +4,8 @@ import os import threading import time +import socket +import subprocess ACCESS_LOG_FILE = "/config/log/nginx/access.log" LOG_FILE = "/config/log/ondemand/ondemand.log" @@ -34,6 +36,36 @@ def init_docker(self): logging.exception(e) os._exit(1) + def send_wol(self, mac_address, broadcast_address="255.255.255.255"): + clean_mac = mac_address.replace(":", "").replace("-", "") + if len(clean_mac) != 12: + logging.warning(f"Invalid MAC address: {mac_address}") + return + + packet = b'\xff' * 6 + b'\x00' * 12 * 16 + for i in range(16): + packet[6 + i*6 : 12 + i*6] = bytes.fromhex(clean_mac) + + with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: + s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + s.sendto(packet, (broadcast_address, 7)) + logging.info(f"Sent WoL packet to {mac_address} on {broadcast_address}") + + def handle_wol(self, container): + mac_address = container.labels.get("swag_ondemand_mac") + broadcast_address = container.labels.get("swag_ondemand_broadcast", "255.255.255.255") + ip_to_ping = container.labels.get("swag_ondemand_ip") + + ping_success = False + if ip_to_ping: + result = subprocess.run(["ping", "-c", "1", "-W", "2", ip_to_ping], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + if result.returncode == 0: + logging.info(f"IP {ip_to_ping} responded to ping, skipping WoL for {container.name}") + ping_success = True + + if mac_address and (not ip_to_ping or not ping_success): + self.send_wol(mac_address, broadcast_address) + def process_containers(self): containers = self.docker_client.containers.list(all=True, filters={ "label": ["swag_ondemand=enable"] }) container_names = {container.name for container in containers} @@ -78,9 +110,13 @@ def start_containers(self): continue self.ondemand_containers[container_name]["last_accessed"] = datetime.now() accessed = True + if not accessed or self.ondemand_containers[container_name]["status"] == "running": continue - self.docker_client.containers.get(container_name).start() + + container = self.docker_client.containers.get(container_name) + self.handle_wol(container) + container.start() logging.info(f"Started {container_name}") self.ondemand_containers[container_name]["status"] = "running" From f6236ceec5f73197439ecda05fc17f6d3df8c122 Mon Sep 17 00:00:00 2001 From: quietsy Date: Wed, 24 Jun 2026 13:09:59 +0300 Subject: [PATCH 2/4] Fix wol --- root/app/swag-ondemand.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/root/app/swag-ondemand.py b/root/app/swag-ondemand.py index 43e2e85d..e5514059 100644 --- a/root/app/swag-ondemand.py +++ b/root/app/swag-ondemand.py @@ -42,7 +42,7 @@ def send_wol(self, mac_address, broadcast_address="255.255.255.255"): logging.warning(f"Invalid MAC address: {mac_address}") return - packet = b'\xff' * 6 + b'\x00' * 12 * 16 + packet = bytearray([0xff] * 6 + [0x00] * 12) for i in range(16): packet[6 + i*6 : 12 + i*6] = bytes.fromhex(clean_mac) From 8e30a6522917f4c734863bd6c1b68fe5785538a6 Mon Sep 17 00:00:00 2001 From: quietsy Date: Wed, 24 Jun 2026 13:53:56 +0300 Subject: [PATCH 3/4] Fix packet --- root/app/swag-ondemand.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/root/app/swag-ondemand.py b/root/app/swag-ondemand.py index e5514059..efb2ae21 100644 --- a/root/app/swag-ondemand.py +++ b/root/app/swag-ondemand.py @@ -42,13 +42,13 @@ def send_wol(self, mac_address, broadcast_address="255.255.255.255"): logging.warning(f"Invalid MAC address: {mac_address}") return - packet = bytearray([0xff] * 6 + [0x00] * 12) - for i in range(16): - packet[6 + i*6 : 12 + i*6] = bytes.fromhex(clean_mac) + mac_bytes = bytes.fromhex(clean_mac) + packet = b'\xff' * 6 + mac_bytes * 16 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.sendto(packet, (broadcast_address, 7)) + logging.info(f"Sent WoL packet to {mac_address} on {broadcast_address}") def handle_wol(self, container): From d92fde1eb39bec95dd96ba608dada79b70c42a33 Mon Sep 17 00:00:00 2001 From: quietsy Date: Wed, 24 Jun 2026 16:22:02 +0300 Subject: [PATCH 4/4] Trying to fix wol --- root/app/swag-ondemand.py | 20 +++---------------- .../s6-rc.d/init-mod-swag-ondemand-setup/run | 2 ++ 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/root/app/swag-ondemand.py b/root/app/swag-ondemand.py index efb2ae21..8fc3a008 100644 --- a/root/app/swag-ondemand.py +++ b/root/app/swag-ondemand.py @@ -4,8 +4,8 @@ import os import threading import time -import socket import subprocess +import wakeonlan ACCESS_LOG_FILE = "/config/log/nginx/access.log" LOG_FILE = "/config/log/ondemand/ondemand.log" @@ -36,21 +36,6 @@ def init_docker(self): logging.exception(e) os._exit(1) - def send_wol(self, mac_address, broadcast_address="255.255.255.255"): - clean_mac = mac_address.replace(":", "").replace("-", "") - if len(clean_mac) != 12: - logging.warning(f"Invalid MAC address: {mac_address}") - return - - mac_bytes = bytes.fromhex(clean_mac) - packet = b'\xff' * 6 + mac_bytes * 16 - - with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: - s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) - s.sendto(packet, (broadcast_address, 7)) - - logging.info(f"Sent WoL packet to {mac_address} on {broadcast_address}") - def handle_wol(self, container): mac_address = container.labels.get("swag_ondemand_mac") broadcast_address = container.labels.get("swag_ondemand_broadcast", "255.255.255.255") @@ -64,7 +49,8 @@ def handle_wol(self, container): ping_success = True if mac_address and (not ip_to_ping or not ping_success): - self.send_wol(mac_address, broadcast_address) + wakeonlan.send_magic_packet(mac_address, ip_address=broadcast_address, port=9) + logging.info(f"Sent WoL packet to {mac_address} on {broadcast_address}") def process_containers(self): containers = self.docker_client.containers.list(all=True, filters={ "label": ["swag_ondemand=enable"] }) diff --git a/root/etc/s6-overlay/s6-rc.d/init-mod-swag-ondemand-setup/run b/root/etc/s6-overlay/s6-rc.d/init-mod-swag-ondemand-setup/run index 57536391..7ca749dd 100755 --- a/root/etc/s6-overlay/s6-rc.d/init-mod-swag-ondemand-setup/run +++ b/root/etc/s6-overlay/s6-rc.d/init-mod-swag-ondemand-setup/run @@ -21,4 +21,6 @@ if [ ! -f /config/nginx/ondemand.conf ]; then lsiown -R abc:abc /config/nginx/ondemand.conf fi +echo "\ + wakeonlan" >> /mod-pip-packages-to-install.list echo "Applied the swag-ondemand mod" \ No newline at end of file