4 changed files with 352 additions and 89 deletions
@ -0,0 +1,7 @@ |
|||||||
|
set v15-compat |
||||||
|
|
||||||
|
account superx_mailversand { |
||||||
|
set from="SuperX APP <superx-app@uni-musterstadt.de>" |
||||||
|
set mta=smtp://<<BENUTZERNAME>>:<<PASSWORT>>@<<SMPT-SERVER>>:587 |
||||||
|
set smtp-use-starttls |
||||||
|
} |
||||||
@ -1,67 +1,263 @@ |
|||||||
#!/bin/bash |
#!/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: |
set -u |
||||||
mkdir -p $LOGPFAD |
|
||||||
|
####################################### |
||||||
|
# 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 <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 |
||||||
|
} |
||||||
|
|
||||||
|
########## 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_FLAG=0 |
||||||
ERROR_LOG="" |
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') |
||||||
|
|
||||||
executeUpdate() |
|
||||||
{ |
{ |
||||||
JOB=$1 |
echo |
||||||
LOGPFAD=$2 |
echo "--- Start Update für Modul: $module ($module_upper) ---" |
||||||
MYMASTERLOG=$3 |
date |
||||||
MODUL=$JOB |
} >>"$masterlog" |
||||||
MODUL_UPPER=`echo $MODUL | tr [a-z] [A-Z]` |
|
||||||
JOBLOG=$LOGPFAD/"$JOB"_update.log |
########## DB-Protokollierung: Start ########## |
||||||
echo "" >>$MYMASTERLOG |
if [ $DOQUERY_AVAILABLE -eq 1 ]; then |
||||||
echo "--- Start Update für: $JOB ---" >>$MYMASTERLOG |
# Standardwert 0, falls Mapping nicht vorhanden ist |
||||||
date >>$MYMASTERLOG |
local sys_id="0" |
||||||
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 |
# Prüfen, ob SYSTEMINFO_MAP existiert (kommt aus BI_ENV) |
||||||
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 |
if declare -p SYSTEMINFO_MAP >/dev/null 2>&1; then |
||||||
|
sys_id="${SYSTEMINFO_MAP[$module]:-0}" |
||||||
RETURN_CODE=$? |
fi |
||||||
echo "Returncode von dem Job des Moduls $JOB ist: $RETURN_CODE" >>$MYMASTERLOG |
|
||||||
date >>$MYMASTERLOG |
$DOQUERY_CMD " |
||||||
if [ $RETURN_CODE -eq 0 ] |
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 |
then |
||||||
echo "--- Ende Update von $JOB: erfolgreich ---" >>$MYMASTERLOG |
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 |
else |
||||||
echo ">>>> Achtung: Das Update des Modules $JOB wurde mit einem Fehler beendet! <<<<" >> $MYMASTERLOG |
echo ">>>> ACHTUNG: Update des Moduls $module wurde mit einem FEHLER beendet! <<<<" >>"$masterlog" |
||||||
echo "--- Ende des Updates vom Modul $JOB mit Fehler ---" >>$MYMASTERLOG |
echo "--- Ende Update von $module: FEHLER ---" >>"$masterlog" |
||||||
ERROR_FLAG=1 |
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 |
fi |
||||||
ERROR_LOG+=" $MAIL_APPEND $JOBLOG" |
########## DB-Protokollierung: Fehler ENDE ########## |
||||||
echo "" >>$MYMASTERLOG |
fi |
||||||
|
|
||||||
|
echo >>"$masterlog" |
||||||
} |
} |
||||||
|
|
||||||
# Schleife über Updates: |
########## Schleife über alle Module ########## |
||||||
|
|
||||||
echo "Starte BI-Jobs für die Module: $BI_UPDATE_MODULES" >$MASTERLOG |
{ |
||||||
date >>$MASTERLOG |
echo "Starte BI-Updates für folgende Module: $BI_UPDATE_MODULES" |
||||||
echo -e "######################################\n\n" >>$MASTERLOG |
date |
||||||
for JOB_SINGLE in ${BI_UPDATE_MODULES[@]} ; do |
echo "######################################" |
||||||
executeUpdate $JOB_SINGLE $LOGPFAD $MASTERLOG |
echo |
||||||
|
} >"$MASTERLOG" |
||||||
|
|
||||||
|
for module in $BI_UPDATE_MODULES; do |
||||||
|
run_module_update "$module" "$LOGPFAD" "$MASTERLOG" |
||||||
done |
done |
||||||
echo -e "\n\n######################################" >>$MASTERLOG |
|
||||||
echo -e "-- Ende BI update `date`\n\n" >>$MASTERLOG |
|
||||||
|
|
||||||
|
{ |
||||||
|
echo |
||||||
|
echo "######################################" |
||||||
|
echo "-- Ende BI Update $(date)" |
||||||
|
echo |
||||||
|
} >>"$MASTERLOG" |
||||||
|
|
||||||
# Mailversand |
########## Mailversand (optional) ########## |
||||||
if [ $ERROR_FLAG -eq 0 ] |
|
||||||
then |
|
||||||
if [ "$MAILPROG" != "" ] |
|
||||||
then |
|
||||||
$MAILPROG -s "$MAIL_BETREFF_UPDATE$MAIL_BETREFF_SUFFIX_ERFOLGREICH" $LOGMAIL <$MYMASTERLOG |
|
||||||
fi |
|
||||||
|
|
||||||
|
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 |
else |
||||||
if [ "$MAILPROG" != "" ] |
echo "Sende Fehler-Logmail (falls konfiguriert)." |
||||||
then |
|
||||||
echo "Sende Logmail an $LOGMAIL" |
# Attachments für fehlerhafte Modul-Logs vorbereiten (s-nail: -a DATEI) |
||||||
$MAILPROG -s "$MAIL_BETREFF_UPDATE$MAIL_BETREFF_SUFFIX_FEHLER" $ERROR_LOG $LOGMAIL <$MYMASTERLOG |
attach_args=() |
||||||
fi |
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 |
fi |
||||||
|
|||||||
@ -1,10 +1,28 @@ |
|||||||
#!/bin/bash |
#!/bin/bash |
||||||
#Bitte umbenennen nach modules_update_cron.sh |
# |
||||||
#Und den Pfad /var/lib/tomcat9... anpassen: |
# modules_update_cron.sh |
||||||
#in crontab: |
# |
||||||
# Werktäglicher BI-Update um 18 Uhr |
# Wrapper-Skript für den Cronjob. |
||||||
#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 |
# Wird typischerweise aus /etc/crontab oder via "crontab -e" aufgerufen. |
||||||
. /var/lib/tomcat9/BI_Maintenance/env/BI_ENV |
# |
||||||
#bei Nutzung H1-Qisserver: |
# Beispiel (werktags 18:00 Uhr): |
||||||
#/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 |
# 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 |
||||||
|
|||||||
Loading…
Reference in new issue