#!/bin/sh
# DSM service control for pvebackup. Runs as the package user (sc-pvebackup).

PKG="pvebackup"
PKGDIR="${SYNOPKG_PKGDEST:-/var/packages/${PKG}/target}"
PKGVAR="${SYNOPKG_PKGVAR:-/var/packages/${PKG}/var}"
PIDFILE="${PKGVAR}/${PKG}.pid"
LOGFILE="${PKGVAR}/${PKG}.log"
BIN="${PKGDIR}/bin/pvebackup"

# The shared folder DSM created for us. Since DSM 7.0-41201 it is linked under
# the package directory; fall back to the package volume, then /volume1.
if [ -d "/var/packages/${PKG}/shares/${PKG}" ]; then
    ROOT="/var/packages/${PKG}/shares/${PKG}"
elif [ -n "${SYNOPKG_PKGDEST_VOL}" ] && [ -d "${SYNOPKG_PKGDEST_VOL}/${PKG}" ]; then
    ROOT="${SYNOPKG_PKGDEST_VOL}/${PKG}"
else
    ROOT="/volume1/${PKG}"
fi

export PVEB_DATA_DIR="${ROOT}/data"
export PVEB_STORE="${ROOT}/store"
export PVEB_LISTEN="127.0.0.1:5080"   # reached through DSM (ui/index.cgi), never directly
# Shared between the daemon and ui/index.cgi (same package user): marks
# requests that came through DSM, for the "sign-in not required" setting.
export PVEB_CGI_SECRET_FILE="${PKGVAR}/cgi.secret"
# give the package user a writable HOME.
export HOME="${PKGVAR}"
# DSM starts packages with a sparse PATH.
export PATH="${PKGDIR}/bin:/usr/local/bin:/usr/bin:/bin:${PATH}"

# Every pvebackup process of ours, pidfile or not - an upgrade that lost the
# pidfile must not leave an old binary holding the port.
all_pids() {
    for d in /proc/[0-9]*; do
        p=${d#/proc/}
        [ "$p" = "$$" ] && continue
        c=$(tr '\0' ' ' < "$d/cmdline" 2>/dev/null) || continue
        case "$c" in "$BIN "*|"$BIN") echo "$p" ;; esac
    done
}

running() {
    [ -f "$PIDFILE" ] || return 1
    pid=$(cat "$PIDFILE" 2>/dev/null)
    [ -n "$pid" ] || return 1
    [ -d "/proc/$pid" ] || return 1
    return 0
}

start() {
    if running; then
        echo "pvebackup is already running"
        return 0
    fi
    # Nothing from a previous version may survive into this start.
    for p in $(all_pids); do kill "$p" 2>/dev/null; done
    sleep 1
    for p in $(all_pids); do kill -9 "$p" 2>/dev/null; done
    if [ ! -d "$ROOT" ]; then
        echo "shared folder $ROOT does not exist; DSM should have created it at install"
        return 1
    fi
    if [ ! -w "$ROOT" ]; then
        echo "shared folder $ROOT is not writable by $(id -un)"
        return 1
    fi
    mkdir -p "$PKGVAR" "$PVEB_DATA_DIR" "$PVEB_STORE" || return 1
    if [ -f "$LOGFILE" ] && [ "$(wc -c < "$LOGFILE")" -gt 5242880 ]; then
        mv -f "$LOGFILE" "${LOGFILE}.1"
    fi
    nohup "$BIN" >> "$LOGFILE" 2>&1 &
    echo $! > "$PIDFILE"
    sleep 1
    if running; then
        echo "pvebackup started (open it from the DSM main menu; data in $ROOT)"
        return 0
    fi
    echo "pvebackup failed to start; see $LOGFILE"
    tail -n 20 "$LOGFILE" 2>/dev/null
    return 1
}

stop() {
    pids="$(all_pids)"
    if running; then
        pids="$pids $(cat "$PIDFILE")"
    fi
    for p in $pids; do kill "$p" 2>/dev/null; done
    i=0
    while [ $i -lt 30 ] && [ -n "$(all_pids)" ]; do
        sleep 1
        i=$((i + 1))
    done
    for p in $(all_pids); do kill -9 "$p" 2>/dev/null; done
    rm -f "$PIDFILE"
    return 0
}

case "$1" in
    start)  start ;;
    stop)   stop ;;
    status)
        if running; then
            echo "pvebackup is running"
            exit 0
        fi
        echo "pvebackup is not running"
        exit 3
        ;;
    log)
        echo "$LOGFILE"
        exit 0
        ;;
    *)
        echo "usage: $0 {start|stop|status|log}"
        exit 1
        ;;
esac
