Kategorien
Randnotiz

xtermjs – einfacher Terminal

Java ist eine Insel. Trotzdem muss man sich mit der Programmiersprache beschäftigen. Auf der Suche nach einer Möglichkeit, Terminaldaten auf einer Website darzustellen, stieß ich auf xterm.js

Tolles Beispiel dafür, eine einfache Sache möglichst kompliziert zu machen. xterm.js für sich, ist fast wertfrei. Es ist ein Render – es kann Text dargestellt werden und mit Javascript eine gewisse Logik programmiert werden. Nur im Zusammenspiel mit Anwendungen wie Node.js und socket.io kann es zumindest einfache Bash Befehle wiedergeben. Ein hoher Aufwand, weshalb ich das Projekt verworfen habe.

xterm auf Homepage

Für einfache Übungen aber ganz interessant. Als Demo bleibt es Online (Link). Im Netz finden sich einige Artikel, die etwas über die Programmierung erzählen – ich habe festgestellt, das sich die Syntax im Lauf der Jahre geändert hat. Bezüglich Instanzierung der Klasse und Referenzierung ist das Handbuch (Link) zu Rate zu ziehen.

Zum Code: Das Javascript, das den Terminal auf der Website darstellt, kann in simplen HTML Code aufgerufen werden. Zum Beispiel

Listing HTML Code

In Zeile 5 und 9 laden wir die Scripte. Unser Script ist term.js

var term = new Terminal({theme: {
    background: '#808080',
    color: '#8000ff'},
    cursorBlink: 'true'});
 term.open(document.getElementById('terminal'));
 term.writeln('HALSYSTEM Term \r\n');
 term.write("==> ");
 var input = "";
 term.onData(function (data, ev) {
    const code = data.charCodeAt(0);
    if (code == 13) {
       term.write('\n\r');
       if (input == 'Test') {
         term.writeln('ok');
         }
         input = "";
         } else {
       term.write(data);
       input += data;
       };                                   
 });

Es ist zu erkennen, das es ein simples Anzeigen von Terminaldaten ist und einfache if then Logik angewendet wird. Es lässt sich so zumindest etwas spielen. Bedeutet aber auch, das programmiert werden muss. Das Verhalten bei „Enter“ oder Eingabe von Triggerworten kann und muss programmiert werden. Viel Spass.

Kategorien
Randnotiz

Bash: Webhooks in MS Teams

Microsoft Teams lässt sich hervorragend für den EDV Support nutzen. Wie wäre es wenn der Kunde von der Website aus, direkt in den Techniker Kanal im Teams posten kann? Oder der Kundenserver im Fall einer Warnung, diese direkt publiziert?

Ein Webhook läßt sich jedem Kanal in jedem Team hinzufügen – Wir haben im Workshop ausgiebig geübt. Bisher haben wir Webhooks genutzt, um via Microsoft Visual Code, ganze Listings oder einzelne Zeilen im Micosoft Teams zu publizieren und zu diskutieren. Kopieren wir uns die URL des Webhooks.

Einstellung / Verwaltung der Connectoren in einem Kanal

Wie überträgt man nun eine Nachricht über den Webhook an den Microsoft Teams Kanal? Kurz: curl -H „Content-Type: application/json“ -d JSON URL. Diese Zeile in einem Bashscript würde ausreichen um eine Nachricht, als JSON Datensatz formatiert, der Webhook URL zu übergeben. Als Beispiel ein Bash Script:

#!/bin/sh

# Thomas Schilling Oktober 2019
# Testscript Webhook in Microsft Teams

WEBHOOK_URL="https://outlook.office.com/webhook/...."
TITLE=$1
shift
COLOR="#FF0000"
TEXT=$1

MESSAGE=$( echo ${TEXT} | sed 's/"/\"/g' | sed "s/'/\'/g" )
JSON="{\"title\": \"${TITLE}\", \"themeColor\": \"${COLOR}\", \"text\": \"${MESSAGE}\" }"

curl -H "Content-Type: application/json" -d "${JSON}" "${WEBHOOK_URL}"

