#!/bin/bash
#
# (c) 2026 BRUNIE-Software GmbH
#
# BRUNIE Installations-Skript
#
# Untersttzt:
#   - CentOS 10
#   - openSUSE Leap 16
#
# WICHTIG:
#   GT.M ausschlielich: /usr/gtm
#   BRUNIE ausschlielich: /brunie
#

set -u
set -o pipefail

###############################################################################
# Grundeinstellungen
###############################################################################

UCIS="LAG"
UCILIST="SYS"

INSTDIR="$(pwd)"

BRUNIE_DIR="/brunie"
GTM_DIR="/usr/gtm"

BRUNIE_USER="brunie"
BRUNIE_GROUP="brunie"

SERVICE_NAME="brunie"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"

###############################################################################
# Hilfsfunktionen
###############################################################################

error()
{
    echo
    echo "=================================================="
    echo " FEHLER"
    echo "=================================================="
    echo
    echo "$1"
    echo
    exit 1
}

pause_yes()
{
    local answer

    read -r -p "$1 (J/N) <J> " answer

    if [ -z "$answer" ]; then
        answer="J"
    fi

    case "$answer" in
        J|j)
            return 0
            ;;
        N|n)
            return 1
            ;;
        *)
            return 1
            ;;
    esac
}

###############################################################################
# Installationsverzeichnis prfen
###############################################################################

if [ ! -f "${INSTDIR}/brunie.gtm.installation" ]; then

    echo
    printf '\a'
    echo "FEHLER: Bitte zuerst in den Installationsordner wechseln!"
    echo
    echo "  cd <Installationsordner>"
    echo "  ./configure"
    echo

    exit 1
fi

###############################################################################
# Root prfen
###############################################################################

if [ "$(id -u)" -ne 0 ]; then

    printf '\a'

    echo
    echo "FEHLER: Dieses Skript muss als root ausgefhrt werden."
    echo

    exit 1
fi

###############################################################################
# Begrung
###############################################################################

echo
echo "=================================================="
echo " BRUNIE Installation"
echo "=================================================="
echo
echo " GT.M:"
echo "   ${GTM_DIR}"
echo
echo " BRUNIE:"
echo "   ${BRUNIE_DIR}"
echo
echo " Benutzer:"
echo "   ${BRUNIE_USER}"
echo
echo " Gruppe:"
echo "   ${BRUNIE_GROUP}"
echo
echo " Datenbanken:"
echo "   ${BRUNIE_DIR}/<UCI>.dat"
echo "   ${BRUNIE_DIR}/<UCI>.tmp"
echo "   ${BRUNIE_DIR}/<UCI>.gld"
echo "   ${BRUNIE_DIR}/global.db"
echo

if ! pause_yes "Starten"; then
    exit 0
fi

###############################################################################
# Bereits installierte Version
###############################################################################

if [ -d "${BRUNIE_DIR}/system" ]; then

    echo
    echo "**************************************************"
    echo " ACHTUNG"
    echo "**************************************************"
    echo
    echo "BRUNIE ist bereits installiert:"
    echo "  ${BRUNIE_DIR}"
    echo

    read -r -p \
        "Soll die aktuelle Installation gesichert und entfernt werden? (J/N) <N> " \
        jn

    [ -z "$jn" ] && jn="N"

    if [[ "$jn" == "J" || "$jn" == "j" ]]; then

        echo
        echo "Stoppe BRUNIE-Service..."

        systemctl stop "${SERVICE_NAME}.service" \
            >/dev/null 2>&1 || true

        systemctl disable "${SERVICE_NAME}.service" \
            >/dev/null 2>&1 || true

        systemctl reset-failed "${SERVICE_NAME}.service" \
            >/dev/null 2>&1 || true

        rm -f "${SERVICE_FILE}"

        systemctl daemon-reload \
            >/dev/null 2>&1 || true

        mkdir -p /tmp/backup \
            || error "Backup-Verzeichnis konnte nicht angelegt werden."

        BRUNIE_BACKUP="/tmp/backup/brunie_$(date +%Y%m%d_%H%M%S)"

        if [ -d "${BRUNIE_DIR}" ]; then

            mv "${BRUNIE_DIR}" "${BRUNIE_BACKUP}" \
                || error "BRUNIE konnte nicht gesichert werden."

        fi

        echo
        echo "BRUNIE gesichert nach:"
        echo "  ${BRUNIE_BACKUP}"
        echo

        if [ -d "${GTM_DIR}" ]; then

            GTM_BACKUP="/tmp/backup/gtm_$(date +%Y%m%d_%H%M%S)"

            mv "${GTM_DIR}" "${GTM_BACKUP}" \
                || error "GT.M konnte nicht gesichert werden."

            echo "GT.M gesichert nach:"
            echo "  ${GTM_BACKUP}"

        fi

        userdel "${BRUNIE_USER}" \
            >/dev/null 2>&1 || true

        groupdel "${BRUNIE_GROUP}" \
            >/dev/null 2>&1 || true

        echo
        echo "Alte Installation wurde gesichert."
        echo

    fi
fi

###############################################################################
# API
###############################################################################

echo

if pause_yes "BRUNIE-API installieren und aktivieren"; then
    API="J"
else
    API="N"
fi

###############################################################################
# UCIs
###############################################################################

for uci in $UCIS
do
    if pause_yes "UCI '${uci}' anlegen"; then
        UCILIST="${UCILIST} ${uci}"
    fi
done

