Diese Seite ist statisches HTML und am besten betrachtet mit Java-Script eingeschaltet!

Fernbedienung eines Linux-Computers per mobilem Gerät - webradio aufrufen

 ·  ☕ 5 Min. Lesen  ·  🤖 SWU

Energie, Strom kostet plötzlich viel mehr

Die Energiepreise steigen und das Bewusstsein über Energieverbrauch steigt und das Bestreben, Energie zu sparen auch, denn man ist selbst davon betroffen.
Ich mache mir daher auch neue Gedanken zu dem Thema und versuche, neu zu überlegen, was sich da in meinem Haushalt erreichen lässt.

Strom aus

Am besten wäre, Energie gar nicht erst zu verbrauchen und das ist ein Punkt, den ich für meinen Hauptcomputer öfter realisieren möchte. Ich habe einen Standard PC mit Linux, den ich täglich zum Surfen und so nutze, sowie einen mit Windows zum daddeln und einen Mini-PC, d. i. ein Intel-NUC, die Datenhalde für mein LAN, der läuft bei mir immer, genau wie der Kühlschrank auch, ist aber ein Geringverbraucher, den ich mir so leisten möchte. Der NUC ist headless, also ohne Monitor und Tastatur, nur über das Netzwerk zu erreichen - normalerweise greif ich darauf nur zu, wenn ich einen Standard-PC in Betrieb habe. Wenn ich nicht daddel ist das Windows aus, wenn ich aber zuhause bin, läuft der Linux Rechner - ihn habe ich auserkoren, öfter aus zu sein, auch wenn ich da bin.

Designfragen

Wenn ich also Aufgaben, die ich normalerweise am Hauptcomputer mache, auf den NUC migrieren kann, weil das gar nicht oder nur wenig interaktive Prozesse sind, brauche ich dennoch Start- und Stoppmöglichkeiten dafür. Dafür stehen zur Verfügung Smartphone und ein altes Tablet. Ich kann natürlich eine SSH auch von einem mobilen Gerät durchführen, allerdings ist die nicht haptische Tastatur nervtötend, weil die Tasten so klein sind und mechanisches Feedback fehlt. Ich wünsche mir dafür große Knöpfe, die auch auf dem kleinen Smartphone-Display ganz leicht auch mit dem fetten Daumen bedient werden können.

GUI ja, aber welche?

Eine native Android App kommt nicht in Frage, weil ich mir die nicht aus dem Ärmel schütteln kann. Ein Browser wäre da die einfachere Lösung. Das Thema Web-Entwicklung in seinen Details habe ich jedoch lange nicht mehr verfolgt. Ich wusste, was ich will, eine Fernbedienung für Aufgaben, die ich sonst per SSH von Computer zu Computer gemacht habe und zwar in Knopfform auf einem Smartphone. Da ich sonst keine Software für Mobile Geräte schreibe, soll es so sein, dafür einen Webbrowser zu verwenden. Der Mini-PC bekommt also einen Webserver, der die Knöpfe im LAN anbietet und eine Auswertung der rückfließenden Informationen.

Man braucht eine Webseite im responsive design (RWD), damit man sie auf einem Webrowser im Großformat und auch auf einem Smartphone in einer vernünftigen Darstellung benutztbar haben kann. Das ist vermutlich inzwischen Standard, dennoch habe ich bei der Auswahl eines hugo themes darauf explizit geachtet. Und natürlich müssen es große Knöpfe sein - ausgewählt habe ich “Bootstrap-BP hugo startpage” von Sebastian Pech - Hugo verwende ich ja sowieso schon für den Blog meiner Webseite. War ja klar, dass das zunächst mein Ausgangspunkt ist.

PHP vermutlich mit Javascript um mein Ziel zu erreichen scheinen angebracht zu sein. Ich habe durchaus viel davon gehört und gesehen, aber ich habe mich nie wirklich damit beschäftigt - das hätte ich also erst lernen müssen. Was ich schon mal gemacht habe, ist CGI-BIN zu verwenden, um Skripte auf dem Webserver aufzurufen. Das ist, wie ich höre, alte Technik. Aber ich schätze mal, selbst wenn ich das mit PHP und Javscript programmiere, wenn dann damit die Grenze zum Dateisystem des Computers überschritten wird, ist das genauso ein Sicherheitsthema, wie CGI-BIN und aktive Scripte zu verwenden.

