17 Stunden zuvor: Vorwärts nach weit

Ein Bild sagt ja angeblich mehr als tausend Worte. Nun, wie verhält es sich da wohl mit Videos?

12 Tage zuvor: Geschmackslehre

Immer wieder lustig:

“Endlich was zu essen!” “Was ist das denn…?”

12 Tage zuvor: GeoIP-Lookup in GeoRSS umwandeln

Um die Frage zu beantworten wie ich denn IP-Adressen in eine Google-Karte bekommen habe: Mittels geoip, GeoRSS und (logisch) Google-Maps. Und zwar folgendermaßen.

  • geoiplookup <IP> >> geolookup.txt speichert die Ausgabe in einer Datei.
  • Mit regulären Ausdrücken extrahiert man die Längen- und Breitenangaben.
  • Diese legt man als GeoRSS-Feed ab.
  • Den Feed wiederum kann man in Google-Maps importieren.

Fertig ist die Karte. Wer es ein wenig einfacher haben will, kann auch folgendes PHP-Script zum umwandeln der geoip-Ausgabe in einen GeoRSS-Feed nutzen.

PHP:
<?php

// Check for Data
if(!$_POST['geoiplookup']){
        ?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head></head>
        <body>
                <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>">
                        <textarea rows="20" cols="50" name="geoiplookup"></textarea><br />
                        <input type="submit" />
                </form>
        </body>
        </html>
        <?php
        die();
}

// Setup Variables
$regex  = "/^.+Rev 1: ([^,]+), ([^,]+), ([^,]+), ([^,]+), ([0-9\.\-]+), ([0-9\.\-]+), [^,]+, [^,]+$/";
$geodata['line']        = "<entry><title>%s, %s, %s</title><georss:point>%s %s</georss:point></entry>\n";
$geodata['points']      = array();
$geodata['rawdata']     = explode("\n", $_POST['geoiplookup']);

// XML-Special Characters-Function (alonso05 at gmail dot com)
function xml_character_encode($string, $trans=''){
        $trans = (is_array($trans)) ? $trans : get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
        foreach ($trans as $k=>$v)
                $trans[$k]= "&#".ord($k).";";
        return strtr($string, $trans);
}

// Parse input
foreach($geodata['rawdata'] as $data)
        if(preg_match_all($regex, $data, $results))
                $geodata['points'][] = array(
                        xml_character_encode(htmlentities($results[3][0])),
                        xml_character_encode(htmlentities($results[2][0])),
                        xml_character_encode(htmlentities($results[1][0])),
                        $results[5][0],
                        $results[6][0]
                );


// Create GeoRSS-Feed
header('Content-type: application/xml');
echo('<?xml version="1.0" encoding="utf-8"?>');
echo('<feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">');
foreach($geodata['points'] as $point)
        vprintf($geodata['line'], $point);
echo('</feed>');

?>

14 Tage zuvor: Digitales Anklopfen

Dass das Internet voller böser Menschen ist, bezweifelt ja mittlerweile niemand mehr. Gestern Abend bin ich zufällig auf einen neuerlichen Ansturm dieser Gruppe gestoßen. Eher zufällig, denn beim begutachten einer kleinen Bandbreiten-Statistik habe ich festgestellt, dass viele (sehr viele) Daten fließen obwohl kein Rechner an ist.

Port-Scan

Vorgestern gegen 20:00h hat es angefangen – und erst gegen Mitternacht aufgehört. Nur um dann 14 Stunden später wieder anzufangen und bis dato nicht mehr auf zu hören. Das dazugehörige Verbindungsprotokoll weist die unterschiedlichsten Ports auf, aber man scheint sich von unten nach oben durch-zuarbeiten. Die Vermutung liegt nah, dass es sich dabei um einen Portscan mittels Botnet handelt – wohl dem, der eine Firewall hat! Hier ein kleiner Auszug:

P SHost SPort DHost DPort QoS
UDP 98.243.114.146 44698 my_host (vlan1) 13989 Low
UDP 86.99.40.148 34185 my_host (vlan1) 13989 Low
TCP 71.68.96.135 60260 my_host (vlan1) 61456 Low
UDP 98.148.62.215 36126 my_host (vlan1) 13989 Low
TCP 64.12.24.34 5190 my_host (vlan1) 49261 Low
UDP 189.60.13.108 5620 my_host (vlan1) 13989 Low
UDP 208.114.36.253 47502 my_host (vlan1) 13989 Low
UDP 71.57.211.118 15711 my_host (vlan1) 13989 Low
TCP 64.12.8.93 5190 my_host (vlan1) 49258 Low
TCP 68.81.125.25 6415 my_host (vlan1) 61294 Low
UDP 65.55.158.116 3544 my_host (vlan1) 53283 Low
TCP 24.79.8.42 3701 my_host (vlan1) 56033 Low
TCP 69.235.134.90 9585 my_host (vlan1) 56001 Low
UDP 90.203.190.82 2800 my_host (vlan1) 13989 Low
UDP 67.82.27.105 8224 my_host (vlan1) 13989 Low
UDP 82.243.61.53 34095 my_host (vlan1) 13989 Low
UDP 69.144.216.97 25070 my_host (vlan1) 13989 Low
TCP 65.54.81.24 80 my_host (vlan1) 57724 High
UDP 24.144.203.229 32643 my_host (vlan1) 13989 Low
TCP 98.110.25.129 34278 my_host (vlan1) 56022 Low
TCP 65.55.182.111 80 my_host (vlan1) 56040 High
TCP 68.173.253.21 51024 my_host (vlan1) 55996 Low

Oder ein wenig graphischer:


View Scanners in a larger map

15 Tage zuvor: Fern-Fernsehen

Nachdem das ZDF seine Mediathek umgestaltet hat, funktionierte mein schöner Fern-Fernseher leider nicht mehr richtig. Das entsprechende Plug-In wurde nämlich leider nicht auf die neue Struktur umgestellt. Doch wie meinte mein alter Abteilungsleiter (streng genommen war es seine Frau) doch gleich? Darfst kein Depp sein. Ergo, selbst ist der Mann:

SH:
#!/bin/sh
d=`date +%y%m%d`
j="/media/public/heute_journal_$d.asx"
h="/media/public/heute_$d.asx"
s="/media/public/heuteshow$d.asx"

rm /media/public/heute_*.asx

wget -qO $j "http://wstreaming.zdf.de/zdf/veryhigh/"$d"_hjo.asx"
[ "$?" -ne "0" ] && \
        rm $j

wget -qO $h "http://wstreaming.zdf.de/zdf/veryhigh/"$d"_h19.asx"
[ "$?" -ne "0" ] && \
        rm $h

wget -qO $s "http://wstreaming.zdf.de/zdf/veryhigh/"$d"_heuteshow_hsh.asx"
[ "$?" -ne "0" ] && \
        rm $s

Das kleine Script läuft bei mir täglich um 18:00h (Mitternacht deutscher Zeit) und lädt die kleinen Streaming-Links herunter. Die wiederum kann XBMC problemlos abspielen. Leider bekommt man so nur die Auslands-Fassung mit (aus rechtlichen Gründen) weniger Beiträgen und an manchen Stellen ohne Bild. Aber immerhin.

16 Tage zuvor: Munin und Tomato

Munin ist eine System-Überwachung für Linux und, nachdem ich meinen Homeserver “neu aufsetzen” durfte, auch meine neue Lösung zur Überwachung des Heim-Netzwerks. Da Munin schön modular aufgebaut ist und den Status mehrerer Systeme zentral zusammenfasst, lag es nur nah auch den Router, der unter Tomato läuft, mit in die Überwachung zu integrieren.

Da es keine Möglichkeit gibt eine Munin-Node nativ unter Tomato laufen zu lassen, muss man auf SNMP zurückgreifen. Denn einen SNMPd gibt es mit integrierten Bibliotheken in kompakter Form bereits fertig zum Download. Nachdem er einmal entpackt ist, kopiert man ihn (über eine CIFS-Freigabe) auf den Router – oder lässt ihn direkt von der Freigabe aus laufen, je nach belieben. In meinem Fall wollte ich ihn auf dem verbleibenden JFFS-Speicherbereich laufen lassen. Dazu muss unter dem JFFS-Punkt Execute when Mounted folgender Aufruf hinterlegt werden:

/jffs/snmpd -c /jffs/snmpd.conf &

Der SNMP-Dienst sollte jetzt laufen. Ein beliebiger SNMP-Client sollte jetzt Daten auslesen können. Eben auch Munin, für das jedoch zunächst die SNMP-Plugins auf dem überwachenden Rechner entsprechend eingerichtet werden müssen. Zunächst legt man eine virtuelle Node in /etc/munin/munin.conf an:

[abeir.selune]
address 127.0.0.1
use_node_name yes
[shar.selune]
address 127.0.0.1
use_node_name no