###############################################################################
# Update-Verzeichnis
###############################################################################

echo
echo "Verzeichnis der Updatedateien (*.rs/*.gs):"

read -r -p "  <${INSTDIR}/update> " UPDATE

if [ -z "$UPDATE" ]; then
    UPDATE="${INSTDIR}/update"
fi

###############################################################################
# Gruppe
###############################################################################

echo
echo -n "Anlegen der Gruppe '${BRUNIE_GROUP}'... "

if ! getent group "${BRUNIE_GROUP}" >/dev/null 2>&1; then

    groupadd --system "${BRUNIE_GROUP}" \
        || error "Gruppe ${BRUNIE_GROUP} konnte nicht angelegt werden."

else

    echo -n "bereits vorhanden. "

fi

echo "Okay!"

###############################################################################
# Benutzer
###############################################################################

echo -n "Anlegen des Benutzers '${BRUNIE_USER}'... "

if ! id "${BRUNIE_USER}" >/dev/null 2>&1; then

    useradd \
        --system \
        --create-home \
        --home-dir "/home/${BRUNIE_USER}" \
        --gid "${BRUNIE_GROUP}" \
        --shell /bin/bash \
        "${BRUNIE_USER}" \
        || error "Benutzer ${BRUNIE_USER} konnte nicht angelegt werden."

else

    echo -n "bereits vorhanden. "

fi

echo "Okay!"

###############################################################################
# GT.M Auswahl
###############################################################################

echo
echo "--------------------------------------------------"
echo "GT.M Architektur"
echo "--------------------------------------------------"
echo
echo "64bit oder 32bit?"
echo

read -r -p "(64/32) <64> " BIT

[ -z "$BIT" ] && BIT="64"

case "$BIT" in

    64)
        GTM_SOURCE="${INSTDIR}/gtm64"
        ;;

    32)
        GTM_SOURCE="${INSTDIR}/gtm32"
        ;;

    *)
        error "Ungltige Auswahl. Bitte 64 oder 32 eingeben."
        ;;

esac

###############################################################################
# GT.M Quelle prfen
###############################################################################

if [ ! -d "${GTM_SOURCE}" ]; then
    error "GT.M-Verzeichnis nicht gefunden: ${GTM_SOURCE}"
fi

if [ ! -f "${GTM_SOURCE}/configure" ]; then
    error "GT.M configure wurde nicht gefunden: ${GTM_SOURCE}/configure"
fi

###############################################################################
# GT.M alte Installation sichern
###############################################################################

echo
echo "Prfe vorhandene GT.M-Installation..."

if [ -d "${GTM_DIR}" ]; then

    echo
    echo "Vorhandene GT.M-Installation gefunden:"
    echo "  ${GTM_DIR}"
    echo

    mkdir -p /tmp/backup \
        || error "Backup-Verzeichnis konnte nicht angelegt werden."

    GTM_BACKUP="/tmp/backup/gtm_$(date +%Y%m%d_%H%M%S)"

    mv "${GTM_DIR}" "${GTM_BACKUP}" \
        || error "Vorhandene GT.M-Installation konnte nicht gesichert werden."

    echo "Alte GT.M-Installation gesichert:"
    echo "  ${GTM_BACKUP}"

fi

###############################################################################
# GT.M installieren
###############################################################################

echo
echo "Installiere GT.M aus:"
echo "  ${GTM_SOURCE}"
echo
echo "Ziel:"
echo "  ${GTM_DIR}"
echo

cd "${GTM_SOURCE}" \
    || error "Kann nicht nach ${GTM_SOURCE} wechseln."

chmod +x ./configure \
    || error "GT.M configure konnte nicht ausfhrbar gemacht werden."

echo
echo "Starte GT.M configure..."
echo

./configure \
    || error "GT.M-Konfiguration fehlgeschlagen."

echo
echo "GT.M configure erfolgreich."

###############################################################################
# GT.M prfen
###############################################################################

echo
echo "Prfe GT.M Installation..."

for gtmprog in mumps mupip lke
do

    if [ ! -x "${GTM_DIR}/${gtmprog}" ]; then
        error "GT.M ${gtmprog} wurde nicht gefunden: ${GTM_DIR}/${gtmprog}"
    fi

done

echo "GT.M mumps: Okay!"
echo "GT.M mupip: Okay!"
echo "GT.M lke:   Okay!"

###############################################################################
# Fremde Routinen in GT.M verhindern
###############################################################################

echo
echo "Prfe GT.M-Verzeichnis auf fremde MUMPS-Routinen..."

for routine in \
    _qserver.m \
    _QSERVER.m
do

    if [ -f "${GTM_DIR}/${routine}" ]; then

        error \
            "Fremde BRUNIE-/Cache-Routine gefunden: ${GTM_DIR}/${routine}"

    fi

done

echo "GT.M-Routinen: Okay!"

###############################################################################
# BRUNIE Verzeichnisse
###############################################################################

echo
echo -n "Anlegen der BRUNIE-Verzeichnisse... "

mkdir -p \
    "${BRUNIE_DIR}" \
    "${BRUNIE_DIR}/system" \
    "${BRUNIE_DIR}/log" \
    "${BRUNIE_DIR}/SYS" \
    "${BRUNIE_DIR}/routines" \
    || error "BRUNIE-Verzeichnisse konnten nicht angelegt werden."

echo "Okay!"

###############################################################################
# Rechte
###############################################################################

echo -n "Setze Rechte fr Datenbankerstellung... "

