Zuletzt bearbeitet vor 2 Tagen
von Andre Knieschewski

Kernmodul Regelbetrieb: Unterschied zwischen den Versionen

Markierung: 2017-Quelltext-Bearbeitung
Markierung: 2017-Quelltext-Bearbeitung
Zeile 264: Zeile 264:
  ORDER BY 1;
  ORDER BY 1;
</source>
</source>




=Migration auf die Webapp-Struktur=
=Migration auf die Webapp-Struktur=


==Ziel==
==Aktueller Stand==
Mit dem Skript <code>migrate_superx_webapp.sh</code> kann eine bestehende SuperX-Installation automatisch auf die neue Verzeichnisstruktur migriert werden.


Die Migration unterstützt zwei Anwendungsfälle:
Die empfohlene Zielstruktur wurde gegenüber den ersten Entwürfen angepasst.


* vollständige Migration der Webapp inklusive DB-Verzeichnis
Die Webapp wird standardmäßig nicht mehr direkt unter dem Tomcat-Webapp-Verzeichnis abgelegt, sondern unter:
* Migration nur des DB-Verzeichnisses in eine bereits vorhandene Webapp
 
Die bisherige SuperX-Struktur:


<source lang="text">
<source lang="text">
/home/superx/db
/home/superx/webapps/superx
/home/superx/webserver/tomcat/webapps/superx
</source>
</source>


kann damit in folgende Zielstruktur überführt werden:
Dadurch bleibt die SuperX-Installation unabhängig von der verwendeten Tomcat-Distribution und kann einfacher per Git, rsync oder Modulupdate gepflegt werden.
 
<source lang="text">
<WEBAPP>
└── WEB-INF
    └── conf
        └── edustore
            └── db
</source>


Beispiel:
Optional kann anschließend ein symbolischer Link erzeugt werden:


<source lang="text">
<source lang="text">
/var/lib/tomcat10/webapps/superx
/var/lib/tomcat10/webapps/superx
└── WEB-INF
-> /home/superx/webapps/superx
    └── conf
        └── edustore
            └── db
</source>
 
==Dateien==
Das Migrationsskript besteht aus zwei Dateien:
 
<source lang="text">
migrate_superx.conf
migrate_superx_webapp.sh
</source>
 
Beide Dateien müssen im selben Verzeichnis liegen.
 
Das Skript lädt die Konfigurationsdatei automatisch aus dem eigenen Skriptverzeichnis. Ein Pfad zur Konfigurationsdatei muss beim Aufruf nicht angegeben werden.
 
Aufruf:
 
<source lang="bash">
./migrate_superx_webapp.sh
</source>
 
Für Produktivmigrationen mit Rechteanpassung wird in der Regel root benötigt:
 
<source lang="bash">
sudo ./migrate_superx_webapp.sh
</source>
</source>


 
Die Standardkonfiguration verwendet derzeit:
==Grundlegende Konfiguration==
 
===Vorhandene SQL_ENV===
Die bestehende Installation wird über die vorhandene <code>SQL_ENV</code> ermittelt.


<source lang="bash">
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
TARGET_WEBAPP="/home/superx/webapps/superx"
</source>
 
Aus dieser Datei liest das Skript insbesondere:


<source lang="bash">
WEBAPP_USER="superx"
SUPERX_DIR
WEBAPP_GROUP="tomcat"
WEBAPP
</source>
</source>


Diese Werte werden als Quellpfade für die Migration verwendet.
==Neue Variablen==


 
Die bisherigen Variablen:
==Migrationsmodus==
 
Die Variable <code>MIGRATION_MODE</code> steuert, ob die komplette Webapp oder nur das DB-Verzeichnis migriert wird.


<source lang="bash">
<source lang="bash">
MIGRATION_MODE="full"
TOMCAT_USER
SUPERX_GROUP
</source>
</source>


Erlaubte Werte:
wurden ersetzt durch:


<source lang="bash">
<source lang="bash">
full
WEBAPP_USER
db_only
WEBAPP_GROUP
</source>
</source>


===MIGRATION_MODE=full===
Dadurch ist das Skript nicht mehr auf bestimmte Benutzernamen festgelegt und kann flexibler eingesetzt werden.


Bei <code>full</code> wird die bestehende Webapp in ein neues Ziel-Webapp-Verzeichnis kopiert.
===WEBAPP_USER===


Zusätzlich wird das DB-Verzeichnis nach:
Besitzer der Ziel-Webapp.
 
<source lang="text">
<TARGET_WEBAPP>/WEB-INF/conf/edustore/db
</source>
 
kopiert oder verschoben.
 
Dieser Modus ist für eine vollständige Migration auf einen neuen Tomcat-Webapp-Pfad vorgesehen.


Beispiel:
Beispiel:


<source lang="bash">
<source lang="bash">
MIGRATION_MODE="full"
WEBAPP_USER="superx"
TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
DB_TRANSFER_MODE="copy"
</source>
</source>


Ablauf:
===WEBAPP_GROUP===
 
