Monatsarchive: Januar 2014

Ghost unter Mac OS X installieren

Ghost ist aktuell in aller Munde. So habe auch ich mir vorgenommen, mir das neue Blog-System mal etwas genauer anzuschauen. Gerade in diesem Moment steht der Download-Zähler immerhin schon auf 127.586. Das ist jedenfalls für mich schon Grund genug, mir einmal eine Testversion von Ghost auf Mac OS X lokal zu installieren. Wie das geht, möchte ich in diesem Beitrag einmal kurz zusammenfassen.

Wie schon in so vielen Beiträgen erwähnt, kann ich nur dazu raten brew zu installieren. Dabei handelt es sich um einen Paket-Manager für Mac OS X, welcher die Installation von neuer Software wirklich super einfach gestaltet. Ich habe kaum Pakete gefunden, welche nicht über brew verfügbar sind (momentan fällt mir sogar nichtmal ein Beispiel ein).

Die Installation stoßen wir also ganz einfach mit folgendem Befehl an:

Sobald man sich auf ghost.org registriert hat, kann man die Quellen herunterladen. Nachdem diese entpackt sind, findet man die Datei config.example.js. Diese wird einfach dupliziert und config.js genannt.

In dieser Datei ändern wir die Datenbankkonfiguration auf mySQL. Ich nutze mySQL einfach, weil ich lokal MAMP installiert habe – ihr könnt natürlich auch jede andere Datenbank nutzen. Per phpMyAdmin lege ich eine neue Datenbank namens „ghost“ an. Die Konfiguration wird dann wie folgt angepasst:

Damit mySQL auch lauffähig ist, wird das nötige Paket über npm installiert:

Danach können wir (im ghost-Verzeichnis) folgenden Befehl ausführen, um alle Abhängigkeiten zu installieren:

Nun können wir die Instanz von Ghost auch schon starten:

Die Ausgabe sollte dann in etwas so aussehen:

Gibt man nun die IP + Port in den persönlichen Lieblingsbrowser ein, wird man auch schon begrüßt. Das war ja wirklich einfach! Schaut man sich die Datenbank dann an, sieht man auch, dass einige Tabellen erstellt wurden – der Datenbankzugriff funktioniert also super.

Ghost Welcome

Folgt man dem Hinweis, dass man doch bitte /ghost/ aufrufen möchte, dann hat man die Chance einen Admin-Account anzulegen. Nachdem man das getan hat, kann man auch direkt mit dem Schreiben starten. Da ich lokal Postfix konfiguriert habe, bekomme ich auch gleich eine Begrüßungsmail.

Ghost Post

Und schon haben wir eine funktionierende Installation von Ghost. Tat doch gar nicht weh, oder? Ich werde mich jedenfalls in Zukunft etwas näher mit node.js und Ghost auseinander setzen. Ich denke, Ghost steht noch ganz am Anfang.

Projekt Raspberry Pi: Anwesenheit per SNMP ermitteln – Part 8

Ich habe schon öfter davon gelesen, dass manche ihre Anwesenheit per Bluetooth-Dongle am Raspberry Pi überwachen. Das funktioniert bestimmt auch gut – aber warum sollte man noch ein USB-Port mehr belegen und noch Geld für einen USB-Dongle ausgeben, wenn es noch viel einfacher geht – und zwar mit den Mitteln, die man schon zu Hause im Einsatz hat. Alles was man dazu benötigt, ist ein SNMP-fähiger Router und ein Smartphone mit WiFi-Zugang.

Der Plan sieht folgendermaßen aus: Sobald ich zu Hause bin, verbindet sich mein iPhone automatisch mit meinem WLAN. Natürlich bekommt es dann eine vom DHCP eine IP-Adresse zugewiesen. Anhand der registrieren Mac-Adresse können wir also überprüfen, ob ich zu Hause bin. Natürlich könnte man das Ganze auch mit einem einfachen Ping lösen (das geht sogar von Haus aus), aber leider geht das iPhone nach einer Zeit in den Standby-Modus und beantwortet keinen Ping mehr – das ist also sehr unzuverlässig. Der Plan ist also, den Router nach der Anwesenheit des iPhones zu fragen.

Schritt 1: Statische IP für das iPhone