chown -R \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}" \
    || error "BRUNIE-Verzeichnis konnte nicht zugewiesen werden."

chmod 770 "${BRUNIE_DIR}"

find "${BRUNIE_DIR}" \
    -type d \
    -exec chmod 770 {} \;

echo "Okay!"

###############################################################################
# Systemskripte kopieren
###############################################################################

echo -n "Kopieren der Systemskripte... "

if [ -d "${INSTDIR}/system" ]; then

    cp -a "${INSTDIR}/system/." \
        "${BRUNIE_DIR}/system/" \
        || error "Systemskripte konnten nicht kopiert werden."

else

    error "Verzeichnis ${INSTDIR}/system wurde nicht gefunden."

fi

echo "Okay!"

###############################################################################
# CRLF entfernen
###############################################################################

find "${BRUNIE_DIR}/system" \
    -type f \
    -exec sed -i 's/\r$//' {} \; \
    >/dev/null 2>&1 || true

###############################################################################
# GT.M Link
###############################################################################

echo -n "Erstellen des GT.M Links... "

ln -sfn \
    "${BRUNIE_DIR}/system/gtm" \
    "/usr/local/bin/gtm" \
    || error "GT.M Link konnte nicht erstellt werden."

echo "Okay!"

###############################################################################
# Systemroutinen
###############################################################################

echo -n "Kopieren der Systemroutinen... "

if [ -d "${INSTDIR}/rout/SYS" ]; then

    cp -a "${INSTDIR}/rout/SYS/." \
        "${BRUNIE_DIR}/SYS/" \
        || error "SYS-Routinen konnten nicht kopiert werden."

fi

if [ -d "${INSTDIR}/rout/global" ]; then

    cp -a "${INSTDIR}/rout/global/." \
        "${BRUNIE_DIR}/routines/" \
        || error "BRUNIE-Routinen konnten nicht kopiert werden."

fi

if [ -d "${INSTDIR}/rout/log" ]; then

    cp -a "${INSTDIR}/rout/log/." \
        "${BRUNIE_DIR}/log/" \
        || error "Log-Routinen konnten nicht kopiert werden."

fi

echo "Okay!"

###############################################################################
# BRUNIE Environment
###############################################################################

echo
echo "Erstelle BRUNIE Environment..."

cat > "${BRUNIE_DIR}/system/brunie_env" <<EOF
export gtm_dist="${GTM_DIR}"
export gtmgbldir="${BRUNIE_DIR}/SYS.gld"
export gtmroutines="${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}"
export gtm_ztrap_form="adaptive"
export gtm_ztrap_new="TRUE"
export PATH="\${PATH}:${GTM_DIR}:${BRUNIE_DIR}/system"
EOF

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/brunie_env"

chmod 750 \
    "${BRUNIE_DIR}/system/brunie_env"

echo "BRUNIE Environment: Okay!"

###############################################################################
# makeuci prfen
###############################################################################

echo
echo "Prfe makeuci..."

if [ ! -f "${BRUNIE_DIR}/system/makeuci" ]; then
    error "makeuci wurde nicht gefunden: ${BRUNIE_DIR}/system/makeuci"
fi

sed -i 's/\r$//' \
    "${BRUNIE_DIR}/system/makeuci"

chmod 750 \
    "${BRUNIE_DIR}/system/makeuci"

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/makeuci"

echo "makeuci: Okay!"

###############################################################################
# Datenbanken
###############################################################################

echo
echo "Vorbereitung der Datenbanken, bitte warten..."

cd "${BRUNIE_DIR}" \
    || error "Kann nicht nach ${BRUNIE_DIR} wechseln."

###############################################################################
# UCI erzeugen
###############################################################################

for uci in $UCILIST
do

    echo
    echo "=================================================="
    echo "Erstelle UCI ${uci}"
    echo "=================================================="

    MAKEUCI_LOG="${BRUNIE_DIR}/log/makeuci_${uci}.log"

    rm -f "${MAKEUCI_LOG}" >/dev/null 2>&1 || true

    touch "${MAKEUCI_LOG}" \
        || error "Logdatei fr makeuci konnte nicht erstellt werden."

    chown \
        "${BRUNIE_USER}:${BRUNIE_GROUP}" \
        "${MAKEUCI_LOG}"

    chmod 660 "${MAKEUCI_LOG}"

    if runuser -u "${BRUNIE_USER}" -- /bin/bash -c \
        "cd '${BRUNIE_DIR}' && \
         source '${BRUNIE_DIR}/system/brunie_env' && \
         '${BRUNIE_DIR}/system/makeuci' '${uci}' force" \
        2>&1 | tee -a "${MAKEUCI_LOG}"
    then

        echo
        echo "UCI ${uci}: Okay!"

    else

        error \
            "UCI ${uci} konnte nicht angelegt werden. Log: ${MAKEUCI_LOG}"

    fi

    if [ ! -f "${BRUNIE_DIR}/${uci}.dat" ]; then
        error "Datenbankdatei fehlt: ${BRUNIE_DIR}/${uci}.dat"
    fi

    if [ ! -f "${BRUNIE_DIR}/${uci}.gld" ]; then
        error "Global Directory fehlt: ${BRUNIE_DIR}/${uci}.gld"
    fi

done

###############################################################################
# Rechte nach makeuci
###############################################################################

echo
echo -n "Zuweisen der Rechte... "

chown -R \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}" \
    || error "Eigentmer konnte nicht gesetzt werden."

chmod 770 "${BRUNIE_DIR}"

