about summary refs log tree commit diff
path: root/zzz
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2014-07-25 14:56:00 +0200
committerChristian Neukirchen <chneukirchen@gmail.com>2014-07-25 14:56:00 +0200
commitedd55f327f0386e403829e379b964c18c39b112b (patch)
tree55dd216bf14d3f5d8bf6181e05435a073ba3a8c5 /zzz
parentdcf1e5200671dc032b25d31cc77b0bbf928afb77 (diff)
downloadrunit-void-edd55f327f0386e403829e379b964c18c39b112b.tar.gz
runit-void-edd55f327f0386e403829e379b964c18c39b112b.tar.xz
runit-void-edd55f327f0386e403829e379b964c18c39b112b.zip
Add zzz, a simple suspend/hibernate script with hooks
Diffstat (limited to 'zzz')
-rwxr-xr-xzzz62
1 files changed, 62 insertions, 0 deletions
diff --git a/zzz b/zzz
new file mode 100755
index 0000000..ead0051
--- /dev/null
+++ b/zzz
@@ -0,0 +1,62 @@
+#!/bin/sh
+# zzz - really simple suspend script
+
+USAGE="Usage: ${0##*/} [-nSzZR]
+   -n   dry run (sleep for 5s instead of suspend/hibernate)
+   -S   Low-power idle (ACPI S0)
+   -z   suspend to RAM (ACPI S3) [DEFAULT for zzz(8)]
+   -Z   hibernate to disk & power off (ACPI S4) [DEFAULT for ZZZ(8)]
+   -R   hibernate to disk & reboot"
+
+fail() { echo ${0##*/}: 1>&2 "$*"; exit 1; }
+
+export ZZZ_MODE=suspend
+export ZZZ_HIBERNATE_MODE=platform
+
+case "$0" in
+  *ZZZ) ZZZ_MODE=hibernate;;
+esac
+
+while getopts hnSzRZ: opt; do
+  case "$opt" in
+    n) ZZZ_MODE=noop;;
+    S) ZZZ_MODE=standby;;
+    z) ZZZ_MODE=suspend;;
+    Z) ZZZ_MODE=hibernate;;
+    R) ZZZ_MODE=hibernate; ZZZ_HIBERNATE_MODE=reboot;;
+    [h?]) fail "$USAGE";;
+  esac
+done
+shift $((OPTIND-1))
+
+case "$ZZZ_MODE" in
+  suspend) grep -q mem /sys/power/state || fail "suspend not supported";;
+  hibernate) grep -q disk /sys/power/state || fail "hibernate not supported";;
+esac
+
+test -w /sys/power/state || fail "sleep permission denied"
+
+(
+flock -n 9 || fail "another instance of zzz is running"
+
+echo -n "Zzzz... "
+
+for hook in /etc/zzz.d/suspend/*; do
+  [ -x "$hook" ] && "$hook"
+done
+
+case "$ZZZ_MODE" in
+  standby) echo -n freeze >/sys/power/state || fail "standby failed";;
+  suspend) echo -n mem >/sys/power/state || fail "suspend failed";;
+  hibernate)
+	echo $ZZZ_HIBERNATE_MODE >/sys/power/disk
+	echo -n disk >/sys/power/state || fail "hibernate failed";;
+  noop) sleep 5;;
+esac
+
+for hook in /etc/zzz.d/resume/*; do
+  [ -x "$hook" ] && "$hook"
+done
+
+echo "yawn."
+) 9</sys/power