Aus Raspberry Pi Geek 03/2015

Mit Python, Flask und Bootstrap einen RasPi fernsteuern (Seite 3)

Dienstbarer Flaschengeist

Die Funktion dienst() (Zeile 27) besorgt sich zunächst den Benutzer- und den Rechnernamen und setzt dann die Variable vnconline auf None. Findet die folgende IF-Schleife jedoch eine PID-Datei im Verzeichnis ~/.vnc, geht sie davon aus, dass der Tight VNC-Server läuft und setzt sie auf True. Die Funktion socket ermittelt die lokale IP-Adresse des Raspberry Pi und gibt eine Fehlermeldung aus, falls das scheitert.

Beide Variablen finden sich in der Datei dienste.html wieder, die Listing 5 auszugsweise zeigt. Ist der VNC-Server offline (vnconline = None), zeigt die Weboberfläche keine IP-Adresse an und der Button trägt die Aufschrift Server starten. Ist vcnonline hingegen “wahr”, erfahren Sie dank {{ getip }}, welche IP-Adresse Sie im VNC-Betrachter nutzen müssen. Abfragen mit If beherrscht die Jinja2-Templating-Engine also auch.

Möchten Sie den VNC-Server starten und klicken dazu auf den Button VNC-Server starten, hängt das Formular im HTML-Quellcode beim Posten den String /startserver an die URL (Listing 5, Zeile 10). Der Block in den Zeilen 45 bis 60 des Python-Skripts in Listing 4 ist nun aktiv und erkennt dank des Platzhalters <vncstatus> und einer If-Abfrage, ob er den Server starten (Zeile 37) oder stoppen (Zeile 44) soll, was die Funktion subprocess.call übernimmt. Nach getaner Arbeit zeigt der Browser dank der redirect()-Funktion von Flask wieder die Seite dienste.html an.

Listing 5

[?]
<td>{% if not vnconline %}
        IP-Adresse: Unbekannt (Offline)
       {% else %}
            IP-Adresse: {{ getip }}:5901 (Online)
       {% endif %}
</td>
[?]
<td>{% if not vnconline %}
        <form class="navbar-form navbar-left" action="/startserver" method="post">
            <input type="submit" class="btn btn-default" value="VNC-Server starten"></input>
        </form>
[...]

Noch ein kräftiger Zug

Ähnlich funktioniert der Code ab Zeile 63, nur dass der Nutzer hier sein Root-Passwort in eine HTML-Zeile eingibt, um den RasPi neu zu starten. Das Eingabefeld ist auf 128 Zeichen begrenzt, die Eingabe findet verdeckt statt. Dennoch schickt Flask das Root-Passwort im Klartext über das Netz, das gilt es zu ändern, wenn die Möglichkeit besteht, dass andere den Datenstrom abfangen.

Taucht in der URL das Stichwort /reboot auf, liest die Flask-Methode request.form() zunächst das Passwort und legt es in passwd ab. Eine Instanz der Klasse subprocess.Popen setzt auf dem Raspberry Pi einen echo-Befehl ab, gefolgt von dem Passwort und legt das Ergebnis in rbt1 ab.

Die nächste Instanz von subprocess.Popen übergibt die Ausgabe des Befehls echo als Standardeingabe an sudo -S reboot. Im dritten Schritt sendet communicate()[0] die Daten. Die Python-Dokumentation empfiehlt diese Funktion, da stdout=PIPE und stderr=PIPE eventuell Deadlocks hervorrufen.

Fazit

Im lokalen Netzwerk steuern Sie einen Raspberry Pi dank Flask auf eine Weise, die durch Einfachheit und moderne Technik besticht, und das mit vergleichsweise wenig Aufwand. Aufwendiger fällt das Szenario aus, wenn Sie den RasPi als Server über das Internet erreichen möchten.

Obschon ein Micro-Framework, fühlt sich Flask selbst im professionellen Umfeld zu Hause und integriert sich gut in Webserver wie Apache, Nginx oder Lighthttp. Es beherrscht sichere Authentifizierung, Sessions mit kryptografisch unterschriebenen Cookies, Caching, Internationalisierung und bringt eine Abstraktionsschicht für Datenbanken mit. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben