#
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 an interactive terminal connected to stdin
+test -t 0 || do_real_cmd
+
+# only run if we are being called over SSH, that is if the current terminal
+# was created by sshd.
+PTS=$(readlink /proc/$$/fd/0)
+pgrep -f "^sshd.+${PTS#/dev/}$" >/dev/null || 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