SQL-History Adapter – Einstellungen der Datenpunkte sichern/wiederherstellen

Vor kurzem war es notwendig, dass ich aufgrund einer Aktualisierung eines Adapters im ioBroker Smart-Home-System, die bisher angelegten Datenpunkte komplett löschen und neu erzeugen musste.

Wichtig hierbei zu beachten: Es dann auch alle SQL-History Adapter Einstellungen für die betroffenen Datenpunkte gelöscht.

Um nicht alle Einstellungen manuell zu sichern und anlegen zu müssen, habe ich zwei kleine JavaScript Programme (nachfolgend „Script“ genannt) geschrieben, welche die Aufgaben übernehmen.

Es wurde jeweils für die Sicherung der Einstellungen und für die Wiederherstellung ein eigenes Script erzeugt. Diese können unabhängig voneinander ausgeführt werden.

Script – Backup (Sicherung)
Liest die aktuellen Einstellungen für alle vorhandenen Datenpunkte aus, bei denen der SQL-History Adapter aktiviert ist. Dafür wird die Funktion getEnabledDPs verwendet, welche direkt vom Adapter zur Verfügung gestellt wird. Die Einstellungen werden in einem eigenen Datenpunkt gesichert, welcher vom Script automatisiert angelegt wird.

Script: iobroker_sql_history_backup_dp_settings.js

Script – Restore (Wiederherstellung)
Stellt die gesicherten SQL-History Adapter Einstellungen wieder her, welche zuvor über das Backup-Script in einem Datenpunkt gespeichert wurden. Zum Setzen der Einstellungen wird die Nachrichten-Funktion enableHistory verwendet, welche direkt vom Adapter zur Verfügung gestellt wird.

Script: iobroker_sql_history_backup_restore_dp_settings.js

Script – Voraussetzungen
Damit die Scripte funktionieren und ausgeführt werden können, müssen nachfolgende Adapter als Instanz unter ioBroker installiert und eingerichtet sein.

ioBroker.sql (History) Adapter
– ioBroker.javascript Adapter

Script – Installation
Jedes Script muss in ioBroker jeweils als eigenes Script vom Typ „JavaScript“ angelegt werden.
Ggf. müssen am Script selbst die Parameter für die Instanzen oder wenn gewünscht die ID des Datenpunkts entsprechend angepasst werden.

Script – Quellcode
Aktuelle Version der Scripte findet man unter:
https://github.com/mesche/iobroker-scripts/tree/master/iobroker_sql_history_backup_dp_settings

Ungültige / abgelaufene (expired) Schlüssel der Linux-Paketquellen unter Debian aktualisieren

Bei der Wartung des Linux-Betriebssystems Debian trat das Problem auf, dass die GPG-Schlüssel des GNU-Privatsphärenschutzes (GNU Privacy Guard) von einzelnen Paketquellen abgelaufen (engl. expired) waren. Genauer gesagt trat dieses Problem beim Neueinlesen bzw. Aktualisieren der verfügbaren Pakete auf.

 sudo apt-get update 

Analyse

Um sich alle abgelaufenen Schlüssel auflisten zu lassen, kann folgender Befehl verwendet werden.

 sudo LANG=C apt-key list | grep -A 1 expired 

Mit dem Parameter "LANG=C" wird sichergestellt, dass die Ausgabe der Liste immer in englisch erfolgt und zwar unabhängig von der aktuellen Spracheinstellung des Betriebssystems. Somit kann mit grep nach dem Wort "expired" gefiltert werden.

Lösung

Um das Problem zu lösen, muss der abgelaufene Schlüssel aktualisiert werden.

 sudo apt-key adv --keyserver keys.gnupg.net --recv-keys $KEY$ 


Mit dem Programm apt-key  für den Schlüsselverwaltungsdienst
, kann der vom Programm Advanced Package Tool (apt) zur Authentifizierung von Paketen verwendete Schlüsselring verwaltet werden. Der Parameter "$KEY$" muss natürlich durch den entsprechenden Schlüssel ersetzt werden.

 sudo apt-key adv --keyserver keys.gnupg.net --recv-keys B188E2B695BD4743 

