diff --git a/module/etl/ladejobs.jsp b/module/etl/ladejobs.jsp new file mode 100644 index 0000000..f5bfed4 --- /dev/null +++ b/module/etl/ladejobs.jsp @@ -0,0 +1,164 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ page import="java.io.BufferedReader, java.io.InputStreamReader, java.io.IOException, java.io.StringWriter, java.io.PrintWriter" %> + + + Ladejobs + + + +
+
+ <% + boolean allSuccess = true; + boolean anyRunning = false; + try { + Runtime runtime = Runtime.getRuntime(); + + // Execute the system command + String[] commands = {"/bin/sh", "-c", "cd ~/alex_skripte/laderoutine && laderoutine.sh"}; + Process process = runtime.exec(commands); + + // Read the output of the command + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + + // Start HTML table + out.println(""); + out.println(""); + + // Process each line and add to the table + while ((line = reader.readLine()) != null) { + // Split the line into columns + String[] columns = line.split("\\t"); + out.println(""); + for (String column : columns) { + out.println(""); + } + out.println(""); + + // Check the status column (assuming it's the fourth column) + String status = columns[3].trim(); + if (status.equals("Fehler")) { + allSuccess = false; + } else if (status.equals("läuft gerade...")) { + anyRunning = true; + } + } + + // End HTML table + out.println("
ModulStartEndeStatus
" + column + "
"); + + // Read the error stream of the command + BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + while ((line = errorReader.readLine()) != null) { + out.println("ERROR: " + line); + } + + // Wait for the command to complete + int exitCode = process.waitFor(); + // out.println("

Exited with code: " + exitCode + "

"); + } catch (IOException | InterruptedException e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + out.println("Error: " + sw.toString()); + } + %> +
+
+
+
+
+
+
+
+
+ + diff --git a/module/etl/laderoutine/laderoutine.awk b/module/etl/laderoutine/laderoutine.awk new file mode 100644 index 0000000..622a9c3 --- /dev/null +++ b/module/etl/laderoutine/laderoutine.awk @@ -0,0 +1,49 @@ +BEGIN { + row = 1; + log_beginn = 0 +} + +function eof() { + rows[row++] = sprintf("%-10s\t%-20s\t%-20s\t%-10s\t",modul, start, ende, status) +} + +/^-- Start [A-Z][^a-z]/ { + if (log_beginn != 0) { + ende = "" + eof() + } + log_beginn = 1; + modul = $3; + start = $6" "$7; + next +} + +/^Aktion / { + status = "läuft gerade..." + next +} + +/(^Ein Fehler ist aufgetreten|^Es ist ein Fehler aufgetreten)/ { + status = "Fehler"; + next +} + +/^-- Ende [A-Z][^a-z]/ { + ende = $6" "$7; + if (status !~ /Fehler/) { + status = "Erfolg" + } + eof(); + log_beginn = 0; + next +} + +END { + if (log_beginn != 0) { + ende = "" + eof() + } + for (i = 1; i <= row - 1; i++) { + print rows[i] + } +} diff --git a/module/etl/laderoutine/laderoutine.sh b/module/etl/laderoutine/laderoutine.sh new file mode 100644 index 0000000..d455620 --- /dev/null +++ b/module/etl/laderoutine/laderoutine.sh @@ -0,0 +1,31 @@ +#!/usr/bin/bash + +ERFOLG_LOG=/home/superx/db/module/erfolg/L_ERFOLG_update.log +GANG_LOG=/home/superx/db/module/gang/L_GANG_update.log +ZUL_LOG=/home/superx/db/module/zul/L_ZUL_update.log +QA_LOG=/home/superx/db/module/qa/L_QA_update.log +SOS_LOG=/home/superx/db/module/sos/L_SOS_update.log +COSTAGE_LOG=/home/superx/db/module/costage/L_COSTAGE_update.log + +logs="" + +if [ -f $ERFOLG_LOG ]; then + logs="$logs $ERFOLG_LOG" +fi +if [ -f $GANG_LOG ]; then + logs="$logs $GANG_LOG" +fi +if [ -f $ZUL_LOG ]; then + logs="$logs $ZUL_LOG" +fi +if [ -f $QA_LOG ]; then + logs="$logs $QA_LOG" +fi +if [ -f $SOS_LOG ]; then + logs="$logs $SOS_LOG" +fi +if [ -f $COSTAGE_LOG ]; then + logs="$logs $COSTAGE_LOG" +fi + +awk -f laderoutine.awk $logs | sort -r -b -k 2.7,2.10 -k 2.4,2.5 -k 2.1,2.2 -k 3.1,3.2 -k 3.4,3.5 -k 3.7,3.8 diff --git a/module/etl/portlet.sql b/module/etl/portlet.sql new file mode 100644 index 0000000..1750275 --- /dev/null +++ b/module/etl/portlet.sql @@ -0,0 +1,40 @@ +INSERT INTO sx_portlet +( + name, + TYPE, + class, + icon, + content, + sortnr_initial, + visible, + gueltig_von, + gueltig_bis +) +VALUES +( + 'Status Ladejobs', + 'HTML', + 'green', + 'icon-tasks', + ' + +

Automatische Aktuallisierung alle 60s

', + NULL, + 'all', + DATE '1900-01-01', + DATE '3000-01-01' +); + diff --git a/module/etl/readme.md b/module/etl/readme.md new file mode 100644 index 0000000..304cf35 --- /dev/null +++ b/module/etl/readme.md @@ -0,0 +1,34 @@ +# Ladeampel + +**Beschreibung** +Die Ladeampel kann in einem SuperX-Portlet eingebunden werden. Sie zeigt den Status der Laderoutinen der einzelnen Module. Dabei werden drei Zustände unterschieden: + +- **Erfolg**: Die Laderoutine ist erfolgreich durchgelaufen +- **läuft gerade**: Die Laderoutine wird gerade ausgeführt +- **Fehler:**: Die Laderoutine ist mit einem Fehler beendet worden + +## Installation + +Die Ladeampel besteht aus vier Komponenten: + +- **laderoutine.awk**: AWK-Programm, welches die Logfiles der Module einliest und den Status für jedes Modul ermittelt. +- **laderoutine.sh**: Bash-Skript, welches die Pfade zu den Logfiles der einzelnen Module enthält. Es ruft das AWL-Programm auf. +- **ladejobs.jsp**: Java Server Page, welche das Bash-Skript aufruft und für den Status eine Ampel und eine Tabelle mit dem Status aller Module ausgibt. +- **portlet.sql**: Enthält SQL-Insert-Statement zum Anlegen des Portlets in SuperX. Das Portlet enthält ein iFrame, welches die Java Server Page einbindet. Durch JavaScript wird das iFrame alle 60 Sekunden neu geladen, damit sich der Status aktuallisiert. + +Die Installation erfolgt in folgenden Schritten: + +1. Der Ordner *laderoutine* enthält das AWK-Programm und das Bash-Skript. Er kann z.B. im Home-Verzeichnis vom Linux-User *superx* abgelegt werden. +2. Die JSP-Datei muss in den Ordner `/home/superx/webserver/tomcat/webapps/superx/`. +3. In der JSP-Datei muss dann in Zeile 106 der Pfad zum Bash-Skript angepasst werden. +4. Zuletzt muss die SQL-Datei ausgeführt werden, um das Portlet anzulegen. +5. **Optional** Die Reihenfolge der Portlets wird über die tid der Tabelle `sx_portlet` bestimmt und lässt sich anpassen, um die Portlets umzusortieren, falls noch weitere Portlets vorhanden sind. + +## Verwendung + +Die Ampel sollte nun auf der Startseite von SuperX sichtbar sein. Alle 60 Sekunden wird die Ampel aktuallisiert, um den aktuellen Status anzuzeigen. + +## Kontakt + +- **Autor**: Alexander Bien (Universität zu Köln) +- **E-Mail**: a.bien@uni-koeln.de