# bestehende Webapp wird nach <code>TARGET_WEBAPP</code> kopiert
# bestehendes DB-Verzeichnis wird nach <code>TARGET_WEBAPP/WEB-INF/conf/edustore/db</code> kopiert oder verschoben
# die neue <code>SQL_ENV</code> im Ziel wird angepasst
 
===MIGRATION_MODE=db_only===
 
Bei <code>db_only</code> wird keine Webapp kopiert.
 
Es wird nur das DB-Verzeichnis in die bereits vorhandene Webapp-Struktur übernommen.


Dieser Modus ist sinnvoll, wenn die Webapp bereits an der gewünschten Stelle liegt und nur noch das bisher externe DB-Verzeichnis in die neue Zielstruktur übernommen werden soll.
Gruppe der Ziel-Webapp.


Beispiel:
Beispiel:


<source lang="bash">
<source lang="bash">
MIGRATION_MODE="db_only"
WEBAPP_GROUP="tomcat"
TARGET_WEBAPP="auto"
DB_TRANSFER_MODE="move"
</source>
</source>


Bei <code>TARGET_WEBAPP="auto"</code> verwendet das Skript automatisch den bestehenden Wert von <code>WEBAPP</code> aus der geladenen <code>SQL_ENV</code>.
Dadurch ergibt sich als Standardziel:
 
Das DB-Verzeichnis wird dann nach:


<source lang="text">
<source lang="text">
$WEBAPP/WEB-INF/conf/edustore/db
Owner: superx
Group: tomcat
</source>
</source>


kopiert oder verschoben.
==Automatische Rechtebehandlung==


===SET_OWNER=auto===


==Übertragung des DB-Verzeichnisses==
Dies ist die empfohlene Standardeinstellung.
 
Die Variable <code>DB_TRANSFER_MODE</code> steuert, ob das DB-Verzeichnis kopiert oder verschoben wird.


<source lang="bash">
<source lang="bash">
DB_TRANSFER_MODE="copy"
SET_OWNER="auto"
</source>
</source>


Erlaubte Werte:
Das Skript entscheidet automatisch, ob ein chown erforderlich ist.
 
<source lang="bash">
copy
move
</source>


===DB_TRANSFER_MODE=copy===
====Ausführung als root====


Bei <code>copy</code> wird das DB-Verzeichnis per <code>rsync</code> kopiert.
Wird das Skript als root ausgeführt, werden Besitzer und Gruppe gesetzt:


<source lang="bash">
<source lang="bash">
DB_TRANSFER_MODE="copy"
chown -R $WEBAPP_USER:$WEBAPP_GROUP ...
</source>
</source>


Die Quelle bleibt erhalten.
Beispiel:
 
Das ist die sicherere Variante und eignet sich besonders für Produktivmigrationen, bei denen die alte Installation zunächst unverändert erhalten bleiben soll.
 
===DB_TRANSFER_MODE=move===
 
Bei <code>move</code> wird das DB-Verzeichnis per <code>mv</code> verschoben.


<source lang="bash">
<source lang="bash">
DB_TRANSFER_MODE="move"
WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"
</source>
</source>


Die Quelle liegt danach nicht mehr am alten Ort.
Ergebnis:


Diese Variante kann sinnvoll sein, wenn das DB-Verzeichnis sehr groß ist, z. B. durch:
<source lang="text">
 
Owner: superx
* unload-Dateien
Group: tomcat
* Exportdateien
* temporäre Arbeitsdateien
* lokale Sicherungen
 
Da beim Verschieben kein doppelter Speicherplatz benötigt wird, kann <code>move</code> bei knappen Plattenplatzverhältnissen sinnvoll sein.
 
Aus Sicherheitsgründen darf das Zielverzeichnis bei <code>move</code> noch nicht existieren. Das Skript bricht sonst ab, um unerwünschte Verschachtelungen wie <code>db/db</code> zu vermeiden.
 
 
==Ziel-Webapp==
 
Die Ziel-Webapp wird über <code>TARGET_WEBAPP</code> festgelegt.
 
<source lang="bash">
TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
</source>
</source>


Bei <code>MIGRATION_MODE=full</code> muss hier ein konkreter Zielpfad eingetragen werden.
====Ausführung als WEBAPP_USER====
 
Bei <code>MIGRATION_MODE=db_only</code> kann stattdessen <code>auto</code> verwendet werden:
 
<source lang="bash">
TARGET_WEBAPP="auto"
</source>
 
Dann verwendet das Skript den bestehenden Wert von <code>WEBAPP</code> aus der alten <code>SQL_ENV</code>.
 
 
==Bestehende Zielverzeichnisse==
 
===ALLOW_EXISTING_TARGET===
 
Diese Variable steuert, ob eine bereits vorhandene Ziel-Webapp ergänzt werden darf.
 
<source lang="bash">
ALLOW_EXISTING_TARGET="true"
</source>
 
Bei <code>MIGRATION_MODE=full</code> kann damit erlaubt werden, dass eine vorhandene Ziel-Webapp per <code>rsync</code> ergänzt oder aktualisiert wird.
 
