From 1fac3a89c087287f9ff29ed7050bbf3bed537709 Mon Sep 17 00:00:00 2001 From: Andre Knieschewski Date: Tue, 9 Dec 2025 11:34:31 +0100 Subject: [PATCH] Umstellung auf CLI --- _.mailrc | 7 + env/BI_ENV.sam | 96 ++++-- .../hisinone_bi_qisserver/modules_update.sh | 304 ++++++++++++++---- update/modules_update_cron.sh.sam | 34 +- 4 files changed, 352 insertions(+), 89 deletions(-) create mode 100644 _.mailrc diff --git a/_.mailrc b/_.mailrc new file mode 100644 index 0000000..57de221 --- /dev/null +++ b/_.mailrc @@ -0,0 +1,7 @@ +set v15-compat + +account superx_mailversand { + set from="SuperX APP " + set mta=smtp://<>:<>@<>:587 + set smtp-use-starttls +} \ No newline at end of file diff --git a/env/BI_ENV.sam b/env/BI_ENV.sam index 1187302..7f78f27 100644 --- a/env/BI_ENV.sam +++ b/env/BI_ENV.sam @@ -1,39 +1,81 @@ #!/bin/bash +# +# BI_ENV – gemeinsame Umgebung für BI-Update-/Upgrade-Skripte +# Dieses Skript wird von den BI-Skripten per ". /pfad/BI_ENV" eingebunden +# und setzt alle notwendigen Umgebungsvariablen. -#BI Environment (Muster für Tomcat9 unter Ubuntu) -WEBAPP=/var/lib/tomcat9/webapps/superx -export WEBAPP - -#Hier werden die zu verwendende Module aufgelistet. -#Nur den Modulnamen in Kleinbuchstaben -#export BI_UPGRADE_MODULES="kern cob sos sva kenn" - -#Module Liste: -#Hier werden die zu verwendende Module aufgelistet. -#Nur den Modulnamen:ULR in Kleinbuchstaben, z.B.: -#export BI_UPDATE_MODULES="sos:trans_pruefungen_1_sospos sos:trans_pruefungen_2 sos:trans_pruefungen_3 sos gang" - -#Beispielaufruf: -#export BI_UPDATE_MODULES="sos gang" - -LOGPFAD=/var/log/tomcat9 -export LOGPFAD -#Mailprogramm: -export MAILPROG=s-nail -#Der Anhang wird bei s-nail mit -a und bei mail mit -A definiert -export MAIL_APPEND="-a" -export LOGMAIL=superx@localhost -#RAM für Java: -MEM=2000M -export MEM +########## Java-Konfiguration ########## +# Java (hier: OpenJDK 17 unter Ubuntu) +export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 +export JRE_HOME="$JAVA_HOME" +export PATH="$JAVA_HOME/bin:$PATH" + +# Java-Optionen +export JAVA_OPTS="-Xmx1520M -Djava.awt.headless=true \ +-DHIS1_DATABASES_PROPERTIES=/home/superx/git/Memtext-Interna/devel_module/kern/tomcat_superx_git/dq/his1_databases_eduetl_only.properties \ +--add-opens java.naming/com.sun.jndi.ldap=ALL-UNNAMED \ +--add-opens java.base/sun.nio.ch=ALL-UNNAMED \ +--add-opens java.base/sun.net.www.protocol.jar=ALL-UNNAMED \ +--add-opens java.base/javax.crypto=ALL-UNNAMED \ +--add-opens java.base/java.util.stream=ALL-UNNAMED \ +--add-opens java.base/java.util=ALL-UNNAMED \ +--add-opens java.base/java.net=ALL-UNNAMED \ +--add-opens java.base/java.io=ALL-UNNAMED \ +--add-opens java.base/java.lang=ALL-UNNAMED \ +--add-opens=java.base/java.math=ALL-UNNAMED" + +########## SuperX / Tomcat-Pfade ########## + +# Basis-Webapp-Verzeichnis von SuperX +export WEBAPP=/var/lib/tomcat10/webapps/superx + +# Konfigurationsverzeichnis für BI / edustore +export SUPERX_DIR="$WEBAPP/WEB-INF/conf/edustore" + +########## Modul-Listen ########## +# Durch Leerzeichen getrennt, nur Kleinbuchstaben. +# export BI_UPGRADE_MODULES="kern cob sos sva kenn" +export BI_UPGRADE_MODULES="kenn" +export BI_UPDATE_MODULES="kenn" + +########## Logging / Mail ########## + +# Logverzeichnis (für Master- und Modul-Logs) +export LOGPFAD="$WEBAPP/WEB-INF/logs" + +# Standard-Mailadressen für den Update-/Fehlerbericht +# - LOGMAIL: Empfänger für reguläre Erfolgs- und Statusmeldungen +# - ERRORMAIL: Empfänger für Fehlermeldungen +# +# Falls ausschließlich Fehlermeldungen verschickt werden sollen, +# LOGMAIL einfach leer lassen: +# export LOGMAIL="" +# +# Mehrfachempfänger können über Leerzeichen angegeben werden: +# export ERRORMAIL="admin@hs.de support@hs.de" +# +# Hinweis: +# LOGMAIL überschreibt ERRORMAIL nicht, sondern ergänzt: +# - Erfolgsfall → Mail an LOGMAIL (nur, wenn gesetzt) +# - Fehlerfall → Mail an ERRORMAIL, falls vorhanden, sonst an LOGMAIL + + +# Mailprogramm (s-nail mit vorkonfiguriertem Account 'superx_mailversand') +export MAILPROG='s-nail --account=superx_mailversand -S ttycharset=utf-8 -S sendcharset=utf-8' + +# Betreff-Bausteine export MAIL_BETREFF_UPDATE="BI Job Update" export MAIL_BETREFF_UPGRADE="BI Job Upgrade" export MAIL_BETREFF_SUFFIX_ERFOLGREICH=" - Erfolgreich" export MAIL_BETREFF_SUFFIX_FEHLER=" - Fehler" -#Speziell für HISinOne-BI: +########## Zusatz-Pfade ########## +# Optional: zusätzlicher bin-Pfad relativ zum BI-Skript (falls dort Tools liegen) +PATH="$PATH:../bin" +export PATH +#Speziell für HISinOne-BI: QISSERVER_PFAD=$WEBAPP/../qisserver QISSERVER_LIB_PFAD=$QISSERVER_PFAD/WEB-INF/lib QIS_CLASSPATH="$WEBAPP/WEB-INF/lib_ext/servlet-api.jar:$QISSERVER_PFAD/WEB-INF/classes" ; for i in `ls $QISSERVER_LIB_PFAD/*.jar` ; do QIS_CLASSPATH=$QIS_CLASSPATH:$i ; done diff --git a/update/hisinone_bi_qisserver/modules_update.sh b/update/hisinone_bi_qisserver/modules_update.sh index 8e886e9..81b2d11 100755 --- a/update/hisinone_bi_qisserver/modules_update.sh +++ b/update/hisinone_bi_qisserver/modules_update.sh @@ -1,67 +1,263 @@ #!/bin/bash -#Variablen und Umgebung setzen: -MASTERLOG=$LOGPFAD/bi_update.log +# +# modules_update.sh +# +# Führt BI-Updatejobs für alle in BI_UPDATE_MODULES definierten Module aus. +# Erwartet, dass vorher BI_ENV gesourced wurde (JAVA_HOME, WEBAPP, LOGPFAD, +# BI_UPDATE_MODULES, MAILPROG, LOGMAIL, ERRORMAIL, MAIL_BETREFF_*, +# sowie die Mapping-Tabelle SYSTEMINFO_MAP in der BI_ENV). +# +# Die wichtigsten Variablen werden im Startcheck geprüft. Fehlt etwas, +# wird – sofern konfiguriert – eine Fehlermail verschickt und das Skript beendet. -#erzeuge Logs Verzeichnis wenn es noch nicht existiert: -mkdir -p $LOGPFAD +set -u -ERROR_FLAG=0 -ERROR_LOG="" +####################################### +# Modul → systeminfo_id Mapping +####################################### +declare -A SYSTEMINFO_MAP=( + [gang]=121 + [cob]=10 + [zul]=130 + [man]=200 + [sos]=7 + [erfolg]=120 + [rpta]=330 + [etl]=270 + [kern]=9 + [kenn]=109 + [ivs]=140 + [bau]=4 + [fin]=3 + [lm]=300 + [sva]=6 +) -executeUpdate() -{ - JOB=$1 - LOGPFAD=$2 - MYMASTERLOG=$3 - MODUL=$JOB - MODUL_UPPER=`echo $MODUL | tr [a-z] [A-Z]` - JOBLOG=$LOGPFAD/"$JOB"_update.log - echo "" >>$MYMASTERLOG - echo "--- Start Update für: $JOB ---" >>$MYMASTERLOG - date >>$MYMASTERLOG - echo java -Xmx${MEM} -cp "...CLASSPATH" -Dfile.encoding=UTF-8 de.his.edustore.modules.WebFrontendForModuleUpdate $JOB true '$SUPERX_DIR='$WEBAPP'/WEB-INF/conf/edustore $'$MODUL_UPPER'_LOAD_PFAD='$WEBAPP'/WEB-INF/conf/edustore/db/module/'$MODUL'/rohdaten $'$MODUL_UPPER'_PFAD='$WEBAPP'/WEB-INF/conf/edustore/db/module/'$MODUL >$JOBLOG 2>&1 - java -Xmx${MEM} -cp "$QIS_CLASSPATH" -Dfile.encoding=UTF-8 de.his.edustore.modules.WebFrontendForModuleUpdate $JOB true '$SUPERX_DIR='$WEBAPP'/WEB-INF/conf/edustore $'$MODUL_UPPER'_LOAD_PFAD='$WEBAPP'/WEB-INF/conf/edustore/db/module/'$MODUL'/rohdaten $'$MODUL_UPPER'_PFAD='$WEBAPP'/WEB-INF/conf/edustore/db/module/'$MODUL >>$JOBLOG 2>&1 - - RETURN_CODE=$? - echo "Returncode von dem Job des Moduls $JOB ist: $RETURN_CODE" >>$MYMASTERLOG - date >>$MYMASTERLOG - if [ $RETURN_CODE -eq 0 ] -then - echo "--- Ende Update von $JOB: erfolgreich ---" >>$MYMASTERLOG + +########## Hilfsfunktionen für Mailversand ########## + +# Log-Mail (Erfolgsfall) – nur, wenn MAILPROG und LOGMAIL gesetzt sind +send_log_mail() { + local subject="$1" + local body_file="$2" + + if [ -n "${MAILPROG:-}" ] && [ -n "${LOGMAIL:-}" ]; then + $MAILPROG -s "$subject" "$LOGMAIL" <"$body_file" + fi +} + +# Fehlermail – bevorzugt an ERRORMAIL, sonst an LOGMAIL +# Zusätzliche Parameter (ab $3) werden direkt an MAILPROG weitergereicht (z.B. -a ) +send_error_mail() { + local subject="$1" + local body_file="$2" + shift 2 + + local recipient="" + if [ -n "${ERRORMAIL:-}" ]; then + recipient="$ERRORMAIL" + elif [ -n "${LOGMAIL:-}" ]; then + recipient="$LOGMAIL" + fi + + if [ -n "${MAILPROG:-}" ] && [ -n "$recipient" ]; then + $MAILPROG -s "$subject" "$@" "$recipient" <"$body_file" + fi +} + +########## Startcheck – minimale Grundprüfung ########## + +startcheck_var() { + local varname="$1" + local value="${!varname:-}" + + if [ -z "$value" ]; then + # Startcheck-Fehler in temporärer Logdatei protokollieren + local tmpfile="/tmp/bi_update_startcheck_${varname}.log" + { + echo "Startcheck: Variable $varname fehlt oder ist leer. (Quelle: BI_ENV)" + echo "Hinweis: Der Wert wird normalerweise in der BI_ENV gepflegt." + date + } >"$tmpfile" + + # Fehlermail (optional) schicken + send_error_mail "BI Update Startcheck Fehler: $varname fehlt" "$tmpfile" + + echo "FEHLER: Startcheck gescheitert – Variable $varname fehlt oder ist leer." + echo "Hinweis: Der Wert wird normalerweise in der BI_ENV gepflegt." + exit 1 + fi +} + +# Startcheck: Pflichtvariablen aus BI_ENV +startcheck_var "WEBAPP" +startcheck_var "LOGPFAD" +startcheck_var "BI_UPDATE_MODULES" + +########## DOQUERY prüfen (über $PATH) ########## +# DOQUERY wird nur verwendet, wenn es im PATH gefunden wird. +# Ist es nicht vorhanden, wird die DB-Protokollierung vollständig übersprungen. + +DOQUERY_AVAILABLE=0 +DOQUERY_CMD="" + +if command -v DOQUERY >/dev/null 2>&1; then + DOQUERY_AVAILABLE=1 + DOQUERY_CMD="DOQUERY" else - echo ">>>> Achtung: Das Update des Modules $JOB wurde mit einem Fehler beendet! <<<<" >> $MYMASTERLOG - echo "--- Ende des Updates vom Modul $JOB mit Fehler ---" >>$MYMASTERLOG - ERROR_FLAG=1 + echo "Hinweis: DOQUERY nicht im PATH gefunden – DB-Protokollierung deaktiviert." fi - ERROR_LOG+=" $MAIL_APPEND $JOBLOG" - echo "" >>$MYMASTERLOG + +########## Logging vorbereiten ########## + +MASTERLOG="$LOGPFAD/bi_update.log" +mkdir -p "$LOGPFAD" + +ERROR_FLAG=0 +ERROR_LOG_FILES=() # Liste der Modul-Logfiles mit Fehlern + +########## Funktion: Modul-Update ausführen ########## + +run_module_update() { + local module="$1" + local log_dir="$2" + local masterlog="$3" + + local module_upper + module_upper=$(echo "$module" | tr '[:lower:]' '[:upper:]') + local joblog="$log_dir/${module}_update.log" + + local start_ts + local end_ts + start_ts=$(date '+%Y-%m-%d %H:%M:%S%z') + + { + echo + echo "--- Start Update für Modul: $module ($module_upper) ---" + date + } >>"$masterlog" + + ########## DB-Protokollierung: Start ########## + if [ $DOQUERY_AVAILABLE -eq 1 ]; then + # Standardwert 0, falls Mapping nicht vorhanden ist + local sys_id="0" + # Prüfen, ob SYSTEMINFO_MAP existiert (kommt aus BI_ENV) + if declare -p SYSTEMINFO_MAP >/dev/null 2>&1; then + sys_id="${SYSTEMINFO_MAP[$module]:-0}" + fi + + $DOQUERY_CMD " + INSERT INTO update_prot (systeminfo_id, update_entity, update_id, update_time) + VALUES ($sys_id, '$module', -10000, '$start_ts'); + " >>"$masterlog" 2>&1 || echo "WARNUNG: DB-Insert für Modul $module fehlgeschlagen." >>"$masterlog" + fi + ########## DB-Protokollierung: Start ENDE ########## + + # Java-Job ausführen, Fehler kontrolliert auswerten + local rc=0 + if ! java ${JAVA_OPTS:-} \ + -classpath "$WEBAPP/WEB-INF/classes:$WEBAPP/WEB-INF/lib/*:$WEBAPP/WEB-INF/lib_ext/*" \ + de.superx.bin.ComponentAdminCLI -e "$module" \ + >>"$joblog" 2>&1 + then + rc=$? + fi + + end_ts=$(date '+%Y-%m-%d %H:%M:%S%z') + + { + echo "Returncode des Moduls $module: $rc" + date + } >>"$masterlog" + + if [ "$rc" -eq 0 ]; then + echo "--- Ende Update von $module: ERFOLGREICH ---" >>"$masterlog" + + ########## DB-Protokollierung: Erfolg ########## + if [ $DOQUERY_AVAILABLE -eq 1 ]; then + $DOQUERY_CMD " + UPDATE update_prot + SET updated_at = '$end_ts', + update_id = -10000 + WHERE tid = ( + SELECT tid + FROM update_prot + WHERE update_entity = '$module' + AND updated_at IS NULL + ORDER BY tid DESC + LIMIT 1 + ); + " >>"$masterlog" 2>&1 || echo "WARNUNG: DB-Update (Erfolg) für Modul $module fehlgeschlagen." >>"$masterlog" + fi + ########## DB-Protokollierung: Erfolg ENDE ########## + + else + echo ">>>> ACHTUNG: Update des Moduls $module wurde mit einem FEHLER beendet! <<<<" >>"$masterlog" + echo "--- Ende Update von $module: FEHLER ---" >>"$masterlog" + ERROR_FLAG=1 + ERROR_LOG_FILES+=("$joblog") + + ########## DB-Protokollierung: Fehler ########## + if [ $DOQUERY_AVAILABLE -eq 1 ]; then + $DOQUERY_CMD " + UPDATE update_prot + SET updated_at = '$end_ts', + update_id = -10001 + WHERE tid = ( + SELECT tid + FROM update_prot + WHERE update_entity = '$module' + AND updated_at IS NULL + ORDER BY tid DESC + LIMIT 1 + ); + " >>"$masterlog" 2>&1 || echo "WARNUNG: DB-Update (Fehler) für Modul $module fehlgeschlagen." >>"$masterlog" + fi + ########## DB-Protokollierung: Fehler ENDE ########## + fi + + echo >>"$masterlog" } -# Schleife über Updates: +########## Schleife über alle Module ########## + +{ + echo "Starte BI-Updates für folgende Module: $BI_UPDATE_MODULES" + date + echo "######################################" + echo +} >"$MASTERLOG" -echo "Starte BI-Jobs für die Module: $BI_UPDATE_MODULES" >$MASTERLOG -date >>$MASTERLOG -echo -e "######################################\n\n" >>$MASTERLOG -for JOB_SINGLE in ${BI_UPDATE_MODULES[@]} ; do -executeUpdate $JOB_SINGLE $LOGPFAD $MASTERLOG +for module in $BI_UPDATE_MODULES; do + run_module_update "$module" "$LOGPFAD" "$MASTERLOG" done -echo -e "\n\n######################################" >>$MASTERLOG -echo -e "-- Ende BI update `date`\n\n" >>$MASTERLOG - - -# Mailversand -if [ $ERROR_FLAG -eq 0 ] -then - if [ "$MAILPROG" != "" ] - then - $MAILPROG -s "$MAIL_BETREFF_UPDATE$MAIL_BETREFF_SUFFIX_ERFOLGREICH" $LOGMAIL <$MYMASTERLOG - fi - + +{ + echo + echo "######################################" + echo "-- Ende BI Update $(date)" + echo +} >>"$MASTERLOG" + +########## Mailversand (optional) ########## + +if [ "$ERROR_FLAG" -eq 0 ]; then + # Erfolgreich → Log-Mail an LOGMAIL (falls konfiguriert) + send_log_mail \ + "${MAIL_BETREFF_UPDATE:-BI Job Update}${MAIL_BETREFF_SUFFIX_ERFOLGREICH:-}" \ + "$MASTERLOG" else - if [ "$MAILPROG" != "" ] - then - echo "Sende Logmail an $LOGMAIL" - $MAILPROG -s "$MAIL_BETREFF_UPDATE$MAIL_BETREFF_SUFFIX_FEHLER" $ERROR_LOG $LOGMAIL <$MYMASTERLOG - fi + echo "Sende Fehler-Logmail (falls konfiguriert)." + + # Attachments für fehlerhafte Modul-Logs vorbereiten (s-nail: -a DATEI) + attach_args=() + for f in "${ERROR_LOG_FILES[@]}"; do + [ -f "$f" ] && attach_args+=("-a" "$f") + done + # Fehlerfall → Fehlermail an ERRORMAIL (oder Fallback LOGMAIL), mit Attachments + send_error_mail \ + "${MAIL_BETREFF_UPDATE:-BI Job Update}${MAIL_BETREFF_SUFFIX_FEHLER:-}" \ + "$MASTERLOG" \ + "${attach_args[@]}" fi diff --git a/update/modules_update_cron.sh.sam b/update/modules_update_cron.sh.sam index 6286a20..7961c42 100755 --- a/update/modules_update_cron.sh.sam +++ b/update/modules_update_cron.sh.sam @@ -1,10 +1,28 @@ #!/bin/bash -#Bitte umbenennen nach modules_update_cron.sh -#Und den Pfad /var/lib/tomcat9... anpassen: -#in crontab: -# Werktäglicher BI-Update um 18 Uhr -#0 18 * * 1-5 /var/lib/tomcat9/BI_Maintenance/update/modules_update_cron.sh >/var/lib/tomcat9/BI_Maintenance/update/hisinone_bi_qisserver/modules_update.log 2>&1 -. /var/lib/tomcat9/BI_Maintenance/env/BI_ENV -#bei Nutzung H1-Qisserver: -#/var/lib/tomcat9/BI_Maintenance/update/hisinone_bi_qisserver/modules_update.sh >/var/lib/tomcat9/BI_Maintenance/update/hisinone_bi_qisserver/modules_update.log 2>&1 +# +# modules_update_cron.sh +# +# Wrapper-Skript für den Cronjob. +# Wird typischerweise aus /etc/crontab oder via "crontab -e" aufgerufen. +# +# Beispiel (werktags 18:00 Uhr): +# 0 18 * * 1-5 /var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/update/hisinone_bi_qisserver/modules_update_cron.sh +set -e + +ENV_FILE="/var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/env/BI_ENV" +MAIN_SCRIPT="/var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/update/hisinone_bi_qisserver/modules_update.sh" +CRONLOG="/var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/update/hisinone_bi_qisserver/modules_update.log" + +# Prüfen, ob ENV vorhanden ist +if [ ! -f "$ENV_FILE" ]; then + echo "FEHLER: ENV-Datei nicht gefunden: $ENV_FILE" >&2 + exit 1 +fi + +# Umgebung laden +# shellcheck source=/dev/null +. "$ENV_FILE" + +# Hauptskript ausführen, Ausgabe ins Cron-Log +"$MAIN_SCRIPT" >>"$CRONLOG" 2>&1