Anschließend kann man sich mit munin-node-configure --snmp shar.selune --snmpversion 2c --snmpcommunity public die notwendigen Links generieren lassen – einfach die Ausgabe kopieren und entsprechend ausführen. Startet man noch den Munin-Dienst neu (/etc/init.d/munin-node restart) braucht man nur noch ein wenig zu warten und die ersten Daten fließen in die Auswertung mit ein:

23 Tage zuvor: Tages-Planung

Vor nicht allzu langer Zeit erwähnte ich, dass der HP DreamScreen eine tolle Sache sei. Denn er bietet die Möglichkeit Bilder (und Musik) über die integrierte WiFi-Schnittstelle nachzuladen. Soweit, so gut.

Nachdem ich mir Ende November günstig einen zugelegt habe, konnte ich die letzten Tage auch endlich ein wenig intensiver Zeit investieren um ihn für das zu nutzen, für das er gedacht war. Nämlich morgendlich eine Übersicht über all jenes anzuzeigen, was den Tag über so los ist. Ist heute etwas geplant? Was macht Mami? Wer kommt zu Besuch? Wie wird das Wetter? Was ist über Nacht in der Welt passiert?

Das Programm um ein entsprechendes Bild aus diversen Feeds zu erstellen war auch recht zügig geschrieben. Allerdings sind die Grenzen des DreamScreen ein wenig zu eng gesteckt, um das Ziel zu erreichen. Denn es gibt zwar die Möglichkeit Daten drahtlos abzugleichen und Musik direkt aus dem Netzwerk abzuspielen (auch wenn man dazu den Windows Media Player installiert haben muss). Man ist dabei jedoch leider auf Pull-Dienste angewiesen, sprich man muss manuell am DreamScreen die Daten abfragen – eine Push-Möglichkeit, bei der ein Programm ein Bild zur Anzeige an den Bilderrahmen schickt, gibt es nicht.

Damit ist das Projekt also frühzeitig gescheitert. An einer unzureichenden Software-Implementation seitens HP. Auch ein SDK um gegebenenfalls eine eigene Lösung dafür zu entwickeln, gibt es nicht. Dabei läuft der DreamScreen auf einer Embedded Linux Plattform und bietet daher theoretisch alle Funktionalitäten um das gewünschte Verhalten problemlos zu bieten. Zwar offenbarte ein Netzwerk-Sniffer das die Daten mittels SOAP abgeglichen werden, man auf diese Weise vermutlich auch automatisch Bilder hochladen könnte, allerdings fehlen damit immer noch Steuerungsfunktionen wie zum Beispiel ein bestimmtes Bild anzeigen zu lassen.

Bleibt nur zu hoffen, dass HP seine angeblichen Pläne umsetzt und in der Tat grosses aus der ansonsten guten Hardware macht – oder zumindest jemand es schafft Zugang zu dem Linux-System zu erhalten.

24 Tage zuvor: Wiederherstellungsorgie

Zwei Jahren lief er. Nahezu ununterbrochen. Dennoch kam ich letzte Woche leider nicht mehr drumherum in neu aufzusetzen, meinen kleinen Heim-Server. Die Fehlermeldungen haben sich zuletzt arg gehäuft. Beim Aufrufen der Einstellungen in der WHS Konsole stürzte selbige immer ab. Und neue Rechner konnten auch nicht mehr eingehängt werden. Gut, dass es genau dafür eine ausgeklügelte Wiederherstellungs-Funktion gibt!

Wiederherstellung
Um den Server wieder her zu stellen, muss lediglich ein Programm von einer CD gestartet und ein wenig gewartet werden. Theoretisch jedenfalls, denn leider wurde mir stets auf neue gesagt, dass bei der Harware-Initialisierung ein Fehler aufgetreten sei. Nach einigem Hin und Her stellte sich heraus: Die getauschte CPU sowie die nachträglich hinzugefügte Festplatte waren der Grund. Die schnelle Wiederherstellung zog sich daher über insgesamt gut drei Tage hin.

Homeserver-Grundkonfiguration
Bei der Wiederherstellung wird lediglich das Betriebssystem neu installiert. Vorhandenen Daten bleiben dabei ausdrücklich erhalten. Jedenfalls wenn alles glatt geht. In meinem Fall waren alle nicht-gespiegelten Daten verloren, was jedoch nicht weiter tragisch war. Auch wenn dadurch alle Daten manuell zurück-kopiert werden mussten. Was bei einer Herstellung allerdings definitiv verloren geht sind jedwede Konfigurationen. Also mussten User wieder eingerichtet, Zugriffsrechte neu gesetzt und Computer eingebunden werden (allein die initialen Backups der beiden Windows-Clients zogen sich über fünf Stunden hin). Nicht zu vergessen das auch noch ein paar WHS-Add-Ins erneut installiert werden wollten.