===ALLOW_EXISTING_TARGET_DB===
 
Diese Variable steuert, ob ein bereits vorhandenes Ziel-DB-Verzeichnis bei <code>DB_TRANSFER_MODE=copy</code> ergänzt werden darf.
 
<source lang="bash">
ALLOW_EXISTING_TARGET_DB="true"
</source>
 
Bei <code>DB_TRANSFER_MODE=copy</code> kann das Ziel per <code>rsync</code> ergänzt werden.
 
Bei <code>DB_TRANSFER_MODE=move</code> wird diese Einstellung ignoriert. In diesem Fall darf das Ziel-DB-Verzeichnis nicht existieren.
 
 
==SQL_ENV-Anpassung==
 
Nach der Migration wird die <code>SQL_ENV</code> im Ziel-DB-Verzeichnis angepasst.
 
Ziel:


<source lang="bash">
Wird das Skript direkt als WEBAPP_USER ausgeführt und ist dieser Benutzer Mitglied der WEBAPP_GROUP, kann die Migration häufig vollständig ohne root-Rechte erfolgen.
WEBAPP=<TARGET_WEBAPP>
SUPERX_DIR=<TARGET_WEBAPP>/WEB-INF/conf/edustore
umask 002
</source>


Beispiel:
Beispiel:


<source lang="bash">
<source lang="bash">
WEBAPP=/var/lib/tomcat10/webapps/superx
WEBAPP_USER="superx"
SUPERX_DIR=/var/lib/tomcat10/webapps/superx/WEB-INF/conf/edustore
WEBAPP_GROUP="tomcat"
umask 002
</source>
</source>


Vor der Änderung wird automatisch eine Sicherung der Ziel-<code>SQL_ENV</code> angelegt.
Prüfung:
 
Die Anpassung kann über folgende Variable gesteuert werden:


<source lang="bash">
<source lang="bash">
UPDATE_SQL_ENV="true"
id superx
</source>
</source>


Beispielausgabe:


==Automatische Rechtebehandlung==
<source lang="text">
 
uid=1001(superx)
Die Rechtebehandlung wird über folgende Variablen gesteuert:
groups=superx,tomcat
 
<source lang="bash">
SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"
</source>
</source>


===SET_OWNER=auto===
In diesem Fall kann der Benutzer:


Dies ist die empfohlene Standardeinstellung.
* Dateien kopieren
* Dateien verschieben
* Verzeichnisse anlegen
* chmod ausführen
* Gruppenrechte setzen


Das Skript entscheidet automatisch, ob ein <code>chown</code> erforderlich ist:
ohne root-Rechte durchführen.


* Wird das Skript als <code>root</code> ausgeführt, werden Besitzer und Gruppe gemäß <code>TOMCAT_USER</code> und <code>SUPERX_GROUP</code> gesetzt.
===ADD_WEBAPP_USER_TO_GROUP===
* Wird das Skript als derselbe Benutzer ausgeführt, der auch als <code>TOMCAT_USER</code> konfiguriert wurde und ist dieser Benutzer Mitglied der angegebenen Gruppe, wird auf das <code>chown</code> automatisch verzichtet.
* Ist eine Änderung des Besitzers erforderlich, das Skript läuft jedoch nicht als <code>root</code>, wird mit einer Fehlermeldung abgebrochen.


Beispiel Produktivsystem:
Optional kann das Skript den Benutzer automatisch der Zielgruppe hinzufügen.


<source lang="bash">
<source lang="bash">
TOMCAT_USER="tomcat"
ADD_WEBAPP_USER_TO_GROUP="true"
SUPERX_GROUP="superx"
SET_OWNER="auto"
</source>
</source>


Beispiel Testsystem ohne root:
Beispiel:


<source lang="bash">
<source lang="bash">
TOMCAT_USER="superx"
WEBAPP_USER="superx"
SUPERX_GROUP="superx"
WEBAPP_GROUP="tomcat"
SET_OWNER="auto"
</source>
</source>


===SET_OWNER=true===
Das Skript führt dann bei Bedarf aus:


<source lang="bash">
<source lang="bash">
SET_OWNER="true"
usermod -aG tomcat superx
</source>
</source>


Der Besitzer wird immer auf den konfigurierten Benutzer und die konfigurierte Gruppe gesetzt:
Hierfür sind root-Rechte erforderlich.


<source lang="bash">
==Tomcat-Anbindung über Symlink==
chown -R $TOMCAT_USER:$SUPERX_GROUP ...
</source>


Dafür werden normalerweise root-Rechte benötigt.
Empfohlen wird folgende Struktur:


===SET_OWNER=false===
<source lang="text">
 
/home/superx/webapps/superx
<source lang="bash">
SET_OWNER="false"
</source>
</source>


Es wird kein <code>chown</code> ausgeführt.
Optional kann das Skript automatisch einen Symlink erzeugen.
 
Die vorhandenen Besitzer- und Gruppeninformationen bleiben unverändert.


