diff --git a/sbin/reboot b/sbin/reboot new file mode 100755 index 0000000..707a820 Binary files /dev/null and b/sbin/reboot differ diff --git a/sbin/shutdown b/sbin/shutdown new file mode 100755 index 0000000..9b6bba4 --- /dev/null +++ b/sbin/shutdown @@ -0,0 +1,73 @@ +#!/bin/sh +# shutdown - shutdown(8) lookalike for runit + +single() { + runsvchdir single +} + +abort() { + printf '%s\n' "$1" >&2 + exit 1 +} + +usage() { + abort "Usage: ${0##*/} [-fF] [-kchPr] time [warning message]" +} + +action=single + +while getopts akrhPHfFnct: opt; do + case "$opt" in + a|n|H) abort "'-$opt' is not implemented";; + t) ;; + f) touch /fastboot;; + F) touch /forcefsck;; + k) action=true;; + c) action=cancel;; + h|P) action=halt;; + r) action=reboot;; + [?]) usage;; + esac +done +shift $((OPTIND - 1)) + +[ $# -eq 0 ] && usage + +time=$1; shift +message="${*:-system is going down}" + +if [ "$action" = "cancel" ]; then + kill "$(cat /run/runit/shutdown.pid)" + if [ -e /etc/nologin ] && ! [ -s /etc/nologin ]; then + rm /etc/nologin + fi + echo "${*:-shutdown cancelled}" | wall + exit +fi + +touch /run/runit/shutdown.pid 2>/dev/null || abort "Not enough permissions to execute ${0#*/}" +echo $$ >/run/runit/shutdown.pid + +case "$time" in + now) time=0;; + +*) time=${time#+};; + *:*) abort "absolute time is not implemented";; + *) abort "invalid time";; +esac + +for break in 5 0; do + [ "$time" -gt "$break" ] || continue + [ "$break" = 0 ] && touch /etc/nologin + + printf '%s in %s minutes\n' "$message" "$time" | wall + printf 'shutdown: sleeping for %s minutes... ' "$(( time - break ))" + sleep $(( (time - break) * 60 )) + time="$break" + printf '\n' + + [ "$break" = 0 ] && rm /etc/nologin +done + +printf '%s NOW\n' "$message" | wall + +$action