Danach sollte „apt-get update“ wieder ohne Fehlermeldung durchgeführt werden können.

Warn-App NINA – Eventhandler-Script um Nachrichten zu verarbeiten & weiterzuleiten

Mit der Notfall-Informations- und Nachrichten-App (NINA) des Bundes, können wichtige amtliche Warnungen und Informationen erhalten werden. Dazu zählen u. a. Informationen des Bevölkerungsschutzes für unterschiedliche Gefahrenlagen wie z. B. Gefahrstoffausbreitung, Wetterwarnungen des Deutschen Wetterdienstes und Hochwasserinformationen der zuständigen Stellen der Bundesländer.

Script – Beschreibung
Damit nicht jede Person in unserer Familie die NINA-App installieren muss, wurde ein kleines Script entwickelt, welches diese Informationen regelmäßig verarbeitet und an unterschiedliche Systeme weiterleiten kann. Implementiert wurde bisher die Anbindungen der Notification-Dienste für Pushover und Telegram.

Script – Voraussetzung
Durch den NINA-Adapter für ioBroker, können diese Nachrichten regelmäßig abgerufen und in das System integriert werden. Diese ist Voraussetzung und muss vorab installiert werden.

Je nachdem welche Anbindung verwendet werden soll, muss hierzu ein entsprechender Adapter für den Dienst installiert und eingerichtet werden.
Pushover Adapter
Telegram Adapter

Script – Quellcode
Aktuelle Version des Scripts findet man unter:
https://github.com/mesche/iobroker-scripts/tree/master/nina_messages_eventhandler


Workaround: Script-Editor – Icons werden nicht angezeigt – Codicon Font defekt

Seit einigen Versionen (aktuell 5.0.15) des Javascript Script Engine – Adapters für ioBroker besteht leider das Problem, dass die Icons/Grafiken im Script-Editor nicht mehr angezeigt werden.

Ursache:
Der Grund für das Problem dürfte eine defekte Codicon TrueType-Schriftartendatei sein. Diese stellt normalerweise die Grafiken für die Icons bereit.

Bug-Tickets:
Ticket #751 – Suchfunktion -> Grafikfehler
Ticket #761 – Icons are not displayed

Workaround:

cd /opt/iobroker/
cd node_modules/iobroker.javascript/admin/vs/base/browser/ui/codicons/codicon/
cp codicon.ttf codicon.ttf-org
curl -L -o codicon.ttf https://github.com/microsoft/vscode-codicons/blob/main/dist/codicon.ttf?raw=true
iobroker upload javascript

Workaround zurücksetzen:

cd /opt/iobroker/
cd node_modules/iobroker.javascript/admin/vs/base/browser/ui/codicons/codicon/
mv codicon.ttf-org codicon.ttf
iobroker upload javascript

Wichtig: Ggf. Pfad zum ioBroker-Verzeichnis anpassen und Befehle mit entsprechenden Benutzer ausführen.

Ergebnis:

Node „pcap“ Module – Error: „socket: Operation not permitted“ – Fehler wenn PcapSession geöffnet wird

Für unixartige Betriebssysteme stellt die Bibliothek „libpcap“ (packet capture library) Funktionen zur Verfügung, um den Datenverkehr, welcher über die Netzwerkschnittstellen läuft, mitzuschneiden und zu analysieren. Das JavaScript Modul „pcap“ stellt die entsprechenden Bindungen (engl. Bindings) für diese Bibliothek zur Verfügung. Diese können dann mit Node.js verwendet werden.

Problem

Diese Bibliothek wird gerne in Node.js Modulen, wie z. B. dem Amazon Dashbutton Adapter für ioBroker, verwendet. Da die libpcap Bibliothek auf Funktionen des Betriebssystems zugreift, kann es zu folgender Fehlermeldung kommen, wenn der Code ausgeführt wird.