Damit man das iPhone eindeutig identifizieren kann, muss man dafür sorgen, dass kein anderes Gerät im Netz irgendwann mal die entsprechende IP bekommt. Der Einfachheit halber, lösen wir das über den DHCP. Per Mac-Adresse vergeben wir also immer die selbe IP an das Smartphone. Auf dem iPhone bekommen wir Mac-Adresse über folgenden Menupunkt heraus: Settings / General / About / Wi-Fi Address (bzw. Einstellungen / Allgemein / Info / WLAN-Adresse). In meinem Fall bekommt es (weiterhin) die 106 im Netz.

Dieser Schritt ist zwar nicht unbedingt notwendig, da wir mit Mac-Adressen arbeiten werden, aber es hilft doch eindeutig die Übersicht zu behalten.

Schritt 2: SNMP-Variable ermitteln

Nun ist das SNMP leider nicht das einfachste Protokoll und ich stehe noch ganz am Anfang das Ganze zu verstehen. Unter SNMP gibt es den sogenannten Object-Tree. Um eine Konfigurationsvariable auszulesen, braucht man also den entsprechenden Pfad im Baum – klar soweit. Aber welche Variable kommt in Frage, um die Anwesenheit zu kontrollieren?

Erstmal schauen wir mit snmpwalk, was es denn alles auf dem Gerät zu der iPhone-IP alles gibt:

Leider ändert sich keines der gelisteten Ergebnisse, wenn man die WLAN-Verbindung am iPhone kappt.

Variablen

Die Variable ipNetToMediaPhysAddress (hier dokumentiert), wandelt eine IP-Adresse in eine physische Adresse (Mac-Adresse). Die Idee: Wenn das iPhone nicht mehr im Netz ist, kann man die physikalische Adresse auch nicht mehr ermitteln.

Funktioniert aber leider nicht. Mit einem Watch habe ich probiert, was passiert wenn ich das WLAN am iPhone ausschalte: Nach 5 Minuten habe ich immer noch die selbe Antwort erhalten. Nicht gut also.

Im offiziellen Wiki ist beschrieben, wie man eine Lösung mit SNMP realisiert. Leider ist das dort genutzte Objekt atPhysAddress (hier dokumentiert) als deprecated angegeben:

Wie wir uns gemerkt haben, sollte das iPhone die 106 bekommen. Ausgerechnet dieser Eintrag verhält sich anders und liefert ein Ergebnis, welches nicht gerade nach einer Mac-Adresse aussieht. Wenn man etwas genauer hinsieht, wird aber aus irgend einem Grund nur versucht die Mac-Adresse in einen String zu wandeln. Seltsam. Ein HEX-to-String-Converter bringt hier Licht ins Dunkle. Auf jeden Fall ist es aber das richtige Gerät.

Nachdem ich das WLAN am iPhone für ungefähr 15-20 Minuten deaktiviert hatte, ist der Eintrag aus der Liste dann auch verschwunden. Funktioniert also. Weiter im Text.

Schritt 3: Installation nötiger Software

Damit SNMP unter Perl verfügbar ist, müssen wir uns erst einmal das entsprechende Paket per cpan installieren:

Leider funktioniert die Installation bei mir nicht, und bricht mit folgender Meldung ab:

Daher versuchte ich mein Glück mit cpanminus:

Nach zirka 15 Minuten war die Installation erfolgreich:

Schritt 4: FHEM konfigurieren

Den Inhalt der Datei könnt ihr von hier kopieren.

Was nun noch fehlt, ist die Konfiguration des neuen Gerätes. Dafür arbeiten wir mit PRESENCE. Was dieser „Gerätetyp“ alles kann, steht sehr gut beschrieben in der Dokumentation von FHEM.

Weiterhin habe ich konfiguriert, dass nach 15 Minuten Abwesenheit des iPhones, alles im Wohnzimmer abgeschaltet werden soll (wobei WohnzimmerAlles ein Struct ist, welches alle Lampen enthält).

Nach einem Neustart von FHEM sollte man dann folgendes in der Weboberfläche erkennen.

FHEM iPhone Present

Spotify – Statistiken des Jahres 2013

Seit ungefähr einem halben Jahr nutze ich Spotify nun täglich, und bin ein großer Fan geworden. Was mir allerdings schon immer gefehlt hat, sind Spotify-Statistiken. Diese sind ohne weiteres über die Spotify-Oberfläche nicht abrufbar. Schade. Nun haben die Entwickler aber nachgelegt, und eine Statistik für 2013 veröffentlicht.

