#
set -eu
+ME=molly-guard
+
CMD="${0##*/}"
EXEC="/sbin/$CMD"
+
case "$CMD" in
- halt|reboot|shutdown)
+ halt|reboot|shutdown|poweroff)
+ if [ ! -f $EXEC ]; then
+ echo "E: $ME: not a regular file: $EXEC" >&2
+ exit 4
+ fi
if [ ! -x $EXEC ]; then
- echo "E: not an executable: $EXEC" >&2
+ echo "E: $ME: not an executable: $EXEC" >&2
exit 3
fi
;;
*)
- echo "E: unsupported command: $CMD" >&2
+ echo "E: $ME: unsupported command: $CMD" >&2
exit 1
;;
esac
+ARGS="$@"
+
+do_real_cmd()
+{
+ case "$ARGS" in
+ (*--molly-guard-do-nothing*)
+ ARGS0="${ARGS%%--molly-guard-do-nothing*}"
+ ARGS1="${ARGS##*--molly-guard-do-nothing}"
+ echo "$ME: would run: $EXEC ${ARGS0# } ${ARGS1# }"
+ exit 0;;
+ *) eval exec $EXEC "$ARGS";;
+ esac
+}
+
+# require $SSH_CONNECTION to be set, indicates an SSH session
+[ -n "${SSH_CONNECTION:-}" ] || do_real_cmd
+# require an interactive terminal connected to stdin
+test -t 0 || do_real_cmd
+# pass through help commands
+case "$CMD $ARGS" in
+ (shutdown\ *-c*) do_real_cmd;;
+ (shutdown\ *-h*) do_real_cmd;;
+ (*--help*) do_real_cmd;;
+ *) :;;
+esac
+
+HOSTNAME="$(hostname)"
+
+sigh()
+{
+ echo "Good thing I asked; I won't $CMD $HOSTNAME ..."
+ exit 2
+}
+
+trap 'echo;sigh' 1 2 3 9 10 12 15
-if [ -n "${SSH_CONNECTION:-}" ] && test -t 0 && [ "${1:-}" != '--help' ]; then
- echo -n "SSH session detected, type in hostname of the machine to $CMD: "
- read HOSTNAME_USER
+echo "$ME: SSH session detected!"
+echo -n "Please type in hostname of the machine to $CMD: "
+read HOSTNAME_USER || :
- HOSTNAME="$(hostname)"
+[ "$HOSTNAME_USER" = "$HOSTNAME" ] || sigh
- if [ "$HOSTNAME_USER" != "$HOSTNAME" ]; then
- echo "Good thing I asked; I won't $CMD $HOSTNAME ..."
- exit 2
- fi
-fi
+trap - 1 2 3 9 10 12 15
-exec $EXEC "$@"
+do_real_cmd