Mit Aufruf des Bash Scripts übergeben wir eine Überschrift und einen Text. Das ist beliebig. Zum Beispiel möchte ich aktuelle Warnmeldungen der bund.de im Kanal veröffentlichen. In einem vorherigen Workshop haben wir mit den Wetterdaten bereits gespielt. Das PHP Script nutzen wir.

 $inhalt){
$m1 = $inhalt->info[0]->headline;
$m2 = $inhalt->info[0]->description;
        foreach ($inhalt->info[0]->area as $id2 => $in2){
                if ($in2->geocode[0]->value=='053780000000'){
                    $z++;
                    print('{"data": { "head": "'.$m1.'"}}');                
                    shell_exec('/teams.sh "'.$m1.'" "'.$m2.'"');
                } 
       }
}
if ($z==0){
print('{"data": { "head": "keine Gefahrenmeldung"}}');
}
?>

In den Zeilen 7 und 8 werden Überschrift und Gefahrenmeldung aus dem SOAP Array gelesen. In Zeile 13 rufen wir das obige Bash Script auf – In Zeile 8 des Bash Scripts teilen wir die übergebenen Texte. Die Farbe, der Meldung in Teams, ist im Bash Script in Zeile 13 im JSON Datensatz.

Meldung im Kanal
Gefahrenmeldung mit auffälliger Farbe im Kanal

Mit dem Bash Script lässt sich jeder Text publizieren. Zum Beispiel Fehlermeldungen oder Warnungen eines Kundenservers.

Kategorien
Randnotiz

PHP: PHP5.3 zu PHP5.4

Immer wieder kommt es zu Problemen, wenn PHP Versionen größer 5.3 installiert werden. Ab und an gehe ich auf Fehlersuche.

Log Dateien geben nicht unbedingt Auskunft – ich rufe mit der Konsole die index.php auf und arbeite mich, von da an im Gesamtwerk, weiter.

Integer Dezimal gedacht, Octal programmiert

Beschäftigt hat mich ein, im Browser nicht aufrufbaren Code, der diese Fehlermeldung erzeugte: Parse error: Invalid numeric literal in…………

Den „Fehler“, der keiner ist, findet man schnell. Seit PHP5.4 wird eine Zahl, mit vorangestellter 0 (Null) nicht als dezimal Integer sondern octal interpretiert. Für PHP ist 08 nicht 8 weil es Octal keine 8 gibt! Würde man 0x8 schreiben, ist die Zahl 8 Hexadezimal und auch dezimal 8 – octal allerdings 10.

Es muss also beim programmieren streng darauf geachtet werden, in welchem Zahlensystem man sich denn befindet. Abhilfe könnte ein Code Review mit suchen/ersetzen Bash Lauf sein, will man nicht File für File im VI Editor lesen.

Octales Zahlensystem im Vergleich zu dezimal, hexdezimal und binär. Quelle: Wikipedia

Kategorien
Randnotiz

PHP: inkompatibles ISPconfig

ISPConfig reagiert bei Update der PHP Pakete seltsam inkompatibel. In der Version, die ich produktiv nutze, geht nichts mit PHP > 5.6

Entgegen aller Empfehlung entwickle ich auf dem produktiven Systemen mit PHP7.4. Was ist zu tuen, will man nicht ISPConfig mit PHP7.4 updaten?

ISPConfig erzeugt Fehlermeldungen bzgl. mysqli und mbstring und stellt Betrieb ein.

Apache2 Mod PHP5 bleibt konfiguriert und ISPConfig kann über die server.sh Scriptdatei beeinflusst werden.

Verändert habe ich, das nicht der Default /usr/bin/php angesprochen wird – Default ist PHP7.4 – sondern explizit PHP5.

server.sh nicht auf Default /usr/bin/php stehen lassen

Jetzt funktioniert der User-Self-Support und es kann bei Gelegenheit ein Systemupgrade vollzogen werden.

Kategorien
Randnotiz Schulung

KPI: Dashboard