find "${BRUNIE_DIR}" \
    -type d \
    -exec chmod 770 {} \;

find "${BRUNIE_DIR}" \
    -type f \
    -exec chmod 660 {} \;

echo "Okay!"

###############################################################################
# GT.M Login-Skript
###############################################################################

echo
echo "Installiere BRUNIE GT.M Login..."

cat > "${BRUNIE_DIR}/system/gtmlogin" <<'EOF'
#!/bin/bash

###############################################################################
# BRUNIE / GT.M Login
#
# Aufruf:
#
#   gtm
#   gtm SYS
#   gtm LAG
#
###############################################################################

BRUNIE_DIR="/brunie"
GTM_DIR="/usr/gtm"
BRUNIE_USER="brunie"

###############################################################################
# Benutzer
###############################################################################

CURRENT_USER="$(id -un 2>/dev/null || true)"

if [ "${CURRENT_USER}" != "${BRUNIE_USER}" ]; then

    echo
    echo "FEHLER: GT.M Login muss als Benutzer '${BRUNIE_USER}' laufen."
    echo

    exit 1
fi

###############################################################################
# GT.M prfen
###############################################################################

if [ ! -x "${GTM_DIR}/mumps" ]; then

    echo
    echo "FEHLER: GT.M wurde nicht gefunden:"
    echo "  ${GTM_DIR}/mumps"
    echo

    exit 1
fi

###############################################################################
# UCI bernehmen
###############################################################################

UCI="${1:-}"

###############################################################################
# Keine UCI
###############################################################################