===SET_CHMOD===
===CREATE_TOMCAT_SYMLINK===
 
Mit <code>SET_CHMOD</code> wird gesteuert, ob Dateirechte gesetzt werden.


<source lang="bash">
<source lang="bash">
SET_CHMOD="true"
CREATE_TOMCAT_SYMLINK="true"
</source>
</source>


Dabei werden u. a.:
===TOMCAT_WEBAPPS_DIR===
 
* Verzeichnisse auf <code>2775</code> gesetzt
* Dateien auf <code>664</code> gesetzt
* Dateien unter <code>db/bin</code> ausführbar gesetzt
* Dateien mit Endung <code>.x</code> und <code>.sh</code> ausführbar gesetzt
 
Das gesetzte setgid-Bit auf Verzeichnissen sorgt dafür, dass neu angelegte Dateien und Verzeichnisse die Gruppe des übergeordneten Verzeichnisses erben.
 
 
==Tomcat-Gruppe==
 
Wenn mit Gruppenrechten gearbeitet wird, muss der Tomcat-Benutzer Mitglied der verwendeten Gruppe sein.
 
Beispiel:


<source lang="bash">
<source lang="bash">
usermod -aG superx tomcat
TOMCAT_WEBAPPS_DIR="/var/lib/tomcat10/webapps"
</source>
</source>


Im Skript kann diese Zuordnung automatisch erfolgen:
===TOMCAT_CONTEXT_NAME===


<source lang="bash">
<source lang="bash">
ADD_TOMCAT_TO_GROUP="true"
TOMCAT_CONTEXT_NAME="superx"
</source>
</source>


Falls die Gruppenmitgliedschaft neu gesetzt wurde, muss Tomcat anschließend neu gestartet werden, damit die neue Gruppenzugehörigkeit im laufenden Prozess wirksam wird.
Ergebnis:


 
<source lang="text">
==Sicherheitsprüfung bereits migrierter Installationen==
/var/lib/tomcat10/webapps/superx
 
-> /home/superx/webapps/superx
Um versehentliche Mehrfachmigrationen zu vermeiden, prüft das Skript standardmäßig, ob die Quelle bereits nach einer migrierten Webapp-Struktur aussieht.
 
Beispiel:
 
<source lang="bash">
SUPERX_DIR=/home/superx/webserver/tomcat/webapps/superx/WEB-INF/conf/edustore
WEBAPP=/home/superx/webserver/tomcat/webapps/superx
</source>
</source>


Hier liegt <code>SUPERX_DIR</code> bereits innerhalb von <code>WEBAPP</code>.
===REPLACE_EXISTING_SYMLINK===


In diesem Fall bricht das Skript standardmäßig ab.
Bestehende Symlinks können optional ersetzt werden.
 
Die Prüfung kann im Notfall übersteuert werden:


<source lang="bash">
<source lang="bash">
FORCE_ALREADY_MIGRATED="true"
REPLACE_EXISTING_SYMLINK="true"
</source>
</source>


Standardwert:
Normale Dateien oder Verzeichnisse werden dabei niemals automatisch gelöscht.


<source lang="bash">
==Empfohlene Standardkonfiguration==
FORCE_ALREADY_MIGRATED="false"
</source>


Diese Option sollte nur verwendet werden, wenn die Auswirkungen bekannt sind. Andernfalls besteht die Gefahr, dass bereits migrierte Strukturen erneut kopiert oder ungewollt verschachtelt werden.
Für neue Installationen wird derzeit folgende Konfiguration empfohlen:
 
 
==Dry-Run==
 
Vor einer Produktivmigration empfiehlt sich ein Testlauf:


<source lang="bash">
<source lang="bash">
DRY_RUN="true"
TARGET_WEBAPP="/home/superx/webapps/superx"
</source>


Danach:
WEBAPP_USER="superx"
 
WEBAPP_GROUP="tomcat"
<source lang="bash">
./migrate_superx_webapp.sh
</source>
 
Es werden die geplanten Aktionen angezeigt, ohne Änderungen durchzuführen.
 
 
==Beispiele==
 
===Vollständige Migration mit Kopie des DB-Verzeichnisses===
 
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
 
MIGRATION_MODE="full"
DB_TRANSFER_MODE="copy"
 
TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
 
TOMCAT_USER="tomcat"
SUPERX_GROUP="superx"


SET_RIGHTS="true"
SET_RIGHTS="true"
SET_OWNER="auto"
SET_OWNER="auto"
SET_CHMOD="true"
SET_CHMOD="true"
</source>


Aufruf:
CREATE_TOMCAT_SYMLINK="false"
 
<source lang="bash">
sudo ./migrate_superx_webapp.sh
</source>
</source>


===Vollständige Migration mit Verschieben des DB-Verzeichnisses===
Vorteile:


<source lang="bash">
* SuperX bleibt unabhängig vom Tomcat-Verzeichnis.
SQL_ENV="/home/superx/db/bin/SQL_ENV"
* Git-Repositories können direkt durch den Benutzer superx gepflegt werden.
* Modulupdates können häufig ohne root durchgeführt werden.
* Die Webapp bleibt auch bei Tomcat-Upgrades unverändert.
* Die Struktur funktioniert distributionsübergreifend.


