Shell Scripte ausführen

Der übliche Verwendungszweck einer LogoControl Methode ist ein Bit im VM der LOGO für 250ms auf 1 zu setzen, um damit eine Aktion auszulösen. Aber sie hat noch eine andere Funktion: das Ausführen von Shell Scripten (oder *.bat/*.cmd unter Windows). Gerade in Kombination mit Triggern ergeben sich daraus unzählige Möglichkeiten, wie Benachrichtigung per E-Mail/SMS/Push-Notification bei bestimmten Ereignissen, Setzen der GPIO-Pins des Raspberry Pi’s, Wake-Up-On LAN, Logfiles schreiben usw. Alles was ihr dazu tun müsst, ist ein passendes Shell Script schreiben, welches die Aktion durchführt. LogoControl startet dann einfach dieses Script.

Das Script muss sich dazu im Unterverzeichnis „Scripts“ von LogoControl befinden und wird dann einfach als Parameter „script“ bei einer Methode angegeben:

<method id="1" name="WakeUp Office PC" script="wakeup_pc.sh" />

Aus Sicherheitsgründen (siehe Kasten Sicherheitshinweis) können beim Parameter „script“ nur die Zeichen a-zA-Z0-9space.-_’°?!, verwendet werden.  Es können dabei dem Script auch beliebige Argumente mitgegeben werden:

<method id="1" name="WakeUp Office PC" script="wakeup_pc.sh 'office' 'arg2'" />

Der Text „office“ ist dabei Argument 1, „arg2“ ist Argument 2. Man kann den „script“ Parameter der Methode auch mit dem „address“ Parameter kombinieren, so dass eine Methode dann beide Aktionen ausführt: Script starten und Bit in Logo für 250ms setzen.

Sicherheitshinweis
Das Ausführen von beliebigem Shell-Code über eine Anwendung, dessen Weboberfläche frei aus dem Internet erreichbar ist, birgt zwar hohes Potential, stellt jedoch auch gleichzeitig ein Sicherheitsrisiko dar. Zwar ist die Weboberfläche mit Benutzernamen/Passwort geschützt, aber hat ein Angreifer diese Hürde erst einmal überwunden, so könnte er nicht nur eure Logo steuern, sondern auch die volle Kontrolle über die Maschine übernehmen, auf welcher LogoControl läuft (innerhalb dessen Benutzer-Kontext). Noch schlimmer: da sich der Raspberry Pi, auf dem LogoControl läuft, bei den meisten von euch im selben Netz befinden dürfte wie eure PCs, NAS, Tablets, Smartphones etc. könnten potentielle Angreifer sogar Gerätegrenzen überwinden (z.B. Dateien vom NAS löschen).

Aus diesem Grund ist es nicht möglich direkt beliebige Shell Kommandos in der LogoControl-Konfiguration zu definieren, sondern lediglich die Angabe einer Script-Datei, welche sich im Unterverzeichnis „Scripts“ befinden muss, plus Argumente zu definieren. Auch sind für den Script-Dateinamen + Argumente nur eine begrenze Auswahl Zeichen (a-zA-Z0-9space.-_’°?!,) zulässig um eine Shell Injection zu vermeiden. Dennoch bleibt es in eurer Verantwortung sichere Shell-Scripte zu schreiben und z.B. wenn ihr Argumente beim Aufruf eures Skripts übergebt, diese auf sinnvolle Werte überprüft.

Beispiel 1: Push-Notification wenn Haustür geöffnet

Im folgenden Beispiel zeige ich wie die LOGO beim Öffnen der Haustür eine Push-Benachrichtigung auf mein Android-Smartphone senden kann. Ich verwende dazu die kostenlose App Pushbullet welche es für iOS und Android gibt. Welcher Sensor an der Haustür verbaut ist und wie die LOGO das Öffnen der Haustür erkennt wird hier nicht weiter behandelt. Wir gehen einfach davon aus, dass wir den Status an Adresse 100.0 im VM der Logo auslesen können. Eine 1 bedeutet „Haustür offen“ eine 0 dagegen „Haustür geschlossen“.

Für das Senden der Pushbullet Nachricht erstellen wir folgendes Shell-Script und speichern es im Unterverzeichnis „Scripts/pushbullet.sh“ ab:

!/bin/sh
#
ACCESS_TOKEN="place your token here"

timestamp=$(date "+%H:%M:%S")
title="$1"
body="$2\n($timestamp)"

curl --header "Authorization: Bearer $ACCESS_TOKEN" -X POST https://api.pushbullet.com/v2/pushes --header 'Content-Type: application/json' --data-binary '{"type": "note", "title": "'"$title"'", "body": "'"$body"'"}'
 

Bei ACCESS_TOKEN tragt bitte euer Access Token für den Pushbullet-Service ein. Dieses findet ihr, wenn ihr euch bei Pushbullet.com eingeloggt habt, in euren Account Settings. Damit das Script von LogoControl ausgeführt werden kann muss es natürlich noch auf der Kommandozeile als „ausführbar“ gekennzeichnet werden:

chmod +x pushbullet.sh

Anschließend könnt ihr es in LogoControl wie folgt einbinden:

<device id="1" name="ShellScripts">
	<method id="1" name="Pushbullet Hauttür geöffnet" script="pushbullet.sh 'Haustür' 'wurde geöffnet'" />
	<trigger plc="myLogo" address="100.0" datatype="bit">
		<onValue value="1" method="1" />
	</trigger>
</device>

Der Trigger überwacht die Speicheradresse 100.0 und sobald sich dort der Wert von 0 auf 1 ändert ruft er die Methode 1 auf, in welcher das Script gestartet wird. Das Script bekommt noch 2 Argumente übergeben, nämlich den Titel und den Inhalt des Pushbullets.

Beispiel 2: Loggen des Helligkeitswertes bei Änderung

Shell-Script „logvalue.sh“

#!/bin/sh
#

current_time=$(date "+%Y-%m-%d %H:%M:%S")
result=$(wget -qO- localhost:8088/rest/devices/48/attributes/1/value)

echo "$current_time;$result" >> ../Remote/Resources/logs/brightness.log

LogoControl-Config Eintrag

<device id="1" name="ShellScripts">
	<method id="1" name="Logeintrag Helligkeit" script="logvalue.sh" />
	<trigger plc="myLogo" address="234" datatype="uword">
		<onValue value="" method="1" />
	</trigger>
</device>