Die Statistiken enthalten nicht nur sehr interessante Informationen zu den beliebtesten Songs und Interpreten des Jahres, sondern auch ein paar persönliche. Ein Blick lohnt sich also in jedem Fall (selbst, wenn ihr noch gar kein Spotify nutzt).

So habe ich in den paar Monaten letztes Jahr bereits 4859 Songs gehört – das waren immerhin 16488 Minuten. Wie Scooter auf Platz 1 kommt ist mir allerdings ein wenig schleierhaft – da habe ich anderes (gefühlt) wirklich öfter gehört 😉 Dass ich ein großer Fan von Pohlmann bin, rechtfertigt auf jeden Fall das Top Album.

Hier könnt ihr die Statistiken abrufen.

Spotify-Statistiken

Ich bin gespannt, wie die Werte nächstes Jahr so aussehen.

Hotlink-Images auf der eigenen Seite finden

Eigentlich gehört es sich nicht den Traffic zu klauen und Bilder per Hotlink in die eigene Webseite einzubinden. Das bedeutet, dass man die Datei nicht auf dem eigenen Server einbindet, sondern einfach unter einer anderen URL einbindet, welche nicht unter der eigenen Kontrolle liegt.

Natürlich kann sich so ein Bild auch mal ändern oder gelöscht werden. Daher sollte man so ein vorgehen auf jeden Fall vermeiden. Doch wie findet man auf einer sehr komplexen Seite solche Bilder? Die Antwort lautet „killshot“. Die Ruby-Anwendung ist auf GitHub verfügbar und lässt sich ganz einfach über gems installieren.

Nun kann man einfach eine Domain angeben, welche nach Hotlinks durchsucht werden soll. Dabei kann man einige Domains ausschließen – das ist z.b. für Subdomains sinnvoll, oder wenn man ein CDN nutzt, oder eben Bilder von Flickr oder 500px einbindet. Ansonsten würde die Ergebnisliste ganz schnell sehr unübersichtlich.

Viel Erfolg.

Projekt Raspberry Pi: Kommandos per Button in FHEM ausführen

Michael hat mich in einem anderen Beitrag folgendes gefragt:

Hallo Matthias,
eine super Serie. Ich bin gerade dabei Fhem von Raspbian zu Raspbmc umzuziehen, da sind die Post sehr hilfreich. Lässt Du XBMC die ganze Zeit parallel laufen oder beendest Du es, um Ressourcen zu sparen?
Ich schalte den Raspberry Pi abends aus. Gibt es eine Möglichkeit dies über einen Button in Fhem zu realisieren?
Beste Grüße,
Michael

Die Antwort ist: Ja, klar! Wenn man sich die FHEM-Befehlsreferenz durchliest, liest man auch von Shell-Commands. Doch wie führt man diese aus? Folgendes bauen wir zusammen:

Dummy-Attribut:

Set the device attribute dummy to define devices which should not output any radio signals. Associated notifys will be executed if the signal is received. Used e.g. to react to a code from a sender, but it will not emit radio signal if triggered in the web frontend.

Notify-Define:

Execute a command when received an event for the definition <pattern>. If <command> is enclosed in {}, then it is a perl expression, if it is enclosed in „“, then it is a shell command, else it is a „plain“ fhem.pl command (chain). See the trigger command for testing it.

Möglichkeit 1: Einen Schalter umbauen

FS20 ist nicht konfiguriert, macht aber nichts (und wird von meinem auf HomeMatic konfigurierten Stick auch nicht unterstützt). Eigentlich sogar gut, da ich es als Indikator dafür nutzen kann, die entsprechenden Dummy-Buttons ohne Funktion damit zu kennzeichnen. Wie oben gesehen, sorgt das Dummy-Attribut dafür, dass keine Signale versendet werden. Perfekt also – wenn auch etwas umständlich gemacht. Ein notify wird aber dennoch ausgeführt – dieses nutzen wir also, um einen Befehl auszuführen.

Mit dem Befehl eventMap, kann man die Standard-Kommandos umbenennen. So heißt „off“ ab jetzt „speak“. Den On-Button entfernen wir, indem wir per webCmd nur noch den speak-Befehl angeben.

Um zu testen, ob es funktioniert, sende ich „test“ an die Wall. Wenn man nun per SSH angemeldet ist, sieht man die Ausgabe auch sofort. Funktioniert also!

Möglichkeit 2: Einen Dummy anlegen

Beim Erstellen der ersten Möglichkeit, ist mir folgendes in den Sinn gekommen:

Wir legen ein Dummy-Gerät an. Dieses hat noch keine Kommandos, also legen wir welche an (so viele wie man möchte). In diesem Fall nur „test“. Per notify lassen wir uns benachrichtigen, wenn ein entsprechender Befehl gesendet wurde. Das schöne: Wir können beliebig viele Befehle unter einem „Dummy-Gerät“ anlegen und mit verschiedenen Notify-Actions, unterschiedliche Aktionen ausführen. Perfekt!

Ich würde sagen: Frage beantwortet, oder Michael?

Raspberry Pi: Zugriff auf FHEM per HTTPS sichern

Da man die Passwörter nicht per Klartext durch das Web jagen möchte, ist es ratsam, eine gesicherte Verbindung zu nutzen. Um die nötigen Zertifikate zu erstellen, braucht man folgende Pakete:

Danach wechseln wir in das richtige Verzeichnis für die Zertifikate und erstellen diese:

Danach folgen einige Fragen zu Standort und Name:

Nun bewegen wir die neuen Daten noch an die richtige Stelle und setzen ein paar Berechtigungen:

Nun fügen wir noch folgende Zeile in die Konfiguration /opt/fhem/fhem.cfg ein

Nach einem Neustart von FHEM ist das Webfrontend nur noch über HTTPS erreichbar. Natürlich ist das Zertifikat nicht signiert und die gängigen Browser werden sich beschweren, dass die Verbindung nicht sicher sei, aber verschlüsselt wird die Verbindung trotzdem.

Es ist zu beachten, dass das Attribut die Smartphone- (Port 8084) und Tablet-Version (Port 8085) separat angegeben werden muss:

Da ich diese Ports aber nicht aus dem Internet freigegeben habe, werde ich die Verbindung dorthin auch nicht sichern. Das ist aber jedem selbst überlassen – schaden kann es am Ende nicht.

Raspberry Certificate

Raspberry Pi: Firewall richtig konfigurieren (iptables)

Kurz vor weg: Ich bin kein Linux-Experte. Daher kann ich keine Garantie auf die Vollständigkeit dieses Artikels geben. Die Änderungen an der Firewall des Betriebssystem sollten somit nur mit genauer Vorsicht unternommen werden.

Als ich vor einigen Wochen die no-ip-Konfiguration auf meinem Raspberry Pi durchgeführt habe, kam ich per Port Forwarding über meine Domain zwar super auf mein MacBook Pro (MAMP), aber ich hatte irgendwie keine Möglichkeit auf mein Raspberry Pi zuzugreifen. Schuld war die Firewall (iptables), welche vorkonfiguriert ausgeliefert werden:

Um zu testen, ob der Zugriff mit abgeschalteten Regeln funktioniert, kann man alle Regeln mit folgendem Befehl temporär (bis zum nächsten Neustart) deaktivieren:

Nun funktioniert zwar der Zugriff, aber auch alles andere ist weit geöffnet. Über einen Port-Scanner kann der aktuelle Status abgefragt werden. Da ich aber nur bereitstellen möchte, was ich auch wirklich nutze, stört es mich etwas, dass beispielsweise auch mySQL und SMTP geöffnet sind. Eine Liste der offenen Ports bekommt man mit:

Auf Port 8080 läuft beispielsweise das XBMC Media Center – das muss wirklich nicht übers Netz zugänglich sein. Ich gehe also zur Sicherheit nach dem Ausschlussverfahren durch: Alles was nicht explizit erlaubt ist, wird verboten. So muss ich mir über die Firewall keine Gedanken machen, wenn ich in Zukunft weitere Dienste installieren sollte. Sicher ist sicher.

Als erstes ist also SSH dran. Da die Regeln von oben nach unten abgearbeitet werden, füge ich vor dem DROP aller Verbindungen, einfach die Ausnahmen hinzu, die von überall erreichbar sein sollen. Angefangen wird mit SSH:

Dieser Befehl fügt die Regel an die dritte Stelle in der INPUT-Sektion ein.

Damit die Regeln bei jedem Boot angelegt werden, fügen wir sie in die folgende Datei ein:

Ich weise hiermit ausdrücklich darauf hin, dass nicht die schönste Art und Weise ist, die Regeln zu hinterlegen. Wie es besser geht, kann man in diesem Beitrag nachlesen. Die sauberere Variante, wäre sicher eine Definition in der Datei /etc/network/if-up.d/secure-rmc

Viel Erfolg! Ich bin jedenfalls endlich online.