if [ -z "${UCI}" ]; then

    echo
    echo "=================================================="
    echo " BRUNIE / GT.M"
    echo "=================================================="
    echo
    echo "Aufruf:"
    echo
    echo "  gtm <UCI>"
    echo
    echo "Vorhandene UCIs:"
    echo

    cd "${BRUNIE_DIR}" || exit 1

    shopt -s nullglob

    UCI_FILES=( *.gld )

    if [ ${#UCI_FILES[@]} -eq 0 ]; then

        echo "  Keine UCIs gefunden."

    else

        for db in "${UCI_FILES[@]}"
        do

            echo "  ${db%.gld}"

        done

    fi

    shopt -u nullglob

    echo

    exit 0
fi

###############################################################################
# UCI normalisieren
###############################################################################

UCI="${UCI%.gld}"
UCI="${UCI%.dat}"
UCI="${UCI^^}"

###############################################################################
# UCI prfen
###############################################################################

if [ ! -f "${BRUNIE_DIR}/${UCI}.gld" ]; then

    echo
    echo "FEHLER: UCI '${UCI}' wurde nicht gefunden."
    echo
    echo "Gesucht:"
    echo "  ${BRUNIE_DIR}/${UCI}.gld"
    echo

    exit 1
fi

if [ ! -f "${BRUNIE_DIR}/${UCI}.dat" ]; then

    echo
    echo "FEHLER: Datenbank fr UCI '${UCI}' wurde nicht gefunden."
    echo
    echo "  ${BRUNIE_DIR}/${UCI}.dat"
    echo

    exit 1
fi

###############################################################################
# UCI-Routineverzeichnis
###############################################################################

mkdir -p "${BRUNIE_DIR}/${UCI}" 2>/dev/null || true

###############################################################################
# GT.M Umgebung
###############################################################################

export gtm_dist="${GTM_DIR}"

export gtmgbldir="${BRUNIE_DIR}/${UCI}.gld"

export gtmroutines="${BRUNIE_DIR}/${UCI} ${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}"

export gtm_ztrap_form="adaptive"
export gtm_ztrap_new="TRUE"

export PATH="${PATH}:${GTM_DIR}:${BRUNIE_DIR}/system"

###############################################################################
# BRUNIE Verzeichnis
###############################################################################

cd "${BRUNIE_DIR}" || {

    echo
    echo "FEHLER: Kann nicht nach ${BRUNIE_DIR} wechseln."
    echo

    exit 1
}

###############################################################################
# Anzeige
###############################################################################

echo
echo "=================================================="
echo " BRUNIE / GT.M"
echo "=================================================="
echo
echo " Benutzer : ${CURRENT_USER}"
echo " UCI      : ${UCI}"
echo " GT.M     : ${GTM_DIR}"
echo " Global   : ${gtmgbldir}"
echo
echo " Routinen :"
echo "   ${BRUNIE_DIR}/${UCI}"
echo "   ${BRUNIE_DIR}/SYS"
echo "   ${BRUNIE_DIR}/routines"
echo "   ${BRUNIE_DIR}/system"
echo "   ${GTM_DIR}"
echo
echo "=================================================="
echo

###############################################################################
# GT.M Direct Mode
###############################################################################

exec "${GTM_DIR}/mumps" -direct
EOF

sed -i 's/\r$//' \
    "${BRUNIE_DIR}/system/gtmlogin"

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/gtmlogin" \
    || error "Eigentmer von gtmlogin konnte nicht gesetzt werden."

chmod 750 \
    "${BRUNIE_DIR}/system/gtmlogin" \
    || error "gtmlogin konnte nicht ausfhrbar gemacht werden."

echo "gtmlogin: Okay!"

###############################################################################
# gtm Wrapper
###############################################################################

echo
echo "Installiere BRUNIE GT.M Wrapper..."

cat > "${BRUNIE_DIR}/system/gtm" <<'EOF'
#!/bin/bash

BRUNIE_DIR="/brunie"
BRUNIE_USER="brunie"

GTM_LOGIN="${BRUNIE_DIR}/system/gtmlogin"

###############################################################################
# gtmlogin prfen
###############################################################################

if [ ! -f "${GTM_LOGIN}" ]; then

    echo
    echo "FEHLER: GT.M Login-Skript wurde nicht gefunden:"
    echo "  ${GTM_LOGIN}"
    echo

    exit 1
fi

if [ ! -x "${GTM_LOGIN}" ]; then

    echo
    echo "FEHLER: GT.M Login-Skript ist nicht ausfhrbar:"
    echo "  ${GTM_LOGIN}"
    echo

    exit 1
fi

###############################################################################
# Bereits als brunie
###############################################################################

if [ "$(id -un)" = "${BRUNIE_USER}" ]; then

    exec "${GTM_LOGIN}" "$@"

fi

###############################################################################
# Root -> brunie
###############################################################################

if [ "$(id -u)" -eq 0 ]; then

    exec runuser -u "${BRUNIE_USER}" -- \
        "${GTM_LOGIN}" "$@"

fi

###############################################################################
# Fehler
###############################################################################

echo
echo "FEHLER: GT.M kann nur als root oder ${BRUNIE_USER} gestartet werden."
echo

exit 1
EOF

sed -i 's/\r$//' \
    "${BRUNIE_DIR}/system/gtm"

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/gtm"

chmod 750 \
    "${BRUNIE_DIR}/system/gtm"

echo "gtm: Okay!"

###############################################################################
# Startskript
###############################################################################

echo
echo "Installiere BRUNIE Startskript..."

cat > "${BRUNIE_DIR}/system/start" <<'EOF'
#!/bin/bash

BRUNIE_DIR="/brunie"
GTM_DIR="/usr/gtm"
BRUNIE_USER="brunie"

LOG_DIR="${BRUNIE_DIR}/log"
STARTUP_LOG="${LOG_DIR}/startup.log"

###############################################################################

if [ "$(id -un)" != "${BRUNIE_USER}" ]; then

    echo "FEHLER: start muss als ${BRUNIE_USER} laufen."
    exit 1

fi

###############################################################################

mkdir -p "${LOG_DIR}" || exit 1

echo -n "Gestartet: " >> "${STARTUP_LOG}"
date >> "${STARTUP_LOG}"

###############################################################################
# GT.M Umgebung
###############################################################################

export gtm_dist="${GTM_DIR}"

export gtmgbldir="${BRUNIE_DIR}/SYS.gld"

export gtmroutines="${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}"

export gtm_ztrap_form="adaptive"
export gtm_ztrap_new="TRUE"

export PATH="${PATH}:${GTM_DIR}:${BRUNIE_DIR}/system"

###############################################################################

cd "${BRUNIE_DIR}" || {

    echo "FEHLER: Kann nicht nach ${BRUNIE_DIR} wechseln."
    exit 1

}

###############################################################################
# GT.M prfen
###############################################################################

if [ ! -x "${GTM_DIR}/mumps" ]; then

    echo
    echo "FEHLER: GT.M mumps fehlt:"
    echo "  ${GTM_DIR}/mumps"
    echo

    exit 1
fi

###############################################################################
# Datenbanken prfen
###############################################################################

for db in \
    "${BRUNIE_DIR}/SYS.dat" \
    "${BRUNIE_DIR}/global.db"
do

    if [ ! -r "${db}" ]; then

        echo
        echo "FEHLER: Datenbank ist nicht lesbar:"
        echo "  ${db}"
        echo

        exit 1
    fi

    if [ ! -w "${db}" ]; then

        echo
        echo "FEHLER: Datenbank ist nicht schreibbar:"
        echo "  ${db}"
        echo

        exit 1
    fi

done

###############################################################################
# Datenbank Cleanup
###############################################################################

if [ -x "${BRUNIE_DIR}/system/stopdb" ]; then

    "${BRUNIE_DIR}/system/stopdb" || {

        echo "FEHLER: stopdb konnte nicht ausgefhrt werden."
        exit 1

    }

fi

###############################################################################

if [ -x "${BRUNIE_DIR}/system/cleanup" ]; then

    "${BRUNIE_DIR}/system/cleanup" || {

        echo "FEHLER: cleanup konnte nicht ausgefhrt werden."
        exit 1

    }

fi

###############################################################################
# BRUNIE starten
###############################################################################

echo "Starting BRUNIE-API"

"${GTM_DIR}/mumps" -run ^%QBOOT

RET=$?

if [ "${RET}" -ne 0 ]; then

    echo
    echo "FEHLER: %QBOOT konnte nicht gestartet werden."
    echo "Rckgabecode: ${RET}"
    echo

    exit "${RET}"

fi

echo "BRUNIE wurde gestartet."

exit 0
EOF

sed -i 's/\r$//' \
    "${BRUNIE_DIR}/system/start"

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/start"

chmod 750 \
    "${BRUNIE_DIR}/system/start"

###############################################################################
# Stopskript
###############################################################################

echo
echo "Installiere BRUNIE Stopskript..."

cat > "${BRUNIE_DIR}/system/stop" <<'EOF'
#!/bin/bash

BRUNIE_DIR="/brunie"
BRUNIE_USER="brunie"

LOG_DIR="${BRUNIE_DIR}/log"
SHUTDOWN_LOG="${LOG_DIR}/shutdown.log"

###############################################################################

if [ "$(id -un)" != "${BRUNIE_USER}" ]; then

    echo "FEHLER: stop muss als ${BRUNIE_USER} laufen."
    exit 1

fi

###############################################################################

mkdir -p "${LOG_DIR}" || exit 1

echo -n "Heruntergefahren: " >> "${SHUTDOWN_LOG}"
date >> "${SHUTDOWN_LOG}"

###############################################################################
# GT.M Umgebung
###############################################################################

export gtm_dist="/usr/gtm"

export gtmgbldir="${BRUNIE_DIR}/SYS.gld"

export gtmroutines="${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system /usr/gtm"

export gtm_ztrap_form="adaptive"
export gtm_ztrap_new="TRUE"

export PATH="${PATH}:/usr/gtm:${BRUNIE_DIR}/system"

###############################################################################
# Prozesse
###############################################################################

if [ -x "${BRUNIE_DIR}/system/stopproc" ]; then

    "${BRUNIE_DIR}/system/stopproc" || {

        echo "FEHLER: stopproc konnte nicht ausgefhrt werden."
        exit 1

    }

fi

###############################################################################
# Datenbanken
###############################################################################

if [ -x "${BRUNIE_DIR}/system/stopdb" ]; then

    "${BRUNIE_DIR}/system/stopdb" || {

        echo "FEHLER: stopdb konnte nicht ausgefhrt werden."
        exit 1

    }

fi

###############################################################################
# Cleanup
###############################################################################

if [ -x "${BRUNIE_DIR}/system/cleanup" ]; then

    "${BRUNIE_DIR}/system/cleanup" || {

        echo "FEHLER: cleanup konnte nicht ausgefhrt werden."
        exit 1

    }

fi

exit 0
EOF

sed -i 's/\r$//' \
    "${BRUNIE_DIR}/system/stop"

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/stop"

chmod 750 \
    "${BRUNIE_DIR}/system/stop"

###############################################################################
# Finale Rechte
###############################################################################

echo
echo "Setze finale BRUNIE-Rechte..."

chown -R \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}" \
    || error "Eigentmer konnte nicht gesetzt werden."

chmod 770 "${BRUNIE_DIR}"

find "${BRUNIE_DIR}" \
    -type d \
    -exec chmod 770 {} \;

find "${BRUNIE_DIR}" \
    -type f \
    -exec chmod 660 {} \;

for file in \
    "${BRUNIE_DIR}/system/gtmlogin" \
    "${BRUNIE_DIR}/system/gtm" \
    "${BRUNIE_DIR}/system/start" \
    "${BRUNIE_DIR}/system/stop" \
    "${BRUNIE_DIR}/system/brunie_env" \
    "${BRUNIE_DIR}/system/makeuci"
do

    if [ -f "${file}" ]; then
        chmod 750 "${file}"
    fi

done

echo "Rechte: Okay!"

###############################################################################
# SELinux
###############################################################################

echo
echo "Prfe SELinux..."

if command -v getenforce >/dev/null 2>&1; then

    SELINUX_STATUS="$(getenforce)"

    echo "  SELinux: ${SELINUX_STATUS}"

    if [ "${SELINUX_STATUS}" != "Disabled" ]; then

        if command -v semanage >/dev/null 2>&1; then

            echo "  Setze SELinux-Kontext fr BRUNIE..."

            semanage fcontext -a -t bin_t \
                "${BRUNIE_DIR}/system(/.*)?" \
                >/dev/null 2>&1 || \
            semanage fcontext -m -t bin_t \
                "${BRUNIE_DIR}/system(/.*)?" \
                >/dev/null 2>&1 || true

            restorecon -RF \
                "${BRUNIE_DIR}/system" \
                >/dev/null 2>&1 || true

        elif command -v restorecon >/dev/null 2>&1; then

            restorecon -RF \
                "${BRUNIE_DIR}/system" \
                >/dev/null 2>&1 || true

        fi

    fi

fi

###############################################################################
# Updates
###############################################################################

echo

if pause_yes "Installation der Updatedateien beginnen"; then

    echo
    echo "Installation der Updates..."

    if [ ! -d "${UPDATE}" ]; then

        echo
        echo "Update-Verzeichnis nicht gefunden:"
        echo "  ${UPDATE}"
        echo

    else

        cd "${UPDATE}" \
            || error "Kann nicht nach ${UPDATE} wechseln."

        UPDATE="$(pwd)"

        shopt -s nullglob

        #######################################################################
        # Routinen
        #######################################################################

        ROUTINE_FILES=(
            *.rs
            *.rS
            *.Rs
            *.RS
        )

        for rs in "${ROUTINE_FILES[@]}"
        do

            [ -f "${rs}" ] || continue

            uci="${rs%%.*}"
            uci="${uci^^}"

            if [ -f "${BRUNIE_DIR}/${uci}.dat" ]; then

                echo -n \
                    "  Routineninstallation ${rs} in ${uci}... "

                if runuser -u "${BRUNIE_USER}" -- /bin/bash -c \
    		"cd '${BRUNIE_DIR}' && \
     			export gtm_dist='${GTM_DIR}' && \
     			export gtmgbldir='${BRUNIE_DIR}/${uci}.gld' && \
     			export gtmroutines='${BRUNIE_DIR}/${uci} ${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}' && \
                      	'${GTM_DIR}/mumps' -run 'RR^%BRUNIE' '${UPDATE}/${rs}' '${uci}' </dev/null"
                 then
                    echo "Okay!"

                else

                    echo "FEHLER!"

                    error \
                        "Routine ${rs} konnte in UCI ${uci} nicht installiert werden."

                fi

            else

                echo \
                    "UCI ${uci} fr ${rs} nicht vorhanden - bersprungen."

            fi

        done

        #######################################################################
        # Globals
        #######################################################################

        GLOBAL_FILES=(
            *.gs
            *.gS
            *.Gs
            *.GS
        )

        for gs in "${GLOBAL_FILES[@]}"
        do

            [ -f "${gs}" ] || continue

            uci="${gs%%.*}"
            uci="${uci^^}"

            if [ -f "${BRUNIE_DIR}/${uci}.dat" ]; then

                echo -n \
                    "  Globalinstallation ${gs} in ${uci}... "

                if runuser -u "${BRUNIE_USER}" -- /bin/bash -c \
                    "cd '${BRUNIE_DIR}' && \
                     export gtm_dist='${GTM_DIR}' && \
                     export gtmgbldir='${BRUNIE_DIR}/${uci}.gld' && \
                     export gtmroutines='${BRUNIE_DIR}/${uci} ${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}' && \
                     '${GTM_DIR}/mumps' -run 'GR^%BRUNIE' '${UPDATE}/${gs}' '${uci}' </dev/null >/dev/null 2>&1"
                then

                    echo "Okay!"

                else

                    echo "FEHLER!"

                    error \
                        "Global ${gs} konnte in UCI ${uci} nicht installiert werden."

                fi

            else

                echo \
                    "UCI ${uci} fr ${gs} nicht vorhanden - bersprungen."

            fi

        done

        shopt -u nullglob

    fi

fi

###############################################################################
# Environment finalisieren
###############################################################################

echo
echo "Finalisiere BRUNIE Environment..."

cat > "${BRUNIE_DIR}/system/brunie_env" <<EOF
export gtm_dist="${GTM_DIR}"
export gtmgbldir="${BRUNIE_DIR}/SYS.gld"
export gtmroutines="${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}"
export gtm_ztrap_form="adaptive"
export gtm_ztrap_new="TRUE"
export PATH="\${PATH}:${GTM_DIR}:${BRUNIE_DIR}/system"
EOF

chown \
    "${BRUNIE_USER}:${BRUNIE_GROUP}" \
    "${BRUNIE_DIR}/system/brunie_env"

chmod 750 \
    "${BRUNIE_DIR}/system/brunie_env"

###############################################################################
# Datenbankzugriff
###############################################################################

echo
echo "Prfe Datenbankzugriff als ${BRUNIE_USER}..."

if ! runuser -u "${BRUNIE_USER}" -- /bin/bash -c '
    test -d /brunie &&
    test -r /brunie/SYS.dat &&
    test -w /brunie/SYS.dat &&
    test -r /brunie/global.db &&
    test -w /brunie/global.db &&
    test -r /brunie/SYS.gld
'
then

    echo
    ls -l \
        "${BRUNIE_DIR}/SYS.dat" \
        "${BRUNIE_DIR}/global.db" \
        "${BRUNIE_DIR}/SYS.gld" \
        2>/dev/null || true
    echo

    error \
        "Der Benutzer ${BRUNIE_USER} kann die GT.M-Datenbanken nicht vollstndig lesen/schreiben."

fi

echo "Datenbankzugriff: Okay!"

###############################################################################
# MUPIP Test
###############################################################################

echo
echo "Teste GT.M/MUPIP Datenbankzugriff..."

DBTEST_LOG="${BRUNIE_DIR}/log/dbtest.log"

rm -f "${DBTEST_LOG}" >/dev/null 2>&1 || true

if runuser -u "${BRUNIE_USER}" -- /bin/bash -c \
    "cd '${BRUNIE_DIR}' && \
     export gtm_dist='${GTM_DIR}' && \
     export gtmgbldir='${BRUNIE_DIR}/SYS.gld' && \
     export gtmroutines='${BRUNIE_DIR}/SYS ${BRUNIE_DIR}/routines ${BRUNIE_DIR}/system ${GTM_DIR}' && \
     '${GTM_DIR}/mupip' rundown -file '${BRUNIE_DIR}/SYS.dat'" \
    >"${DBTEST_LOG}" 2>&1
then

    echo "GT.M/MUPIP Datenbankzugriff: Okay!"

else

    echo
    echo "MUPIP-Diagnose:"
    cat "${DBTEST_LOG}"
    echo

    error \
        "GT.M/MUPIP kann SYS.dat als ${BRUNIE_USER} nicht ffnen."
fi

###############################################################################
# systemd Service
###############################################################################

if [[ "$API" == "J" || "$API" == "j" ]]; then

    echo
    echo "=================================================="
    echo " Installation BRUNIE systemd-Service"
    echo "=================================================="
    echo

    if [ ! -x "${BRUNIE_DIR}/system/start" ]; then
        error "BRUNIE Startskript fehlt oder ist nicht ausfhrbar."
    fi

    if [ ! -x "${BRUNIE_DIR}/system/stop" ]; then
        error "BRUNIE Stopskript fehlt oder ist nicht ausfhrbar."
    fi

    if [ ! -x "${BRUNIE_DIR}/system/gtmlogin" ]; then
        error "BRUNIE gtmlogin fehlt oder ist nicht ausfhrbar."
    fi

    if [ ! -x "${BRUNIE_DIR}/system/gtm" ]; then
        error "BRUNIE gtm fehlt oder ist nicht ausfhrbar."
    fi

    ###########################################################################
    # Alten Service stoppen
    ###########################################################################

    systemctl stop "${SERVICE_NAME}.service" \
        >/dev/null 2>&1 || true

    systemctl disable "${SERVICE_NAME}.service" \
        >/dev/null 2>&1 || true

    systemctl reset-failed "${SERVICE_NAME}.service" \
        >/dev/null 2>&1 || true

    rm -f "${SERVICE_FILE}"

    ###########################################################################
    # SELinux
    ###########################################################################

    if command -v restorecon >/dev/null 2>&1; then

        restorecon -RF \
            "${BRUNIE_DIR}/system" \
            >/dev/null 2>&1 || true

    fi

    ###########################################################################
    # Service erstellen
    #
    # WICHTIG:
    # KEIN EnvironmentFile
    #
    # KEINE Environment=gtmroutines=...
    #
    # Die GT.M Umgebung wird von start gesetzt.
    ###########################################################################

    echo "Erstelle systemd-Service..."

    cat > "${SERVICE_FILE}" <<EOF
[Unit]
Description=BRUNIE Datenbank/API
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot

User=${BRUNIE_USER}
Group=${BRUNIE_GROUP}

WorkingDirectory=${BRUNIE_DIR}

ExecStart=/bin/bash ${BRUNIE_DIR}/system/start
ExecStop=/bin/bash ${BRUNIE_DIR}/system/stop

RemainAfterExit=yes

TimeoutStartSec=300
TimeoutStopSec=300

[Install]
WantedBy=multi-user.target
EOF

    chmod 644 "${SERVICE_FILE}"

    ###########################################################################
    # systemd neu laden
    ###########################################################################

    echo "Lade systemd neu..."

    systemctl daemon-reload \
        || error "systemd daemon-reload fehlgeschlagen."

    ###########################################################################
    # Service prfen
    ###########################################################################

    echo "Prfe systemd Service-Konfiguration..."

    if ! systemd-analyze verify "${SERVICE_FILE}"; then

        error "systemd Service-Konfiguration ist fehlerhaft."

    fi

    ###########################################################################
    # Autostart
    ###########################################################################

    echo "Aktiviere BRUNIE-Autostart..."

    systemctl enable "${SERVICE_NAME}.service" \
        || error "BRUNIE konnte nicht aktiviert werden."

    systemctl reset-failed "${SERVICE_NAME}.service" \
        >/dev/null 2>&1 || true

    ###########################################################################
    # BRUNIE starten
    ###########################################################################

    echo
    echo "Starte BRUNIE..."
    echo

    if ! systemctl start "${SERVICE_NAME}.service"; then

        echo
        echo "=================================================="
        echo " FEHLER: BRUNIE konnte nicht gestartet werden."
        echo "=================================================="
        echo

        echo "STATUS:"
        systemctl status "${SERVICE_NAME}.service" \
            --no-pager \
            -l \
            || true

        echo
        echo "LOG:"
        journalctl -u "${SERVICE_NAME}.service" \
            -n 100 \
            --no-pager \
            -o cat \
            || true

        echo
        echo "DATEIRECHTE:"
        ls -ld \
            "${BRUNIE_DIR}" \
            "${BRUNIE_DIR}/system" \
            2>/dev/null || true

        ls -l \
            "${BRUNIE_DIR}/system/gtmlogin" \
            "${BRUNIE_DIR}/system/gtm" \
            "${BRUNIE_DIR}/system/start" \
            "${BRUNIE_DIR}/system/stop" \
            "${BRUNIE_DIR}/system/brunie_env" \
            2>/dev/null || true

        exit 1

    fi

    echo
    echo "=================================================="
    echo " BRUNIE wurde erfolgreich gestartet."
    echo "=================================================="
    echo

    systemctl status "${SERVICE_NAME}.service" \
        --no-pager \
        -l

fi

###############################################################################
# Abschluss
###############################################################################

cd "${INSTDIR}" || true

echo
echo "=================================================="
echo " BRUNIE Installation abgeschlossen"
echo "=================================================="
echo
echo " Installationsverzeichnis:"
echo "   ${BRUNIE_DIR}"
echo
echo " GT.M:"
echo "   ${GTM_DIR}"
echo
echo " Benutzer:"
echo "   ${BRUNIE_USER}"
echo
echo " Gruppe:"
echo "   ${BRUNIE_GROUP}"
echo
echo " BRUNIE-Routinen:"
echo "   ${BRUNIE_DIR}/routines"
echo
echo " GT.M Login:"
echo "   ${BRUNIE_DIR}/system/gtmlogin"
echo
echo " GT.M Wrapper:"
echo "   ${BRUNIE_DIR}/system/gtm"
echo

if [[ "$API" == "J" || "$API" == "j" ]]; then

    echo " systemd Service:"
    echo "   ${SERVICE_NAME}.service"
    echo
    echo " Status:"
    echo "   systemctl status ${SERVICE_NAME}"
    echo
    echo " Start:"
    echo "   systemctl start ${SERVICE_NAME}"
    echo
    echo " Stop:"
    echo "   systemctl stop ${SERVICE_NAME}"
    echo
    echo " Neustart:"
    echo "   systemctl restart ${SERVICE_NAME}"
    echo
    echo " Autostart:"
    echo "   systemctl enable ${SERVICE_NAME}"
    echo
    echo " Logs:"
    echo "   journalctl -u ${SERVICE_NAME} -f"

fi

echo
echo "=================================================="
echo