Freeboard hat einige Vorteile. Es ist schlicht, komplett offen programmierbar und leicht mit HTML oder JavaScript einstellbar. Um den Workshop nachvollziehen zu können, hier ein paar Eckpunkte.
Nach der Installation von Freeboard auf unserem Debian 9 System mit Apache2, muss noch eine Weile gesucht werden um sinnvolle Erweiterungen zu finden – je nachdem welche Darstellungen man zeigen möchte.

Im Bild oben ist unsere Finale index.html in der verschiedene JavaScript Widgets eingebunden sind. Das altgauge.js haben wir verändert.

zu grün ändernde Anzeige

In Zeile 29 ändern wir die Farbreihenfolge von rot über gelb nach grün. Besonderst interessant sind das HighChart, das einzelne Werte auf einer Zeitachse darstellt und die FLOT Widgets, die saubere Linien und Balkendiagramme ermöglicht. Grundsätzlich „versteht“ Freeboard JSON Datenquellen und ist per JavaScript einstellbar. JSON Datensätze sehen grundsätzlich gleich aus, unterscheiden sich aber je nach eingesetztem Chart. Mal werden einzelne Werte erwartet, mal x,y Werte.Einzelne Werte für Tachoanzeigen und/oder Text/HTML. Geschachtelte Werte für Linien- oder Balkengrafik.

Natürlich versteht Freeboard auch mehrdimensionale JSON Array’s. In der Praxis haben wir die Daten aus https://warnung.bund.de/bbk.dwd/unwetter.json genutzt. Dort werden Warnmeldungen nach Art und Ort ausgegeben. Es empfiehlt sich die Daten vor Darstellung lokal aufzuarbeiten, da die Darstellung aller Daten in einer nicht vorhersehbaren Reihenfolge nicht empfehlenswert ist. Wie sieht das im einzelnen aus:

Im PHP Code durchsuchen wir das Array in der ersten und zweiten Dimension – die Menge können wir nicht beeinflussen. Wir nehmen Unwetterwarnungen nur für unsere Geolokation die so übergeben wird: value“094780000000″. Welcher Ort welchem Wert entspricht kann unter (Link) gesucht werden. In unserem Fall rufen wir nur Unwettermeldungen für den Rheinisch-Bergischen-Kreis heraus.

Das Dashboard (Link) bleibt auf dem Server und wer Einzelheiten aus dem Code wissen möchte oder noch Fragen zur Datenaufbereitung hat, mag mich einfach fragen. Sendet doch Beispiele eurer Dashboards – wir können sie hier veröffentlichen.

Kategorien
Randnotiz

letsencrypt: pure-ftp Sicherheit

Ein kleines Script hilft um die pure-ftpd.pem zu erzeugen.

#!/bin/bash

# Thomas Schilling 26.07.2019
# pure-ftpd braucht einen zusammengesetzten Key

cat /etc/letsencrypt/live/hal49h.halsystem.de/privkey.pem /etc/letsencrypt/live/hal49h.halsystem.de/fullchain.pem > /etc/ssl/private/pure-ftpd.pem

# Neustart nicht vergessen

/etc/init.d/pure-ftpd-mysql restart

Zusammen mit letsencrypt als Cron-Job haben wir eine Sorge weniger

Kategorien
Randnotiz SAP

SAP: Grundlage DART und CS

Das Data Retention Tool (DART) unterstützt uns dabei, die gesetzlichen Anforderungen an die Datenhaltung und die Datenüberlassung für steuerliche Prüfungszwecke zu erfüllen (Grundsätze zum Datenzugriff und zur Prüfbarkeit digitaler Unterlagen (GDPdU)). Mit diesen Datenextrakten kann man auch brauchbare Auswertungen anfertigen und lassen sich beliebig oft im SAP Content Server archivieren. Die Archivierung im Content Server löscht und stellt lokale Dateien wieder her.

Mit der FTW1A grenzen wir die zu extrahierenden Daten ein und benennen die zu erstellenden lokalen Datendateien. Die Dateien werden lokal zunächst kompakt abgelegt. Für das Einlesen der Daten in der IDEA Software der Finanzverwaltung, sind die Dateien mit dem Splitter S_P6D_40000027 zu zerlegen.

