#!/bin/sh
# Papexia Sauvegarde sur Synology (IDEE-039) : DSM appelle ce script pour
# démarrer et arrêter le service, et pour savoir s'il tourne.
#
# Le service a besoin de Node.js : le paquet « Node.js v20 » du Centre de
# paquets (déclaré en dépendance dans INFO). On accepte aussi une autre
# version installée, pour ne pas s'arrêter sur un détail.

PAQUET="PapexiaSauvegarde"
CIBLE="/var/packages/${PAQUET}/target"
VAR="/var/packages/${PAQUET}/var"
PID="${VAR}/service.pid"
JOURNAL="${VAR}/journal.log"
REGLAGES="${VAR}/env"
JOURNAL_MAX=2000000

trouver_node() {
    for candidat in \
        /var/packages/Node.js_v20/target/usr/local/bin/node \
        /var/packages/Node.js_v22/target/usr/local/bin/node \
        /var/packages/Node.js_v18/target/usr/local/bin/node \
        /usr/local/bin/node \
        /usr/bin/node
    do
        if [ -x "${candidat}" ]; then
            echo "${candidat}"
            return 0
        fi
    done
    return 1
}

# Le journal ne doit pas remplir le disque : au-delà de deux mégaoctets,
# on garde la fin sous journal.log.1 et on repart à zéro.
tourner_journal() {
    if [ -f "${JOURNAL}" ]; then
        taille=$(wc -c < "${JOURNAL}" 2>/dev/null || echo 0)
        if [ "${taille}" -gt "${JOURNAL_MAX}" ]; then
            mv -f "${JOURNAL}" "${JOURNAL}.1"
        fi
    fi
}

demarrer() {
    NODE=$(trouver_node)
    if [ -z "${NODE}" ]; then
        echo "Node.js est introuvable : installez « Node.js v20 » dans le Centre de paquets." >&2
        return 1
    fi
    mkdir -p "${VAR}"
    tourner_journal
    if [ -r "${REGLAGES}" ]; then
        . "${REGLAGES}"
    fi
    PAPEXIA_TRAVAIL="${VAR}"
    export PAPEXIA_TRAVAIL
    export PAPEXIA_PORT PAPEXIA_SERVEUR PAPEXIA_RACINES PAPEXIA_DOSSIER PAPEXIA_PREPRODUCTION PAPEXIA_HOTES
    "${NODE}" "${CIBLE}/service.js" >> "${JOURNAL}" 2>&1 &
    echo $! > "${PID}"
    sleep 1
    etat
}

arreter() {
    if [ -r "${PID}" ]; then
        processus=$(cat "${PID}")
        kill "${processus}" 2>/dev/null
        essai=0
        while [ "${essai}" -lt 15 ]; do
            kill -0 "${processus}" 2>/dev/null || break
            sleep 1
            essai=$((essai + 1))
        done
        kill -9 "${processus}" 2>/dev/null
        rm -f "${PID}"
    fi
    return 0
}

etat() {
    if [ -r "${PID}" ] && kill -0 "$(cat "${PID}")" 2>/dev/null; then
        return 0
    fi
    # 3 : DSM comprend « arrêté ».
    return 3
}

case "$1" in
    start) demarrer ;;
    stop) arreter ;;
    status) etat ;;
    log) echo "${JOURNAL}" ;;
    *)
        echo "usage: $0 {start|stop|status|log}" >&2
        exit 1
        ;;
esac