MIGRATION_MODE="full"
==Aktualisierte Beispiele==
DB_TRANSFER_MODE="move"


TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
===Migration ohne root===


TOMCAT_USER="tomcat"
<source lang="bash">
SUPERX_GROUP="superx"
WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"


SET_OWNER="auto"
SET_RIGHTS="true"
SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"
</source>
</source>


In diesem Fall wird die Webapp kopiert, das DB-Verzeichnis jedoch verschoben.
Voraussetzung:
 
===Nur DB-Verzeichnis in bestehende Webapp übernehmen===


<source lang="bash">
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
id superx
</source>


MIGRATION_MODE="db_only"
liefert:
DB_TRANSFER_MODE="move"
TARGET_WEBAPP="auto"


SET_RIGHTS="false"
<source lang="text">
UPDATE_SQL_ENV="true"
groups=superx,tomcat
</source>
</source>


Aufruf:
===Migration mit root===


<source lang="bash">
<source lang="bash">
./migrate_superx_webapp.sh
sudo ./migrate_superx_webapp.sh
</source>
</source>


In diesem Fall wird keine Webapp kopiert. Das DB-Verzeichnis wird in die bestehende Webapp unter <code>WEB-INF/conf/edustore/db</code> verschoben.
Dabei werden die Zielrechte automatisch auf:


===Testmigration ohne root===
<source lang="text">
 
superx:tomcat
<source lang="bash">
SQL_ENV="/home/superx/test/db/bin/SQL_ENV"
 
MIGRATION_MODE="db_only"
DB_TRANSFER_MODE="copy"
TARGET_WEBAPP="auto"
 
TOMCAT_USER="superx"
SUPERX_GROUP="superx"
 
SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"
 
ADD_TOMCAT_TO_GROUP="false"
</source>
</source>


Wird das Skript als Benutzer <code>superx</code> ausgeführt, kann diese Migration ohne root-Rechte laufen.
gesetzt.


==Ergänzung zum Migrationsablauf==


==Ablauf der Migration==
Der Ablauf lautet nun:


Das Skript führt je nach Modus folgende Schritte aus:
# Laden von migrate_superx.conf
 
# Laden der bestehenden SQL_ENV
# Laden von <code>migrate_superx.conf</code>
# Ermitteln von SUPERX_DIR, WEBAPP und DB-Verzeichnis
# Laden der bestehenden <code>SQL_ENV</code>
# Sicherheitsprüfung auf bereits migrierte Strukturen
# Ermitteln von <code>SUPERX_DIR</code>, <code>WEBAPP</code> und dem bisherigen DB-Verzeichnis
# Sicherheitsprüfung, ob die Quelle bereits migriert aussieht
# Ermitteln der Zielstruktur
# Ermitteln der Zielstruktur
# Optional: Tomcat stoppen
# Optional Tomcat stoppen
# Bei <code>MIGRATION_MODE=full</code>: Webapp kopieren
# Optional Webapp kopieren
# DB-Verzeichnis je nach <code>DB_TRANSFER_MODE</code> kopieren oder verschieben
# DB-Verzeichnis kopieren oder verschieben
# Backup der Ziel-<code>SQL_ENV</code>
# SQL_ENV anpassen
# Anpassung von <code>WEBAPP</code>, <code>SUPERX_DIR</code> und <code>umask</code>
# Rechte setzen
# Optional: Rechte setzen
# Optional Tomcat-Symlink erzeugen
# Optional: Tomcat starten
# Optional Tomcat starten
 


==Hinweise==
==Hinweise==


* Die Webapp wird vom Skript nie verschoben, sondern bei <code>MIGRATION_MODE=full</code> kopiert.
* Standardziel ist /home/superx/webapps/superx.
* Das DB-Verzeichnis kann wahlweise kopiert oder verschoben werden.
* Die Tomcat-Anbindung kann über einen Symlink erfolgen.
* Bei <code>DB_TRANSFER_MODE=move</code> ist die alte DB-Quelle nach der Migration nicht mehr vorhanden.
* WEBAPP_USER und WEBAPP_GROUP ersetzen die früheren Variablen TOMCAT_USER und SUPERX_GROUP.
* Bei <code>DB_TRANSFER_MODE=move</code> darf das Ziel-DB-Verzeichnis nicht existieren.
* Bei WEBAPP_USER=superx und WEBAPP_GROUP=tomcat kann die Migration häufig ohne root erfolgen.
* Für <code>copy</code> wird <code>rsync</code> verwendet.
* Root wird nur benötigt, wenn Besitzer geändert oder Systemkonfigurationen angepasst werden müssen.
* Die interne Zielstruktur ist fest vorgegeben: <code>WEB-INF/conf/edustore/db</code>.
* Für Produktivmigrationen ist ein vorheriger Dry-Run empfehlenswert.
* Bei Rechteänderungen auf andere Benutzer oder Gruppen sind root-Rechte erforderlich.

