#!/bin/bash
#
# BRUNIE
#
# UCI anlegen
#
# Angepasst fr:
#   - CentOS 10
#   - openSUSE Leap 16
#   - GT.M 7.1
#
# WICHTIG:
# MUPIP CREATE bekommt KEIN -FILE.
# Der Dateiname wird ausschlielich ber das Global Directory
# festgelegt.
#

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

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

BRUNIE_USER="brunie"
BRUNIE_GROUP="brunie"

###############################################################################
# Aktuelles Verzeichnis merken
###############################################################################

CURDIR="$(pwd)"

###############################################################################
# Parameter prfen
###############################################################################

if [ $# -lt 1 ] || [ $# -gt 2 ]; then

    echo
    echo "  Verwendung:"
    echo "    $0 <UCI> [force]"
    echo

    exit 1

fi

UCI="$1"
FORCE="${2:-}"

###############################################################################
# UCI-Namen prfen
###############################################################################

if [[ ! "${UCI}" =~ ^[A-Za-z0-9_-]+$ ]]; then

    echo
    echo "  FEHLER: Ungltiger UCI-Name: ${UCI}"
    echo

    exit 1

fi

###############################################################################
# BRUNIE-Verzeichnis prfen
###############################################################################

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

    echo
    echo "  FEHLER: BRUNIE-Verzeichnis wurde nicht gefunden:"
    echo "    ${BRUNIE_DIR}"
    echo

    exit 1

fi

cd "${BRUNIE_DIR}" || {

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

    exit 1

}

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

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

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

    cd "${CURDIR}"
    exit 1

fi

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

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

    cd "${CURDIR}"
    exit 1

fi

###############################################################################
# Dateien
###############################################################################

UCI_DIR="${BRUNIE_DIR}/${UCI}"
UCI_GLD="${BRUNIE_DIR}/${UCI}.gld"
UCI_DAT="${BRUNIE_DIR}/${UCI}.dat"
UCI_TMP="${BRUNIE_DIR}/${UCI}.tmp"

GLOBAL_DAT="${BRUNIE_DIR}/global.db"

###############################################################################
# Ausgabe
###############################################################################

echo
echo "  Benutzer : $(id -un)"
echo "  GT.M     : ${GTM_DIR}"
echo "  BRUNIE   : ${BRUNIE_DIR}"
echo "  UCI      : ${UCI}"
echo

###############################################################################
# FORCE prfen
###############################################################################

if [ "${FORCE}" = "force" ]; then

    echo "  FORCE-Modus aktiviert."
    echo

else

    if [ -d "${UCI_DIR}" ] ||
       [ -f "${UCI_GLD}" ] ||
       [ -f "${UCI_DAT}" ] ||
       [ -f "${UCI_TMP}" ]; then

        echo
        echo "  FEHLER: UCI ${UCI} existiert bereits."
        echo
        echo "  Verwende:"
        echo
        echo "    $0 ${UCI} force"
        echo

        cd "${CURDIR}"
        exit 1

    fi

fi

###############################################################################
# UCI-Verzeichnis
###############################################################################

echo -n "  - ${UCI} wird angelegt... "

if ! mkdir -p "${UCI_DIR}"; then

    echo
    echo "  FEHLER: Verzeichnis ${UCI_DIR} konnte nicht angelegt werden."
    echo

    cd "${CURDIR}"
    exit 1

fi

echo "Okay!"

###############################################################################
# Rechte UCI-Verzeichnis
###############################################################################

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

    chown "${BRUNIE_USER}:${BRUNIE_GROUP}" \
        "${UCI_DIR}" \
        >/dev/null 2>&1 || true

    chmod 770 \
        "${UCI_DIR}" \
        >/dev/null 2>&1 || true

fi

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

export gtm_dist="${GTM_DIR}"

# WICHTIG:
# Explizit auf die .gld-Datei zeigen.
export gtmgbldir="${UCI_GLD}"

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

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

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

###############################################################################
# Vorhandene Global Directory Datei entfernen
#
# Im FORCE-Modus wird das Global Directory neu erzeugt.
###############################################################################

if [ "${FORCE}" = "force" ]; then

    if [ -f "${UCI_GLD}" ]; then

        echo
        echo "  Entferne vorhandenes Global Directory:"
        echo "    ${UCI_GLD}"

        rm -f "${UCI_GLD}" || {

            echo
            echo "  FEHLER: ${UCI_GLD} konnte nicht entfernt werden."
            echo

            cd "${CURDIR}"
            exit 1

        }

    fi

fi

###############################################################################
# Global Directory erzeugen
###############################################################################

echo
echo "  - Erstelle Global Directory:"
echo "    ${UCI_GLD}"
echo

if ! "${GTM_DIR}/mumps" -direct >/tmp/brunie_gde_${UCI}_$$.log 2>&1 <<GDESET
DO ^GDE
Add -Region GLOBAL -record=1020 -key=255 -dynamic=GLOBAL
Add -Segment GLOBAL -block=2048 -file=${GLOBAL_DAT}
Add -Name %* -Region=GLOBAL
Add -Region TEMP -record=1020 -key=255 -dynamic=TEMP
Add -Segment TEMP -block=2048 -file=${UCI_TMP}
Add -Name TEMP* -Region=TEMP
Add -Name QTEMP* -Region=TEMP
Add -Name QTP* -Region=TEMP
Add -Name SA -Region=TEMP
Change -Segment DEFAULT -block=2048 -file=${UCI_DAT}
Change -Region DEFAULT -record=1020 -key=255
Change -S DEFAULT -L=40960
Change -S TEMP -L=40960
Change -S GLOBAL -L=40960
Exit
GDESET
then

    echo
    echo "  FEHLER: Global Directory fr ${UCI} konnte nicht erstellt werden."
    echo
    cat "/tmp/brunie_gde_${UCI}_$$.log"
    echo

    rm -f "/tmp/brunie_gde_${UCI}_$$.log"

    cd "${CURDIR}"
    exit 1

fi

rm -f "/tmp/brunie_gde_${UCI}_$$.log"

echo
echo "  Global Directory: Okay!"

###############################################################################
# Global Directory prfen
###############################################################################

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

    echo
    echo "  FEHLER: Global Directory wurde nicht erzeugt:"
    echo "    ${UCI_GLD}"
    echo

    cd "${CURDIR}"
    exit 1

fi

###############################################################################
# Datenbanken erzeugen
#
# WICHTIG:
#
# MUPIP CREATE untersttzt:
#
#   mupip create
#   mupip create -region=REGION
#
# aber NICHT:
#
#   mupip create -file=...
#
# Die Dateinamen kommen aus dem Global Directory.
###############################################################################

echo
echo "  - Erstelle Datenbankdateien..."

###############################################################################
# GLOBAL / global.db
###############################################################################

if [ -f "${GLOBAL_DAT}" ]; then

    echo "    global.db existiert bereits."
    echo "    Die vorhandene globale Datenbank wird nicht berschrieben."

else

    echo "    Erstelle global.db..."

    if ! "${GTM_DIR}/mupip" create -region=GLOBAL; then

        echo
        echo "  FEHLER: globale Datenbank konnte nicht erstellt werden."
        echo

        cd "${CURDIR}"
        exit 1

    fi

fi

###############################################################################
# DEFAULT / UCI.dat
###############################################################################

if [ -f "${UCI_DAT}" ]; then

    if [ "${FORCE}" = "force" ]; then

        echo "    ${UCI}.dat existiert bereits."
        echo "    Vorhandene Datenbank wird nicht berschrieben."

    else

        echo "    ${UCI}.dat existiert bereits."

    fi

else

    echo "    Erstelle ${UCI}.dat..."

    if ! "${GTM_DIR}/mupip" create -region=DEFAULT; then

        echo
        echo "  FEHLER: Datenbank ${UCI}.dat konnte nicht erstellt werden."
        echo

        cd "${CURDIR}"
        exit 1

    fi

fi

###############################################################################
# TEMP / UCI.tmp
###############################################################################

if [ -f "${UCI_TMP}" ]; then

    echo "    ${UCI}.tmp existiert bereits."
    echo "    Vorhandene TEMP-Datenbank wird nicht berschrieben."

else

    echo "    Erstelle ${UCI}.tmp..."

    if ! "${GTM_DIR}/mupip" create -region=TEMP; then

        echo
        echo "  FEHLER: TEMP-Datenbank ${UCI}.tmp konnte nicht erstellt werden."
        echo

        cd "${CURDIR}"
        exit 1

    fi

fi

###############################################################################
# Datenbankdateien prfen
###############################################################################

echo
echo "  - Prfe Datenbankdateien..."

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

    echo
    echo "  FEHLER: ${UCI_DAT} wurde nicht erzeugt."
    echo

    cd "${CURDIR}"
    exit 1

fi

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

    echo
    echo "  FEHLER: ${UCI_TMP} wurde nicht erzeugt."
    echo

    cd "${CURDIR}"
    exit 1

fi

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

    echo
    echo "  FEHLER: ${GLOBAL_DAT} wurde nicht erzeugt."
    echo

    cd "${CURDIR}"
    exit 1

fi

echo "    ${UCI}.dat : Okay!"
echo "    ${UCI}.tmp : Okay!"
echo "    global.db : Okay!"

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

echo
echo "  - Setze Eigentmer und Rechte..."

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

    chown "${BRUNIE_USER}:${BRUNIE_GROUP}" \
        "${UCI_GLD}" \
        "${UCI_DAT}" \
        "${UCI_TMP}" \
        "${GLOBAL_DAT}" \
        >/dev/null 2>&1 || true

    chown -R "${BRUNIE_USER}:${BRUNIE_GROUP}" \
        "${UCI_DIR}" \
        >/dev/null 2>&1 || true

    chmod 660 \
        "${UCI_GLD}" \
        "${UCI_DAT}" \
        "${UCI_TMP}" \
        "${GLOBAL_DAT}" \
        >/dev/null 2>&1 || true

    chmod 770 \
        "${UCI_DIR}" \
        >/dev/null 2>&1 || true

fi

###############################################################################
# Fertig
###############################################################################

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

cd "${CURDIR}" || exit 1

exit 0