wol: share the wakeonlan command via wol-sleeper/waker_command

Sleeper now exposes the full `/usr/bin/wakeonlan -i <broadcast> <mac>`
invocation as wol-sleeper/waker_command; waker reads that instead of
rebuilding the command line itself. Adds the `-i <subnet-broadcast>`
flag so magic packets reach sleepers on a different L2 segment than
the waker.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
CroneKorkN 2026-05-16 01:00:30 +02:00
parent f3122f3d0a
commit 14e055a5e0
Signed by: cronekorkn
SSH key fingerprint: SHA256:v0410ZKfuO1QHdgKBsdQNF64xmTxOF8osF1LIqwTcVw
2 changed files with 6 additions and 3 deletions

View file

@ -45,17 +45,20 @@ defaults = {
@metadata_reactor.provides( @metadata_reactor.provides(
'wol-sleeper/mac', 'wol-sleeper/mac',
'wol-sleeper/waker_command',
'wol-sleeper/wake_command', 'wol-sleeper/wake_command',
) )
def wake_command(metadata): def wake_command(metadata):
waker_hostname = repo.get_node(metadata.get('wol-sleeper/waker')).hostname waker_hostname = repo.get_node(metadata.get('wol-sleeper/waker')).hostname
mac = metadata.get(f"network/{metadata.get('wol-sleeper/network')}/mac") mac = metadata.get(f"network/{metadata.get('wol-sleeper/network')}/mac")
ip = ip_interface(metadata.get(f"network/{metadata.get('wol-sleeper/network')}/ipv4")).ip network = ip_interface(metadata.get(f"network/{metadata.get('wol-sleeper/network')}/ipv4"))
waker_command = f"/usr/bin/wakeonlan -i {network.network.broadcast_address} {mac}"
return { return {
'wol-sleeper': { 'wol-sleeper': {
'mac': mac, 'mac': mac,
'wake_command': f"ssh -o StrictHostKeyChecking=no wol@{waker_hostname} '/usr/bin/wakeonlan {mac}' && while ! ping {ip} -c1 -W3; do true; done", 'waker_command': waker_command,
'wake_command': f"ssh -o StrictHostKeyChecking=no wol@{waker_hostname} '{waker_command}' && while ! ping {network.ip} -c1 -W3; do true; done",
}, },
} }

View file

@ -17,7 +17,7 @@ def user(metadata):
'authorized_users': { 'authorized_users': {
f'root@{ssh_client.name}': { f'root@{ssh_client.name}': {
'commands': { 'commands': {
'/usr/bin/wakeonlan ' + sleeper.metadata.get('wol-sleeper/mac') sleeper.metadata.get('wol-sleeper/waker_command')
for sleeper in repo.nodes for sleeper in repo.nodes
if sleeper.has_bundle('wol-sleeper') if sleeper.has_bundle('wol-sleeper')
and sleeper.metadata.get('wol-sleeper/waker') == node.name and sleeper.metadata.get('wol-sleeper/waker') == node.name