Version vom 15. Juni 2026, 13:02 Uhr

BI Maintenance

logobutton maintenance2b.png

Ziel und Überblick

Die hier bereitgestellten Skripte ermöglichen es, in der BI-Umgebung von HISinOne und in Zukunft auch von SuperX (aktuell können die Scripte in SuperX leider noch nicht verwendet werden) Modul-Updates und -Upgrades zuverlässig über die Shell auszuführen – automatisiert per Cronjob oder manuell. Sie orientieren sich bewusst am bisherigen Vorgehen aus SuperX, wurden jedoch erweitert:

  • Ausführung der BI-Modul-Updates/-Upgrades über Java (ComponentAdminCLI).
  • Vollständige Protokollierung in Logdateien.
  • Optional: Protokollierung der Läufe in der Tabelle update_prot.
  • Automatischer Mailversand über ein konfigurierbares Mailprogramm.
  • Optional: Erkennen interner Fehler im Batch-Job (auch wenn Java Exitcode 0 liefert).
  • Möglichkeit, Logdateien automatisch an Mails anzuhängen (erfolgreiche und fehlerhafte Module).

Installation aus dem git Repository

Führen Sie folgenden Shell-Befehl aus:

git clone https://git.campussource.de/git/SuperX/BI_Maintenance.git

Die weitere Konfiguration wird im Folgenden beschrieben. Alle Einstellungen erfolgen zentral in der Datei BI_ENV, die als Template BI_ENV.sam ausgeliefert wird.

Umgebungsvariablen in der BI_ENV

BI_ENV.sam – Template und lokale BI_ENV

Die Datei BI_ENV.sam wird als Muster ausgeliefert.

Sie muss vor Ort:

  1. in BI_ENV kopiert/umbenannt werden:
cp BI_ENV.sam BI_ENV
  1. an die lokalen Gegebenheiten angepasst werden (Pfade, Module, Mailadressen usw.).
  2. mit restriktiven Rechten versehen werden:
chmod 600 BI_ENV

Skripte binden diese Datei später mit

. /pfad/zu/BI_ENV

ein.


Bedeutung der Variablen

Im Folgenden die wichtigsten Variablen, die angepasst werden müssen.

Java-Konfiguration

JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export JAVA_HOME

JRE_HOME=$JAVA_HOME
export JRE_HOME

PATH=$JAVA_HOME/bin:$PATH
export PATH

Diese Variablen stellen sicher, dass die BI-Jobs mit dem vorgesehenen Java (empfohlen: Java 17) ausgeführt werden.

Java-Optionen:

JAVA_OPTS="-Xmx1520M -Djava.awt.headless=true ... --add-opens ..."
export JAVA_OPTS

Pfade zur SuperX-BI-Installation

WEBAPP=/var/lib/tomcat10/webapps/superx
export WEBAPP

SUPERX_DIR=$WEBAPP/WEB-INF/conf/edustore
export SUPERX_DIR

Diese Pfade müssen an lokale Tomcat-Installation und SuperX-Verzeichnisstruktur angepasst werden.

Modulsteuerung

Für die Update- und Upgrade-Skripte werden die zu bearbeitenden Module festgelegt:

export BI_UPDATE_MODULES="sos kenn zul"
export BI_UPGRADE_MODULES="kenn"

Hinweis: Die Modulkürzel müssen klein geschrieben sein (z. B. sos, kenn, zul) und mit Leerzeichen getrennt aufgelistet werden.

Logging

LOGPFAD=$WEBAPP/WEB-INF/logs
export LOGPFAD

Im Logpfad werden u. a. folgende Dateien erzeugt:

  • bi_update.log – Sammellog des Updates
  • bi_upgrade.log – Sammellog des Upgrades
  • <modul>_update.log
  • <modul>_upgrade.log

Java-Batch-Jobs erzeugen ergänzende Logs in:

$WEBAPP/WEB-INF/logs/jobs

Mailversand

Folgende Variablen steuern Empfänger und Format der Benachrichtigungen:

export ERRORMAIL="admin@hs.de"
export LOGMAIL="$ERRORMAIL"
#export LOGMAIL="admin@hs.de kollege@hs.de"   # mehrere Empfänger möglich
  • ERRORMAIL – Empfänger für Fehlermails
  • LOGMAIL – Empfänger für Erfolgs- und Statusmails

Mehrere Adressen werden per Leerzeichen getrennt.

Mailprogramm:

export MAILPROG="s-nail --account=test1 -S ttycharset=utf-8 -S sendcharset=utf-8"

Betreffzeilen:

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"
Kernmodul Regelbetrieb Mailversand.png

So könnten die Mails aussehen.

Steuerung der Log-Anhänge

# error  = Logs nur bei Fehlern anhängen
# always = Logs immer anhängen (Erfolg + Fehler)
export MAIL_ATTACH_LOGS_MODE="error"

Optionale Prüfung der Modul-Logs

