#!/bin/sh -efu

CONFDIR=/etc/state-change-notify
CONFIG="$CONFDIR/main.conf"
ACTIONDIR="$CONFDIR/actions.d"

usage()
{
    echo "Usage: ${0##*/} handler start|stop" >&2
}

if [ $# -ne 2 ]; then
    usage
    exit 255
fi

HANDLER="$1"

if [ ! -x "$ACTIONDIR/$HANDLER" ]; then
    echo "ERROR: Handler $ACTIONDIR/$HANDLER is not available!" >&2
    exit 2
fi

check_state()
{
    local term_jobs="$1"
    local job="$2"

    if echo "$term_jobs" | grep -q -e "^[[:space:]]*[0-9]\\+[[:space:]]\\+$job.target[[:space:]]\\+start[[:space:]]\\+waiting[[:space:]]*\$"; then
        return 0
    else
        return 1
    fi
}

guess_state()
{
    local term_jobs="$(systemctl list-jobs 2>&1 | grep -e 'sleep.target' -e 'reboot.target' -e 'shutdown.target' -e 'halt.target' -e 'final.target')"

    [ -n "$term_jobs" ] || return 1

    if check_state "$term_jobs" 'sleep'; then
        STATE='sleep'
    elif check_state "$term_jobs" 'reboot'; then
        STATE='reboot'
    elif check_state "$term_jobs" 'shutdown'; then
        STATE='shutdown'
    elif check_state "$term_jobs" 'halt'; then
        STATE='halt'
    else
        return 1
    fi
}

case "$2" in
    start)
        export STATE=start
        ;;
    stop)
        guess_state || STATE=unknown-shutdown
        export STATE
        ;;
    *)
        usage
        exit 255
        ;;
esac

if [ -n "$STATE" ]; then
    export SUBJECT="$(hostname -f) is about to $STATE"
    export MESSAGE="$(LANG=C date): The $(hostname -f) is about to $STATE."
else
    echo "ERROR: Unable to determine the system state" >&2
    exit 1
fi

export CONFDIR
export CONFIG
export ACTIONDIR
export HANDLER

"$ACTIONDIR/$HANDLER" "$STATE" "$SUBJECT" "$MESSAGE"