Die Datenextrakte lassen sich über FTWL anzeigen und mit dem Datenexplorer detailiert darstellen. Die Datenextrakte sowie die zerlegten Dateien und Views können im SAP Content Server archiviert werden.

nach Archivierung werden Dateien lokal gelöscht

Treten bei diesem Szenario Fehler auf, kann das an einer Besonderheit im Customizing liegen.

Die Pfadangaben in der DART und Content Server Administration muss als Literal absolut gleich sein! Auch wenn IP und Netzwerkname logisch ein Ziel darstellen, kommt es zum Fehler wenn diese Angaben nicht absolut (Zeichen, Gross- Kleinschrift) gleich sind!

Nachdem die Daten archiviert wurden, finden wir sie auch in der Dokumentenanzeige OAAD wieder.

Kategorien
Randnotiz

Firewall: Entertain RTP mit VLC

Kommt schon mal vor, eine Sendung über den Laptop sehen zu wollen. Privat geniesse ich IPTV über den Provider meines Vertrauens, der Telekom.

Auf einem neu installierten Laptop läuft Fedora 30, mit eingeschalteter Firewall. VLC stoppt nach exakt 2 Minuten in jedem Stream! (Link)

Da keine Log-Datei irgendeinen Hinweis offenbarte habe ich Wireshark eingesetzt. Aus dem Telekom Forum wusste ich, dass das IGMP Protokoll entscheidend sein kann.

Im oberen Bild ist der Wireshark Mittschnitt zu sehen. Es ist zu erkennen, das der Router die Gruppenzugehörigkeit alle 120 Sekunden erneuert; der Laptop aber die Gruppe verlässt. Dadurch wird der Stream beendet.

IGMP muss als Protokoll für die entsprechende Zone, in der sich der Laptop befindet, frei geschaltet werden. Dazu reicht nicht ein simples

ACCEPT all — anywhere anywhere PKTTYPE = multicast

Pakettyp multicast mag richtig sein, greift hier aber nicht. Neben TCP und UDP muss das Protokoll IGMP expliziet eingetragen werden:

ACCEPT igmp — anywhere anywhere ctstate NEW,UNTRACKED

So funktioniert das Streamen unterbrechungsfei und ich kann meine Lieblingsserie geniessen

Qunicy über Telekom Entertain auf VLC Player
Kategorien
Randnotiz

Windows 10: keine Cam nach Update

Ärgerlich: die Kamera am Laptop lief Jahre lang, dann kommt ein Update und nichts geht mehr. Nur die Ruhe!

Öffnen wir regedit und navigieren zu den Einträgen

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Media Foundation\Platform

und

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\Platform

An beiden Orten fehlt der Eintrag

Neues DWORD 32 Bit mit dem Wert 0 (Null) –> EnableFrameServerMode

Dann läuft die Cam ohne Neustart.

Kategorien
Randnotiz Schulung

Debian: Offline Update

Das System auf dem neusten Stand zu halten, ist kein Hexenwerk. Das apt Werkzeug macht es uns einfach. Aber was, wenn zum Beispiel aus Gründen der Sicherheit, kein Zugriff auf das Internet möglich ist?

Mehr oder weniger aktuelle Updates lassen sich auch als DVD ISO Image auf einem anderen Computer mit WAN Zugang herunter laden (Link).

Das Image dann als CDROM einbinden – ich mache das über die fstab – und dann mit apt-cdrom als Repository dem System bekannt machen.

Hier kann sich das System unterschiedlich verhalten. Entscheident ist, dass das Image als /media/cdrom – so, wie es in der /etc/apt/sources.list eingetragen wurde – mounted, also verfügbar ist.

Das anschließende apt-upgrade installiert nun die Updates auf der DVD – apt autoremove anschließend nicht vergessen. Wird ein fehlender oder unbekannter Key moniert, die Zeile „deb cdrom:…..“ in der /etc/apt/sources.list auf „deb [ trusted=yes ] cdrom:…..“ ändern. Damit wird auch dem unbekannten Key vertraut und installiert die Quelle anstandslos.