# true  = zusätzlich Modul-Log auf interne Fehler prüfen
# false = nur Exitcode des Java-Calls verwenden
export CHECK_JOBLOG_FOR_ERRORS="true"

Gerade bei dem Java Aufruf von ComponentAdminCLI empfehlenswert, da dieser aktuell noch trotz status: FAILED oft Exitcode 0 liefert.


Module Updates

modules_update.sh – Hauptskript

Dieses Skript führt alle Module aus BI_UPDATE_MODULES nacheinander aus.

Ablauf:

  1. Startcheck: Sind WEBAPP, LOGPFAD und BI_UPDATE_MODULES gesetzt?
  2. Falls verfügbar: DB-Protokollierung via DOQUERY.
  3. Für jedes Modul:
    1. Logdatei anlegen
    2. Start in update_prot protokollieren (update_id = -10000)
    3. Java-Update starten:
  ComponentAdminCLI -e <modul>
    1. Optional: Modul-Logdatei nach internen Fehlern durchsuchen
    2. Erfolg:
      1. Modul-Log in SUCCESS_LOG_FILES
      2. DB-Update (update_id = -10000)
    3. Fehler:
      1. Modul-Log in ERROR_LOG_FILES
      2. DB-Update (update_id = -10001)
    4. Zuletzt: Java-Joblogs aus $WEBAPP/WEB-INF/logs/jobs ermitteln
  1. Nach Abschluss aller Module:
    1. Erfolgs- oder Fehlermail versenden
    2. Anhänge abhängig von MAIL_ATTACH_LOGS_MODE

modules_update_cron.sh – Wrapper für Cron

Damit Updates regelmäßig durchgeführt werden können, existiert ein einfaches Wrapper-Skript.

Vorgehen:

  1. Beispieldatei kopieren:
cp modules_update_cron.sh.sam modules_update_cron.sh
chmod +x modules_update_cron.sh
  1. Pfade zur BI_ENV und zum Update-Skript anpassen.
  2. Cronjob eintragen, z. B. werktags um 18 Uhr:
0 18 * * 1-5 /pfad/zu/modules_update_cron.sh

Inhaltlich:

  • Laden der BI_ENV
  • Start des Skripts modules_update.sh

Module Upgrades

modules_upgrade.sh – Hauptskript

Das Upgrade-Skript entspricht dem Update-Skript, unterscheidet sich aber in folgenden Punkten:

  • Es wird **manuell** ausgeführt – kein Cronjob vorgesehen.
  • Es verwendet BI_UPGRADE_MODULES.
  • Das eigentliche Upgrade erfolgt über:
 ComponentAdminCLI -u <modul>
  • Nach Abschluss des Upgrades erfolgt ein Mailversand analog zum Update-Skript.

Aufruf:

cd /var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/update
./modules_upgrade.sh

Vorher muss zu Beginn des Skripts der Pfad zur BI_ENV eingetragen sein:

. /pfad/zur/BI_ENV

Modulverwaltung

Modulkürzel

Die folgenden Modulkürzel sind in einer typischen BI-Installation relevant:

 kuerzel |                         name                          
---------+-------------------------------------------------------
 astat   | Amtliche Statistik                                
 bau     | Gebäude, Räume, Flächen                           
 cob     | Kostenrechnung                                    
 erfolg  | Studienverlauf                                    
 fin     | Finanzrechnung                                    
 gang    | Studiengänge                                      
 ivs     | Inventar                                          
 kenn    | Kennzahlen                                        
 kern    | Administration                                    
 lm      | Leistungsmonitoring                               
 man     | Management                                        
 prom    | Promovierende                                     
 res     | Forschung                                         
 sos     | Studierende, Prüfungen                            
 sva     | Personal, Stellen                                 
 zul     | Bewerbung, Zulassung

Die aktiven Module der eigenen Installation können mit folgendem SQL abgefragt werden:

SELECT V.his_system AS kuerzel,
       S.name
  FROM db_version V
  JOIN systeminfo S
    ON S.tid = V.systeminfo_id
 ORDER BY 1;


Migration auf die Webapp-Struktur

Aktueller Stand

Die empfohlene Zielstruktur wurde gegenüber den ersten Entwürfen angepasst.

Die Webapp wird standardmäßig nicht mehr direkt unter dem Tomcat-Webapp-Verzeichnis abgelegt, sondern unter:

/home/superx/webapps/superx

Dadurch bleibt die SuperX-Installation unabhängig von der verwendeten Tomcat-Distribution und kann einfacher per Git, rsync oder Modulupdate gepflegt werden.

Optional kann anschließend ein symbolischer Link erzeugt werden:

/var/lib/tomcat10/webapps/superx
 -> /home/superx/webapps/superx

Die Standardkonfiguration verwendet derzeit:

TARGET_WEBAPP="/home/superx/webapps/superx"

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

Neue Variablen

Die bisherigen Variablen:

TOMCAT_USER
SUPERX_GROUP

wurden ersetzt durch:

WEBAPP_USER
WEBAPP_GROUP

