#!/bin/bash # # 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. set -u ####################################### # 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 ) ########## 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 "Hinweis: DOQUERY nicht im PATH gefunden – DB-Protokollierung deaktiviert." fi ########## 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 alle Module ########## { echo "Starte BI-Updates für folgende Module: $BI_UPDATE_MODULES" date echo "######################################" echo } >"$MASTERLOG" for module in $BI_UPDATE_MODULES; do run_module_update "$module" "$LOGPFAD" "$MASTERLOG" done { 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 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