Aktuelle Sicherheitstechnik des Webservers

Der Webserver-Benutzer ist reichlich unprivilegiert, so sehr, dass er z. B. das audio device gar nicht benutzen darf - er darf kein Webradio spielen. Im Gegensat zu früher ist es jetzt so, dass der Webserver-Benutzer im Normalfall nicht mal eine Datei in /tmp oder /var/tmp anlegen darf. Darf er schon, dass passiert dort dann aber in einem Sicherheitskontainer gesteuert durch sysmtemd. Wenn man sich dazu Zugriff verschafft (Root Berechtigung notwendig) und das Anlegen und Löschen einer bestimmten Datei überwacht, kann man als System-Benutzer Musik an- und ausschalten, denn der System-Nutzer darf das audio device benutzen.

Der erste Schritt ist getan

So weit bin ich schon. Ich ersetze einen Aufruf eines Ziels der Startpage-Konfiguration mit http://IP-Adresse NUC/cgi-bin/webradio.sh

Die serverseitige Datei webradio.sh hat folgenden Inhalt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/sh
echo "Content-type: text/html"
echo
echo
echo "<head>"
echo '<meta http-equiv="refresh" content="0; URL=http://<IP-Adresse NUC>/nucbian/">'
echo "</head>"
if [ -f /tmp/webradio.on ]; then
        echo "<h1>Stopping Webradio<h1>"
        rm /tmp/webradio.on
else

        echo "<h1>Starting Webradio<h1>"
        touch /tmp/webradio.on
fi
echo '<input value="Go Back" type="button" onclick="window.history.back()" class="back-button">'

Der Aufruf erzeugt eine sehr nüchterne Webseite, die den Status Webradio an/aus wechselt und sogar Auskunft darüber gibt, was getan wird, um gleich zurückzukehren. Falls die automatische Rückkehr mal nicht geht, gibt es auch einen Zurück-button. Wie man hier in wenigen Zeilen sieht, sorgt das Skript einerseits dafür, dass ordentlicher HTML-Code mit einfachem Javascript produziert wird, der vom Webserver ausgegeben werden kann und ausserdem wird Code ausgeführt, der schon ausserhalb der Fähigkeiten von HTML ist - das Anlegen einer Datei in /tmp.
Die Datei wird in Wirklichkeit durch systemd abgelegt in Sicherheitskontainer mit Namen “systemd-private-????????????????????????????????-apache2.service-??????”
Auf Dateiebene gehört dieses Verzeichnis user und group root, Berechtigungen sind nur für den root Benutzer konfiguriert. Dadurch hat ein unpriviligierter Systembenutzer darauf keinen Zugriff.
Damit wir das auswerten können, muss root das tun oder ein unprivilegierter Nutzer mit sudo.

Das user script web.watch.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/sh
sudo inotifywait -m -e create,delete \
        /proc/`pidof -s /usr/sbin/apache2`/root/tmp/ \
        | while read dir action; do
                #echo "File $file changed via $action in dir $dir"
                if [ "$action" = "CREATE webradio.on" ]; then
                        #echo on
                        mpv "http://somafm.com/sonicuniverse.pls" 2>&1 1>/dev/null &
                fi
                if [  "$action" = "DELETE webradio.on" ]; then
                        #echo off
                        killall mpv
                fi
        done

Dieses Skript prüft, ob eine bestimmte Datei in einem bestimmten Pfad angelegt oder gelöscht wird und in Abhängigkeit davon werden Prozesse gestartet oder beendet. Diese Konstruktion funktioniert bereits. Ich rufe das Skript einfach manuell mit nohup auf, dann läuft das. Das kann man noch weiter verbessern, indem man es von systemd verwalten lässt und auch die Möglichkeit, mpv mit einen socket zu verbinden, um so Informationsbeschaffung und Steuerungsmöglichkeiten zu nutzen, sind noch Ziele.

Der Beweis der Machbarkeit ist aber erbracht. Ich kann jetzt mit meinem Smartphone das Webradio ein- und ausschalten.

Screenshot vom Smartphone:

Smartphone PC-Fernsteuerung Webradio, more pictures at Gallery Photos
Screenshot Smartphone: Smartphone PC-Fernsteuerung Webradio, more pictures at Gallery Photos

wüsti
Author
SWU
human