diff --git a/bundles/wol-sleeper/files/suspend_if_idle b/bundles/wol-sleeper/files/suspend_if_idle new file mode 100644 index 0000000..d33f65c --- /dev/null +++ b/bundles/wol-sleeper/files/suspend_if_idle @@ -0,0 +1,35 @@ +#!/bin/bash + +UPTIME=$(cat /proc/uptime | cut -d. -f1) +MIN_UPTIME=$(expr 60 \* 30) +if [[ $UPTIME -lt $MIN_UPTIME ]] +then + echo "ABORT: uptime ($UPTIME) lower than min ($MIN_UPTIME)" + exit 0 +fi + +for SERVICE in $(systemctl list-timers --no-pager --no-legend --state active -o json | jq -r '.[] | .activates') +do + if systemctl is-active "$SERVICE" --quiet + then + echo "ABORT: service $SERVICE is running by timer" + exit 0 + fi +done + +LOGINS=$(who -u | grep pts\/ | wc -l) +if ! [[ $LOGINS =~ "^0$" ]] +then + echo "ABORT: $LOGINS user logins" + exit 0 +fi + +if [[ $1 = now ]] +then + echo "SESPENDING" + sleep 10 + systemctl suspend +else + echo "WOULD SESPEND" + sleep 300 +fi diff --git a/bundles/wol-sleeper/items.py b/bundles/wol-sleeper/items.py index 8ba09b7..3314013 100644 --- a/bundles/wol-sleeper/items.py +++ b/bundles/wol-sleeper/items.py @@ -1,3 +1,9 @@ waker_node = repo.get_node(node.metadata.get('wol-sleeper/waker')) if not waker_node.has_bundle('wol-waker'): raise Exception(f'waker node {waker_node.name} does not have bundle wol-waker') + +files = { + '/opt/suspend_if_idle': { + 'mode': '550', + }, +} diff --git a/bundles/wol-sleeper/metadata.py b/bundles/wol-sleeper/metadata.py index ecb98c5..849ada7 100644 --- a/bundles/wol-sleeper/metadata.py +++ b/bundles/wol-sleeper/metadata.py @@ -1,5 +1,17 @@ from ipaddress import ip_interface +@metadata_reactor.provides( + 'systemd-timers/suspend-if-idle', +) +def timer(metadata): + return { + 'systemd-timers': { + 'suspend-if-idle': { + 'command': '/opt/suspend_if_idle now', + 'when': 'minutely', + }, + }, + } @metadata_reactor.provides( 'wol-sleeper/wake_command',