Error: socket: Operation not permitted

Der Benutzer, durch den der Code ausgeführt wurde, besitzt anscheinend nicht die notwendigen Rechte.

Am Beispiel des Amazon Dashbutton Adapters, würde dann folgende Fehlermeldung im Log auftauchen.

error   at Adapter. (/opt/iobroker/node_modules/iobroker.amazon-dash/main.js:50:29)
error   at Object.exports.createSession (/opt/iobroker/node_modules/iobroker.amazon-dash/node_modules/pcap/pcap.js:123:12)
error   at new PcapSession (/opt/iobroker/node_modules/iobroker.amazon-dash/node_modules/pcap/pcap.js:49:39)
error   Error: socket: Operation not permitted
error   uncaught exception: socket: Operation not permitted

Lösung

Um das Problem zu lösen, müssen die Dateisystem „Capabilities“ für das Programm „node“ angepasst werden. Dies kann durch das Kommandozeilen-Tool „setcap“ erreicht werden.
Hierzu muss folgender Befehl in der Kommandozeile ausgeführt werden.

sudo setcap 'cap_net_raw,cap_net_admin+eip' $(readlink -f $(which node))

Mit dem Tool „getcap“ kann geprüft werden, ob alles korrekt gesetzt wurde. Hierzu muss folgender Befehl in der Kommandozeile ausgeführt werden.

sudo getcap $(readlink -f $(which node))

Dies Ausgabe sollte dann z. B. so aussehen:

/usr/bin/nodejs = cap_net_admin,cap_net_raw+eip

Hier noch eine kurze Erklärung aus der Dokumentation

 In many distributions you can use the 'setcap' utility to add capabilities to individual files.
 CAP_NET_RAW: 
       Allow use of RAW and PACKET sockets.
 CAP_NET_ADMIN:
       Allow various network-related operations (e.g. setting privileged socket options, enabling multicasting, setting promiscuous mode, interface configuration, modifying routing tables).
       The “+eip” means you’re adding the file capability sets Effective, Inherited and Permitted.
       
       Each thread has three capability sets containing zero or more of the above capabilities: 
		 The three file capability sets are:
             e: Effective  -  The capabilities used by the kernel to perform permission checks for the thread. 
             i: Inherited  -  The capabilities preserved across an execve(2). A child created via fork(2) inherits copies of its parent's capability sets. See below for a discussion of the treatment of capabilities during exec(). Using capset(2), a thread may manipulate its own capability sets, or, if it has the CAP_SETPCAP capability, those of a thread in another process.
             p: Permitted  -  The capabilities that the thread may assume (i.e., a limiting superset for the effective and inheritable sets). If a thread drops a capability from its permitted set, it can never re-acquire that capability (unless it exec()s a set-user-ID-root program).


Prüfung

Um zu prüfen, ob das pcap Module korrekt funktioniert, kann die im Module mitgelieferte Bespieldatei „network_grep.js“ über die Kommandozeile ausgeführt werden. Diese Datei befindet sich z. B. im Ordner „node_modules“ unter pcap/examples/network_grep.js

Beispiel Befehl:

node /opt/iobroker/node_modules/pcap/examples/network_grep.js

Hier sollte dann folgender Fehler NICHT mehr auftreten:

/opt/iobroker/node_modules/pcap/pcap.js:49
        this.link_type = this.session.open_live(this.device_name, this.filter, this.buffer_size, this.outfile, packet_ready, this.is_monitor);

Error: socket: Operation not permitted
    at new PcapSession (/opt/iobroker/node_modules/pcap/pcap.js:49:39)
    at Object.exports.createSession (/opt/iobroker/node_modules/pcap/pcap.js:123:12)
    at Object.<anonymous> (/opt/iobroker/node_modules/pcap/examples/network_grep.js:2:25)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.runMain (module.js:605:10)
    at run (bootstrap_node.js:427:7)