3 changed files with 386 additions and 87 deletions
@ -1,96 +1,328 @@
@@ -1,96 +1,328 @@
|
||||
#!/bin/bash |
||||
# |
||||
# modules_upgrade.sh |
||||
# |
||||
# Führt BI-Upgrades für alle in BI_UPGRADE_MODULES definierten Module aus. |
||||
# Erwartet, dass vorher BI_ENV gesourced wurde (JAVA_HOME, WEBAPP, LOGPFAD, |
||||
# BI_UPGRADE_MODULES, MAILPROG, LOGMAIL, ERRORMAIL, MAIL_BETREFF_*). |
||||
# |
||||
# Dieses Skript protokolliert die Läufe zusätzlich in der Tabelle update_prot |
||||
# (über DOQUERY, falls im PATH verfügbar) und kann Logdateien optional per Mail |
||||
# anhängen – nur im Fehlerfall oder immer (gesteuert über MAIL_ATTACH_LOGS_MODE). |
||||
|
||||
#BI Upgrade Script (Muster, siehe ../../env/BI_ENV.sam) |
||||
#Benutzte Variablen: |
||||
#WEBAPP=/var/lib/tomcat9/webapps/superx |
||||
#Module Liste: |
||||
#Hier werden die zu verwendende Module aufgelistet. |
||||
#Nur den Modulnamen in Kleinbuchstaben |
||||
#export BI_UPGRADE_MODULES="kern cob sos sva kenn" |
||||
#LOGPFAD=/var/log/tomcat9 |
||||
#Mailprogramm: |
||||
#export MAILPROG=s-nail |
||||
# BI_ENV einbinden (Pfad ggf. anpassen) |
||||
. /var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/env/BI_ENV |
||||
|
||||
set -u |
||||
|
||||
#Beispielaufruf: |
||||
#export BI_UPGRADE_MODULES="erfolg kenn" |
||||
#modules_upgrade.sh |
||||
#in crontab: |
||||
# Werktäglicher BI-Upgrade um 18 Uhr |
||||
#0 18 * * 1-5 /var/lib/tomcat9/BI_Maintenance/upgrade/hisinone_bi_qisserver/modules_upgrade.sh >/var/lib/tomcat9/BI_Maintenance/upgrade/hisinone_bi_qisserver/modules_upgrade.log 2>&1 |
||||
####################################### |
||||
# 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 |
||||
) |
||||
|
||||
# |
||||
#Variablen und Umgebung setzen: |
||||
# Steuerung, wann Logs angehängt werden: |
||||
# error = nur im Fehlerfall (Standard) |
||||
# always = bei Erfolg und Fehler |
||||
MAIL_ATTACH_LOGS_MODE="${MAIL_ATTACH_LOGS_MODE:-error}" |
||||
|
||||
MASTERLOG=$LOGPFAD/bi_upgrade.log |
||||
# Steuerung, ob die Job-Logdatei auf interne Fehler geprüft werden soll. |
||||
# true = Log nach Fehlermustern durchsuchen (FAILED / Fehlgeschlagen etc.) |
||||
# false = nur Java-Exitcode verwenden |
||||
CHECK_JOBLOG_FOR_ERRORS="${CHECK_JOBLOG_FOR_ERRORS:-false}" |
||||
|
||||
#erzeuge Logs Verzeichnis wenn es noch nicht existiert: |
||||
mkdir -p $LOGPFAD |
||||
########## Hilfsfunktionen für Mailversand ########## |
||||
|
||||
ERROR_FLAG=0 |
||||
ERROR_LOG="" |
||||
# Log-Mail (Erfolgsfall) – nur, wenn MAILPROG und LOGMAIL gesetzt sind. |
||||
# Zusätzliche Parameter ab $3 werden direkt an MAILPROG weitergereicht (z.B. -a <file>). |
||||
send_log_mail() { |
||||
local subject="$1" |
||||
local body_file="$2" |
||||
shift 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 <file>). |
||||
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 |
||||
} |
||||
|
||||
executeUpgrade() |
||||
{ |
||||
MODUL=$1 |
||||
LOGPFAD=$2 |
||||
MYMASTERLOG=$3 |
||||
MODUL_UPPER=`echo $MODUL | tr [a-z] [A-Z]` |
||||
MODULLOG=$LOGPFAD/"$MODUL_UPPER"_upgrade.log |
||||
echo "--- Start Upgrade für: $MODUL_UPPER ---" >>$MYMASTERLOG |
||||
date >>$MYMASTERLOG |
||||
echo Executing java -Xmx${MEM} -cp "...QIS_CLASSPATH" -Dfile.encoding=UTF-8 de.his.edustore.modules.WebFrontendForModuleInstall $MODUL upgrade '$SUPERX_DIR='$WEBAPP'/WEB-INF/conf/edustore $'$MODUL_UPPER'_PFAD='$WEBAPP'/WEB-INF/conf/edustore/db/module/'$MODUL >>$MODULLOG 2>&1 |
||||
java -Xmx${MEM} -cp "$QIS_CLASSPATH" -Dfile.encoding=UTF-8 de.his.edustore.modules.WebFrontendForModuleInstall $MODUL upgrade '$SUPERX_DIR='$WEBAPP'/WEB-INF/conf/edustore $'$MODUL_UPPER'_PFAD='$WEBAPP'/WEB-INF/conf/edustore/db/module/'$MODUL >>$MODULLOG 2>&1 |
||||
|
||||
|
||||
|
||||
RETURN_CODE=$? |
||||
echo "Returncode von dem Job des Moduls $MODUL_UPPER ist: $RETURN_CODE" >>$MYMASTERLOG |
||||
date >>$MYMASTERLOG |
||||
if [ $RETURN_CODE -eq 0 ] |
||||
then |
||||
echo "--- Ende Upgrade von $MODUL_UPPER: erfolgreich ---" >>$MYMASTERLOG |
||||
########## Startcheck – minimale Grundprüfung ########## |
||||
|
||||
startcheck_var() { |
||||
local varname="$1" |
||||
local value="${!varname:-}" |
||||
|
||||
if [ -z "$value" ]; then |
||||
# Fallback auf /tmp, falls LOGPFAD (noch) nicht gesetzt ist |
||||
local logdir="${LOGPFAD:-/tmp}" |
||||
local tmpfile="$logdir/bi_upgrade_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 Upgrade 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_UPGRADE_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 $MODUL_UPPER wurde mit einem Fehler beendet! <<<<" >> $MYMASTERLOG |
||||
echo "--- Ende des Upgrades vom Modul $MODUL_UPPER 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_upgrade.log" |
||||
mkdir -p "$LOGPFAD" |
||||
|
||||
ERROR_FLAG=0 |
||||
ERROR_LOG_FILES=() # Modul-/Job-Logs für Fehler-Mails |
||||
SUCCESS_LOG_FILES=() # Modul-/Job-Logs für Erfolgs-Mails (bei MAIL_ATTACH_LOGS_MODE=always) |
||||
|
||||
########## Funktion: Modul-Upgrade ausführen ########## |
||||
|
||||
run_module_upgrade() { |
||||
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}_upgrade.log" |
||||
|
||||
# Modul-Log immer in SUCCESS_LOG_FILES merken (für mögliche Erfolgs-Anhänge) |
||||
SUCCESS_LOG_FILES+=("$joblog") |
||||
|
||||
local start_ts |
||||
local end_ts |
||||
start_ts=$(date '+%Y-%m-%d %H:%M:%S%z') |
||||
|
||||
{ |
||||
echo |
||||
echo "--- Start Upgrade 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" |
||||
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', -20000, '$start_ts'); |
||||
" >>"$masterlog" 2>&1 || echo "WARNUNG: DB-Insert für Modul $module (Upgrade) fehlgeschlagen." >>"$masterlog" |
||||
fi |
||||
########## DB-Protokollierung: Start ENDE ########## |
||||
|
||||
# Java-Job für Upgrade 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 -u "$module" \ |
||||
>>"$joblog" 2>&1 |
||||
then |
||||
rc=$? |
||||
fi |
||||
|
||||
# Optional: Logdatei inhaltlich auf Fehler prüfen, |
||||
# falls der Prozess selbst mit Exitcode 0 beendet wurde. |
||||
if [ "$rc" -eq 0 ] && [ "$CHECK_JOBLOG_FOR_ERRORS" = "true" ]; then |
||||
if grep -q "Beim Ausführen des Jobs sind Fehler aufgetreten" "$joblog" \ |
||||
|| grep -q " status: \[FAILED\]" "$joblog" \ |
||||
|| grep -q "^\\*\\* Fehlgeschlagen:" "$joblog" |
||||
then |
||||
echo "Hinweis: Modul $module meldet interne Fehler im Job-Log – Returncode wird auf 1 gesetzt." >>"$masterlog" |
||||
rc=1 |
||||
fi |
||||
fi |
||||
|
||||
end_ts=$(date '+%Y-%m-%d %H:%M:%S%z') |
||||
|
||||
{ |
||||
echo "Returncode des Upgrade-Moduls $module: $rc" |
||||
date |
||||
} >>"$masterlog" |
||||
|
||||
if [ "$rc" -eq 0 ]; then |
||||
echo "--- Ende Upgrade 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 = -20000 |
||||
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, Upgrade) für Modul $module fehlgeschlagen." >>"$masterlog" |
||||
fi |
||||
########## DB-Protokollierung: Erfolg ENDE ########## |
||||
|
||||
########## Zusätzliche Job-Logdatei auch im Erfolgsfall registrieren ########## |
||||
# Damit sie bei MAIL_ATTACH_LOGS_MODE=always als Anhang mitgeschickt werden kann. |
||||
local jobs_dir="$WEBAPP/WEB-INF/logs/jobs" |
||||
if [ -d "$jobs_dir" ]; then |
||||
# neueste Datei, die mit dem Modulnamen in Großbuchstaben beginnt, z.B. KENN_*.log |
||||
local newest_jobfile |
||||
newest_jobfile=$(ls -1t "$jobs_dir/${module_upper}_"*.log 2>/dev/null | head -n1 || true) |
||||
if [ -n "$newest_jobfile" ] && [ -f "$newest_jobfile" ]; then |
||||
SUCCESS_LOG_FILES+=("$newest_jobfile") |
||||
echo "Hinweis: Zusätzlicher Job-Log (Erfolg, Upgrade) für Modul $module registriert: $newest_jobfile" >>"$masterlog" |
||||
fi |
||||
fi |
||||
########## Ende: zusätzliche Job-Logdatei (Erfolg) ########## |
||||
|
||||
else |
||||
echo ">>>> ACHTUNG: Upgrade des Moduls $module wurde mit einem FEHLER beendet! <<<<" >>"$masterlog" |
||||
echo "--- Ende Upgrade von $module: FEHLER ---" >>"$masterlog" |
||||
ERROR_FLAG=1 |
||||
ERROR_LOG_FILES+=("$joblog") |
||||
|
||||
########## Zusätzliche Job-Logdatei aus $WEBAPP/WEB-INF/logs/jobs im Fehlerfall ########## |
||||
local jobs_dir="$WEBAPP/WEB-INF/logs/jobs" |
||||
if [ -d "$jobs_dir" ]; then |
||||
local newest_jobfile |
||||
newest_jobfile=$(ls -1t "$jobs_dir/${module_upper}_"*.log 2>/dev/null | head -n1 || true) |
||||
if [ -n "$newest_jobfile" ] && [ -f "$newest_jobfile" ]; then |
||||
ERROR_LOG_FILES+=("$newest_jobfile") |
||||
echo "Hinweis: Zusätzlicher Job-Log (Fehler, Upgrade) für Modul $module angehängt: $newest_jobfile" >>"$masterlog" |
||||
fi |
||||
fi |
||||
########## Ende: zusätzliche Job-Logdatei (Fehler) ########## |
||||
|
||||
########## DB-Protokollierung: Fehler ########## |
||||
if [ $DOQUERY_AVAILABLE -eq 1 ]; then |
||||
$DOQUERY_CMD " |
||||
UPDATE update_prot |
||||
SET updated_at = '$end_ts', |
||||
update_id = -20001 |
||||
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, Upgrade) für Modul $module fehlgeschlagen." >>"$masterlog" |
||||
fi |
||||
########## DB-Protokollierung: Fehler ENDE ########## |
||||
fi |
||||
|
||||
echo >>"$masterlog" |
||||
} |
||||
|
||||
#Upgrades: |
||||
########## Schleife über alle Module ########## |
||||
|
||||
{ |
||||
echo "Starte BI-Upgrades für folgende Module: $BI_UPGRADE_MODULES" |
||||
date |
||||
echo "######################################" |
||||
echo |
||||
} >"$MASTERLOG" |
||||
|
||||
echo "Starte BI-Upgrades für die Module: $BI_UPGRADE_MODULES" >$MASTERLOG |
||||
date >>$MASTERLOG |
||||
echo -e "######################################\n\n" >>$MASTERLOG |
||||
for MODULE_SINGLE in ${BI_UPGRADE_MODULES[@]} ; do |
||||
executeUpgrade $MODULE_SINGLE $LOGPFAD $MASTERLOG |
||||
for module in $BI_UPGRADE_MODULES; do |
||||
run_module_upgrade "$module" "$LOGPFAD" "$MASTERLOG" |
||||
done |
||||
echo -e "\n\n######################################" >>$MASTERLOG |
||||
echo -e "-- Ende BI upgrade `date`\n\n" >>$MASTERLOG |
||||
|
||||
{ |
||||
echo |
||||
echo "######################################" |
||||
echo "-- Ende BI Upgrade $(date)" |
||||
echo |
||||
} >>"$MASTERLOG" |
||||
|
||||
########## Mailversand (optional) ########## |
||||
|
||||
if [ "$ERROR_FLAG" -eq 0 ]; then |
||||
# Erfolgsfall |
||||
attach_args=() |
||||
if [ "$MAIL_ATTACH_LOGS_MODE" = "always" ]; then |
||||
for f in "${SUCCESS_LOG_FILES[@]}"; do |
||||
[ -f "$f" ] && attach_args+=("-a" "$f") |
||||
done |
||||
fi |
||||
|
||||
send_log_mail \ |
||||
"${MAIL_BETREFF_UPGRADE:-BI Job Upgrade}${MAIL_BETREFF_SUFFIX_ERFOLGREICH:-}" \ |
||||
"$MASTERLOG" \ |
||||
"${attach_args[@]}" |
||||
|
||||
# Mailversand |
||||
if [ $ERROR_FLAG -eq 0 ] |
||||
then |
||||
if [ "$MAILPROG" != "" ] |
||||
then |
||||
$MAILPROG -s "$MAIL_BETREFF_UPGRADE$MAIL_BETREFF_SUFFIX_ERFOLGREICH" $LOGMAIL <$MYMASTERLOG |
||||
fi |
||||
|
||||
else |
||||
if [ "$MAILPROG" != "" ] |
||||
then |
||||
echo "Sende Logmail an $LOGMAIL" |
||||
$MAILPROG -s "$MAIL_BETREFF_UPGRADE$MAIL_BETREFF_SUFFIX_FEHLER" $ERROR_LOG $LOGMAIL <$MYMASTERLOG |
||||
fi |
||||
echo "Sende Fehler-Logmail (Upgrade, falls konfiguriert)." |
||||
|
||||
fi |
||||
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_UPGRADE:-BI Job Upgrade}${MAIL_BETREFF_SUFFIX_FEHLER:-}" \ |
||||
"$MASTERLOG" \ |
||||
"${attach_args[@]}" |
||||
fi |
||||
|
||||
Loading…
Reference in new issue