Server-Konfiguration
Nachdem das alles geschafft war, ging es mit den nicht-WHS-Komponenten weiter: RADIUS-, IIS- sowie FTP-Dienste wollten aktiviert und konfiguriert werden. Und die darauf angewiesenen Clients wie zum Beispiel die Überwachungskamera mussten selbstredend auch wieder damit zusammen funktionieren. Außerdem gilt es Skripte einzuplanen und – nicht zu vergessen – die CPU sowie die zusätzliche Festplatte wollen auch wieder eingebaut werden.

Zusatz-Software
Die Ziellinie scheint in Reichweite, doch die eigentlichen Aufgaben kommen erst jetzt: zusätzliche Software muss installiert und eingerichtet werden. mControl, die Software zur Haussteuerung ist da noch das einfachste – auch wenn das Backup der Datenbank sich nicht zurück spielen lässt und somit alles manuell neu konfiguriert werden muss. BeyondTV, die PVR-Lösung hatte schon immer Treiber-Probleme die sich leider nur durch Try & Error beheben lassen (mit dutzendweise Sender-Suchläufen). Und auch hier sind dank mangelhaftem Restore alle Aufnahmekriterien manuell neu anzulegen. Da ist der letzte Schritt schon vergleichsweise simpel: Die VirtualBox-Instanzen müssen wieder als Windows-Service automatisch starten und herunterfahren.

Immerhin, nach nunmehr ziemlich genau einer Woche funktioniert alles wieder wie zuvor. Nebenbei wurde viel scheinbar entrümpelt, denn es wurden nahezu 100GB Plattenplatz frei gemacht – auch wenn sich das mit den neu aufzubauenden Backup-Versionen relativieren dürfte. Allerdings wurde vermutlich auch irgendwo etwas grundlegend aufgeräumt, denn der Server fühlt sich nicht nur schneller an, der Daten-Durchsatz ist auch von zuvor ~30MB/s auf nunmehr ~50MB/s gestiegen. Dennoch hoffe ich, dass derartiges frühstens in zwei Jahren wieder nötig wird.

25 Tage zuvor: Google-Maps Suche

Schon interessant, wie man manchmal bei eigentlich selbstverständlichen Sachen forschen und tricksen muss. Zuletzt bei der Anzeige von diversen Adressen in einer Karte von Google-Maps. Hier sollte der Kartenausschnitt auf die angezeigten Ergebnisse zentriert und der Zoom entsprechend gesetzt werden. Standard-Funktionen gibt es dafür leider nicht, aber mit einem kleinen Trick funktioniert es dennoch recht geschickt:

JavaScript:
var map = new GMap2(document.getElementById("map"));
var geocoder = new GClientGeocoder();
map.setCenter(new GLatLng(25.783662, -80.189466), 9);
var viewport = new GLatLngBounds();
GEvent.addListener(map, 'markeradded', function(){
        map.setCenter(viewport.getCenter());
        map.setZoom(map.getBoundsZoomLevel(viewport)-1);
        });
geocoder.getLatLng("1900 N BAYSHORE DR  4109, Miami FL 33132", function(point){
        var marker = new GMarker(point);
        GEvent.addListener(marker, 'click', function(){
                marker.openInfoWindowHtml("<b>1900 N BAYSHORE DR  4109, Miami FL 33132</b><br /><a href='details/93'>Show Details</a>");
                });
        map.addOverlay(marker);
        if(!viewport.contains(point)){
                iewport.extend(point);
        }
        GEvent.trigger(map, 'markeradded');
});

Der Trick besteht darin im Eventhandler der Marker den hinzugefügten Punkt einem GLatLngBounds-Objekt zu übergeben. Mit Hilfe dieses Objekts kann der Kartenausschnitt neu angepasst werden.

Interessant ist dabei, dass panTo() durch den direkt anschließenden Aufruf von setZoom() nicht korrekt funktioniert. Mit setCenter() gibt es allerdings keine Probleme.

55 Tage zuvor: Heiz-Kosten

Die letzte Rechnung unserer Freunde von FPL hat mich dazu gebracht mal wieder bei Microsofts Hohm rein zuschauen. Und tatsächlich gibt es dort jetzt ein Diagramm, das mich schon öfter interessiert hat:

Die täglichen Stromkosten in Relation zur Durchschnittstemperatur (wir sind eher am oberen Ende des grünen Streifens). Allerdings sieht man dort auch sehr schön, dass wir bereits die monatlichen Stromkosten durchaus drücken konnten.