#!/bin/bash -e
# Systemd helper script to start/stop Dataiku DSS

Usage() {
    echo >&2 "Usage: $0 (init | start | stop)"
    exit 1
}

if [ $# -ne 1 ]; then
    Usage
fi
case "$1" in
    init | start | stop) ACTION="$1";;
    *) Usage;;
esac

# Load configuration file
# Should contain the following mandatory variables:
# DSS_DATADIR : DSS data directory
# DSS_USER : DSS user account
#
# May contain an optional list of cgroups to create for DSS use:
# DSS_CGROUP_ROOT : cgroup root mountpoint, default /sys/fs/cgroup
# DSS_CGROUPS : colon-separated list of cgroup directories to create, relative to DSS_CGROUP_ROOT
# DSS_CGROUP_CONTROLLERS : [cgroup v2 only] list of controllers to enable, default "cpu memory"

CONFIG="$0.conf"
if [ ! -f "$CONFIG" ]; then
    echo >&2 "$0 : ERROR : Missing configuration file $CONFIG"
    exit 1
fi

DSS_DATADIR=
DSS_USER=
DSS_CGROUP_ROOT="/sys/fs/cgroup"
DSS_CGROUPS=
DSS_CGROUP_CONTROLLERS="cpu memory"
. "$CONFIG"
if [ -z "$DSS_DATADIR" ]; then
    echo >&2 "$0 : ERROR : Missing mandatory parameter DSS_DATADIR in $CONFIG"
    exit 1
fi
if [ -z "$DSS_USER" ]; then
    echo >&2 "$0 : ERROR : Missing mandatory parameter DSS_USER in $CONFIG"
    exit 1
fi

# Set requested cgroup v2 controllers from root to given group
# setControllers GROUP SUBTREE_CONTROL
setControllers() {
    if [ "$1" != "." ]; then
        setControllers "$(dirname "$1")" "$2"
    fi
    echo "$2" >"$DSS_CGROUP_ROOT/$1/cgroup.subtree_control"
}

createCGroups() {
    if [ "$(stat -f -c %T "$DSS_CGROUP_ROOT")" = "cgroup2fs" ]; then
        echo "detected cgroup v2 filesystem on $DSS_CGROUP_ROOT"
        cgroupv2=1
        subtree_control=
        for c in $DSS_CGROUP_CONTROLLERS; do
            subtree_control+="+$c "
        done
    else
        echo "cgroup v2 not detected on $DSS_CGROUP_ROOT, assuming cgroup v1"
        cgroupv2=
    fi

    echo "$DSS_CGROUPS" | tr ":" "\n" | while read d; do
        # sanity check
        case "$d" in
            "" | . | .. | /* | ./* | ../* | */ | */. | */.. | *//* | */./* | */../* )
                echo 2>&1 "$0 : ERROR: invalid cgroup : $d"
                exit 1
                ;;
        esac
        if [ -n "$cgroupv2" ]; then
            echo "setting up cgroup $d with controllers $subtree_control"
            mkdir -p "$DSS_CGROUP_ROOT/$d"
            setControllers "$d" "$subtree_control"
            chown "$DSS_USER" "$DSS_CGROUP_ROOT/$d" "$DSS_CGROUP_ROOT/$d/cgroup.procs"
        else
            echo "setting up cgroup $d"
            mkdir -p "$DSS_CGROUP_ROOT/$d"
            chown -Rh "$DSS_USER" "$DSS_CGROUP_ROOT/$d"
        fi
    done
}

case "$ACTION" in
    init)
        if [ -n "$DSS_CGROUPS" ]; then
            createCGroups
        fi
        ;;
    start)
        echo "starting Dataiku DSS"
        if [ $EUID -eq 0 ]; then
            su - "$DSS_USER" -c "$DSS_DATADIR/bin/dss start"
        else
            cd
            exec /bin/bash -l -c "exec $DSS_DATADIR/bin/dss start"
        fi
        ;;

    stop)
        echo "stopping Dataiku DSS"
        if [ $EUID -eq 0 ]; then
            su - "$DSS_USER" -c "$DSS_DATADIR/bin/dss stop"
        else
            cd
            exec /bin/bash -l -c "exec $DSS_DATADIR/bin/dss stop"
        fi
        ;;
esac
