#!/bin/bash

cmds_openrc() {
    COMMANDS[enable]="rc-update add ${SV} default"
    COMMANDS[disable]="rc-update del ${SV} default"
    COMMANDS[start]="rc-service ${SV} start"
    COMMANDS[stop]="rc-service ${SV} stop"
}

cmds_s6() {
    COMMANDS[start]="s6-rc -u change ${SV}"
    COMMANDS[stop]="s6-rc -d change ${SV}"
    COMMANDS[enable]="s6-service add default ${SV}"
    COMMANDS[disable]="s6-service del default ${SV}"
}

cmds_dinit() {
    COMMANDS[start]="dinitctl start ${SV}"
    COMMANDS[stop]="dinitctl stop ${SV}"
    COMMANDS[enable]="ln -s /etc/dinit.d/${SV} /etc/dinit.d/boot.d/"
    COMMANDS[disable]="rm /etc/dinit.d/boot.d/${SV}"
}

cmds_runit() {
    COMMANDS[start]="runsv /etc/runit/sv/${SV}"
    COMMANDS[stop]="sv stop /etc/runit/sv/${SV}"
    COMMANDS[enable]="ln -s /etc/runit/sv/${SV} /run/runit/service/"
    COMMANDS[disable]="rm /run/runit/service/${SV}"
}

is_live() {
    if [[ ! -d /run/openrc && "${INIT}" == "openrc" ]]; then
        echo >&2 "  Skipped: ${INIT} is not running."
        exit 0
    elif [[ ! -d /run/s6-rc && "${INIT}" == "s6" ]]; then
        echo >&2 "  Skipped: ${INIT} is not running."
        exit 0
    elif [[ ! -S /run/dinitctl && "${INIT}" == "dinit" ]]; then
        echo >&2 "  Skipped: ${INIT} is not running."
        exit 0
    elif [[ ! -d /run/runit && "${INIT}" == "runit" ]]; then
        echo >&2 "  Skipped: ${INIT} is not running."
        exit 0
    fi
}

detect() {
    for i in "${SUPPORTED[@]}"; do
        if [[ -f /usr/bin/"$i"-init ]]; then
            INIT="$i"
            cmds_"${INIT}"
        fi
    done
}

usage() {
    cat <<EOF
usage: ${0##*/} [action] [service]

  actions:
    enable
    disable
    start
    stop
EOF
}

readonly SUPPORTED=(openrc s6 dinit runit)
declare -A COMMANDS

INIT=
ACTION="$1"
SV="$2"

if [[ -z "${SV}" ]]; then
    usage; exit 1
fi

detect

case "${ACTION}" in
    start|stop)   is_live; ${COMMANDS["${ACTION}"]} ;;
    enable|disable) ${COMMANDS["${ACTION}"]} ;;
    help) usage; exit 0 ;;
    *) usage; exit 1 ;;
esac