Dadurch ist das Skript nicht mehr auf bestimmte Benutzernamen festgelegt und kann flexibler eingesetzt werden.

WEBAPP_USER

Besitzer der Ziel-Webapp.

Beispiel:

WEBAPP_USER="superx"

WEBAPP_GROUP

Gruppe der Ziel-Webapp.

Beispiel:

WEBAPP_GROUP="tomcat"

Dadurch ergibt sich als Standardziel:

Owner: superx
Group: tomcat

Automatische Rechtebehandlung

SET_OWNER=auto

Dies ist die empfohlene Standardeinstellung.

SET_OWNER="auto"

Das Skript entscheidet automatisch, ob ein chown erforderlich ist.

Ausführung als root

Wird das Skript als root ausgeführt, werden Besitzer und Gruppe gesetzt:

chown -R $WEBAPP_USER:$WEBAPP_GROUP ...

Beispiel:

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

Ergebnis:

Owner: superx
Group: tomcat

Ausführung als WEBAPP_USER

Wird das Skript direkt als WEBAPP_USER ausgeführt und ist dieser Benutzer Mitglied der WEBAPP_GROUP, kann die Migration häufig vollständig ohne root-Rechte erfolgen.

Beispiel:

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

Prüfung:

id superx

Beispielausgabe:

uid=1001(superx)
groups=superx,tomcat

In diesem Fall kann der Benutzer:

  • Dateien kopieren
  • Dateien verschieben
  • Verzeichnisse anlegen
  • chmod ausführen
  • Gruppenrechte setzen

ohne root-Rechte durchführen.

ADD_WEBAPP_USER_TO_GROUP

Optional kann das Skript den Benutzer automatisch der Zielgruppe hinzufügen.

ADD_WEBAPP_USER_TO_GROUP="true"

Beispiel:

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

Das Skript führt dann bei Bedarf aus:

usermod -aG tomcat superx

Hierfür sind root-Rechte erforderlich.

Tomcat-Anbindung über Symlink

Empfohlen wird folgende Struktur:

/home/superx/webapps/superx

Optional kann das Skript automatisch einen Symlink erzeugen.

CREATE_TOMCAT_SYMLINK

CREATE_TOMCAT_SYMLINK="true"

TOMCAT_WEBAPPS_DIR

TOMCAT_WEBAPPS_DIR="/var/lib/tomcat10/webapps"

TOMCAT_CONTEXT_NAME

TOMCAT_CONTEXT_NAME="superx"

Ergebnis:

/var/lib/tomcat10/webapps/superx
 -> /home/superx/webapps/superx

REPLACE_EXISTING_SYMLINK

Bestehende Symlinks können optional ersetzt werden.

REPLACE_EXISTING_SYMLINK="true"

Normale Dateien oder Verzeichnisse werden dabei niemals automatisch gelöscht.

Empfohlene Standardkonfiguration

Für neue Installationen wird derzeit folgende Konfiguration empfohlen:

TARGET_WEBAPP="/home/superx/webapps/superx"

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"

CREATE_TOMCAT_SYMLINK="false"

Vorteile:

  • SuperX bleibt unabhängig vom Tomcat-Verzeichnis.
  • Git-Repositories können direkt durch den Benutzer superx gepflegt werden.
  • Modulupdates können häufig ohne root durchgeführt werden.
  • Die Webapp bleibt auch bei Tomcat-Upgrades unverändert.
  • Die Struktur funktioniert distributionsübergreifend.

Aktualisierte Beispiele

Migration ohne root

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

SET_OWNER="auto"
SET_RIGHTS="true"

Voraussetzung:

id superx

liefert:

groups=superx,tomcat

Migration mit root

sudo ./migrate_superx_webapp.sh

Dabei werden die Zielrechte automatisch auf:

superx:tomcat

gesetzt.

Ergänzung zum Migrationsablauf

Der Ablauf lautet nun:

  1. Laden von migrate_superx.conf
  2. Laden der bestehenden SQL_ENV
  3. Ermitteln von SUPERX_DIR, WEBAPP und DB-Verzeichnis
  4. Sicherheitsprüfung auf bereits migrierte Strukturen
  5. Ermitteln der Zielstruktur
  6. Optional Tomcat stoppen
  7. Optional Webapp kopieren
  8. DB-Verzeichnis kopieren oder verschieben
  9. SQL_ENV anpassen
  10. Rechte setzen
  11. Optional Tomcat-Symlink erzeugen
  12. Optional Tomcat starten

Hinweise

  • Standardziel ist /home/superx/webapps/superx.
  • Die Tomcat-Anbindung kann über einen Symlink erfolgen.
  • WEBAPP_USER und WEBAPP_GROUP ersetzen die früheren Variablen TOMCAT_USER und SUPERX_GROUP.
  • Bei WEBAPP_USER=superx und WEBAPP_GROUP=tomcat kann die Migration häufig ohne root erfolgen.
  • Root wird nur benötigt, wenn Besitzer geändert oder Systemkonfigurationen angepasst werden müssen.