SkyDrive mit Python

Ich bin gerade dabei für ein Projekt ein Skript zu entwickeln, das periodisch Daten auf einen ausgelagerten Speicher kopiert. Zunächst hatte ich dabei an Amazon S3 gedacht, allerdings handelt es sich weder um kritische Daten noch ist eine besonders hohe Verfügbarkeit notwendig, so dass Microsoft SkyDrive ebenfalls ausreicht.

Für Amazon S3 gibt es, wie ich herausgefunden habe, eine gut dokumentierte Python API Library, boto. Für Microsoft SkyDrive gibt es ebenfalls eine Library, python-skydrive, allerdings ist das mit der Dokumentation hier nicht so ganz optimal. Es gibt eine, aus den Code-Kommentaren automatisch generierte, API Dokumentation, in der jedoch ein paar Fallstricke lauern und vor allem keine Code-Beispiele vorhanden sind, die das Verständnis meist doch sehr vereinfachen würden. Inzwischen habe ich die Verbindung allerdings hinbekommen und will hier einmal kurz aufzeigen, was ich dazu machen musste, da mir ein solches Minimalbeispiel gefehlt hatte.

Zunächst einmal benötigt man zwei Libraries, die nicht automatisch vorhanden sind: requests und PyYAML. Diese kann man entweder über pip, easy_install oder den Paketmanager seiner Distribution installieren.

Die Installation von python-skydrive entspricht der gelieferten Dokumentation, man kann dies einfach mit pip install python-skydrive durchführen.

Anschließend hat man alle notwendigen Vorraussetzungen erfüllt (Ich setze hier vorraus, dass man bereits einen Live-Account besitzt und auf SkyDrive zugreifen kann) und kann die Verbindung vorbereiten. SkyDrive verwendet eine OAuth Authentifizierung. Diese verwendet, vereinfacht dargestellt, eine Client-ID und ein Secret, welche man bei Microsoft anlegen muss. Man sollte die beiden Werte dann lokal in einer Textdatei zwischenspeichern. Bei Microsoft habe ich die Anwendung python-skydrive genannt. Der Name ist allerdings nicht entscheidend. Das Feld „Umleitungsdomäne“ bleibt leer. In der Beschreibung der Command-Line Version von python-skydrive steht „Be sure to check the „mobile client app“ box under „API settings“„, daher habe ich dies hier ebenfalls gemacht.

Python-skydrive bietet nun verschiedene Möglichkeiten, die API zu nutzen. Einerseits kann man interaktiv die Werte übergeben, andererseits kann man mit einer Konfigurationsdatei arbeiten, die die zusätzlichen Parameter, wie den Auth Code, der durch python-skydrive vom SkyDrive Server bezogen wird, sichert. Letzteres empfiehlt sich für automatische Systeme, in die kein Benutzereingriff erfolgen soll.

Die Vorgehensweise ist allerdings in beiden Fällen relativ ähnlich, das folgende sollte zunächst in einer Python-Eingabeaufforderung eingegeben werden. Damit wird zunächst das benötigte Modul der python-skydrive API importiert und anschließend ein Objekt erzeugt, das über die bereits beschaffte Client ID und -Secret verfügen.

from skydrive.api_v5 import SkyDriveAPI
my_skydrive = SkyDriveAPI(client_id = '[meine client id]', client_secret = '[mein client secret]', )
my_skydrive.my_sd.auth_user_get_url()

Die unterste Methode liefert einen Unicode-String zurück, welcher eine URL enthält. Diese sollte man dann in einen Webbrowser kopieren und aufrufen. Nachdem man sich mit seinem Windows Live Kennwort authentifiziert hat, landet man auf einer leeren Seite. Die URL dieser Seite kopiert man nun und fügt sie im folgenden Schritt wieder ein:

my_url = ''
my_skydrive.auth_user_process_url(my_url)
my_skydrive.auth_get_token()

Im Idealfall sollte nun der Zugriff auf SkyDrive möglich sein. Testen lässt sich dies bspw. so:

my_skydrive.listdir()

Man sollte ein Objekt zurückgeliefert bekommen. Dies entspricht dem Default-Verzeichnis.

Um PersistentSkyDriveAPI zu nutzen, muss zunächst eine Konfigurationsdatei angelegt werden. Standard ist hier ~/.lcrc, ich habe das angepasst auf ~/.skydrive.auth, da das etwas ersichtlicher erscheint. Diese Datei muss folgenden Inhalt haben:

client:
id: [meine client id]
secret: [mein client secret]

Nun legt man folgendermaßen ein SkyDriveAPI Objekt an:

from skydrive.api_v5 import PersistentSkyDriveAPI
my_skydrive = PersistentSkyDriveAPI.from_conf('~/.skydrive.auth')

Die restlichen Schritte sind identisch zu den oben genannten für den ersten Aufruf. PersistentSkyDriveAPI legt allerdings den ermittelten authorization_code und einige weitere Daten ebenfalls in der Config-Datei ab und aktualisiert diese auch wenn nötig. Bei den folgenden Aufrufen sollte man direkt nach dem erstellen des Objekts mit der API arbeiten können.

Heizungs-Monitoring

Heute habe ich bei uns im Heizungsraum mein Temperatur-Datenerfassungssystem etwas angepasst.

Ich hatte vor einer Weile mal auf Basis eines Edimax BR-6104KP Routers mit einer Midge Linux Firmware ein Temperaturlogging via 1-Wire Sensoren aufgebaut. Die Abfrage der Sensoren erfolgte über meinen Server und die erfassten Werte wurden in eine MySQL Datenbank geschrieben. Das funktionierte leider nur unzuverlässig, da der Router nach ca. 30 Tagen Betriebszeit dann abgestürzt ist und nur durch einen kompletten Neustart wiederzubeleben war. Auch ein täglicher Reboot via cronjob hat daran nichts verändert.

Um das ganze jetzt mal in den Griff zu kriegen, habe ich mir nun einen 1-wire to Ethernet Busmaster von Embedded Data Systems (EDS) bei Fuchs Elektronik bestellt und den heute eingebaut. Praktischerweise läuft das Gerät mit 6-16V, sodass ich das bereits verbaute Netzteil weiternutzen konnte. Ich musste lediglich das Kabel, welches die Sensoren mit dem Busmaster verbindet tauschen, da der alte USB-Adapter einen RJ-45 Anschluss besass und ich nun einen RJ-12 Anschluss benötige.

Schliesslich war noch ein Update der owfs-Installation auf meinem Server, mit dem ich auf das Gerät zugreife notwendig. Die aktuelle Version war im Gentoo Portage nicht enthalten, sodass ich die Software manuell installieren musste, was allerdings problemlos funktionierte. Inzwischen protokolliert mein Python-Script auch schon wieder die aktuellen Temperaturdaten in die Datenbank.

Das Script ist recht simpel aufgebaut, es fragt nacheinander die vier angeschlossenen Sensoren ab:

#!/usr/bin/python
import re
import ow
import MySQLdb

sensors = ['10.D034F9010800', '10.2C7AF9010800', '10.1353F9010800', '10.2F90F9010800']

mysql_opts = {
  'host': "HOSTNAME",
  'user': "USERNAME",
  'pass': "PASSWORD",
  'db':   "DATABASE",
  'dbtablevalues': 'sensor_values',
  'dbtablesensors': 'sensor_names'
}

mysql = MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db'])
mysql.apilevel = "2.0"
mysql.threadsafety = 2
mysql.paramstyle = "format"

for sensor in sensors:
  cursor = mysql.cursor()
  ow.init("--enet=IP:PORT")
  temp = re.sub(r'\s', '', str(ow.Sensor("/"+sensor).temperature))
  print "%s: %s" % (sensor, temp)
  sql="INSERT INTO %s (sensor_id, sensor_value, sensor_time, cuser) VALUES ((SELECT sensor_id FROM %s WHERE sensor_owid='%s'), %s, CURRENT_TIMESTAMP, 'auto')" % (mysql_opts['dbtablevalues'], mysql_opts['dbtablesensors'], sensor, temp);
  cursor.execute(sql)
mysql.close()

Ich bin gespannt, ob das jetzt zuverlässig läuft… :-)

NARF! Virtualisierte Domain Controller in 70-640

Ich bin zur Zeit dabei, mich für die Microsoft Prüfung 70-640 (Windows Server 2008 / Active Directory) vorzubereiten. Dabei geht es in Kapitel 9 um die Installation von DNS Servern in der Domäne.

Eine Übung ab Seite 489 sieht hierbei vor, eine neue AD Gesamtstruktur mit drei Servern aufzubauen. Hierbei soll SERVER10 die Domain TREYRESEARCH.NET hosten, SERVER20 die Domain NORTHWINDTRADERS.COM. Soweit kein Problem, jedoch erhielt ich beim Einrichten der zweiten Domain eine Fehlermeldung dass die Domain bereits vorhanden sei und nicht angelegt werden könne. Ich dachte zunächst noch an eine kleine Fehlfunktion, versuchte es nochmal, erhielt jedoch wieder die gleiche Meldung.

Directory configuration indicates that the domain northwindtraders.com already exists. Do you want to reinstall that domain? If you click yes, all information about the prior Active Directory domain Services domain installation will be deleted.

Nach einer kurzen Recherche in Bezug auf diese Meldung stiess ich dann auf diesen Foreneintrag welcher auch gleich eine Lösung lieferte. Das Problem entsteht nämlich, wenn man virtuelle Maschinen verwendet und die drei Server von der gleichen Quellmaschine cloned. Dann haben nämlich alle drei Maschinen die gleiche SID und das führt dazu, dass das Active Directory, was man ja schon auf SERVER10 angelegt hat, die gleiche SID hat, wie die zweite Domain (da diese aus der SID des ersten Domain Controllers erzeugt werden).

Ist aber kein Problem, schrieben die, man nimmt einfach NewSID, ein Sysinternals Tool und führt dieses aus. Das generiert eine neue SID und dann klappt das alles. Tja – hier nicht, ich schätze das liegt an Windows 2008 R2. Das kriegte ich nen BlueScreen beim Neustart. Dann wie ich erfahren habe, hat Mark Russinovich, der Autor der Sysinternals-Tools, dieses Programm eingestellt und es wird auch direkt nicht mehr zum Download angeboten. Auf Chip.de wird man aber noch fündig.

Interessant finde ich in diesem Zusammenhang dann aber noch die Aussage, warum das Tool eingestellt wurde:

To my chagrin, NewSID has never really done anything useful and there’s no reason to miss it now that it’s retired. Note that Sysprep resets other machine-specific state that, if duplicated, can cause problems for certain applications like Windows Server Update Services (WSUS), so Microsoft’s support policy will still require cloned systems to be made unique with Sysprep.

Mhm… Ja scheinbar wohl doch. Ich mein, es ist nicht wirklich ein Problem, es gibt ja Sysprep.

Abschließend bleibt nur noch zu sagen, weshalb ich mich überhaupt zu einem Post deswegen hinreissen hab lassen – Warum schreibt man sowas nicht ins Buch als Anmerkung. So „Hier, guck, wenn du clonest, denk an Sysprep, das is wichtig hier.

Man könnte jetzt argumentieren „Jaa… du nimmst Virtuelle Maschinen, da haben die halt nicht mit gerechnet“. Wäre aber falsch, die schreiben des öfteren, man solle VMs verwenden, um nicht ständig die Rechner neu installieren zu müssen.

Oder man setzt es halt mit auf die Liste der zahlreichen Fehler… :-/

ICE-Zeit

Ja, kreativer Titel, ich weiss… ;) In diesem Post geht es nämlich um meine heutige Reise zur \\ICE:2010 in Lingen.

Als ich Anfang Juni in Köln auf einer Fortbildung zum betrieblichen Datenschutzbeauftragten war, hatte ich mich mit einem anderen Teilnehmer unterhalten und dieser hatte mir die ICE sehr empfohlen. Also habe ich mich dann mal angemeldet, bevor die 300 vorhandenen Plätze weg waren.

Die Veranstaltung fand in diesem Jahr bereits zum sechsten Mal statt und kostet keinen Eintritt, obwohl dort einiges in sehr angenehmer Atmosphäre geboten wird und sogar Mittagessen und Kaffeebewirtung kostenlos sind. In vier Tracks gab es jeweils 6 Vorträge von durchaus namhaften Sprechern und außerdem noch eine Keynote sowie eine Abschlusskeynote. Veranstaltungsort war die Halle 31 der „it.emsland“, eine regionale IT-Dienstleistungsgesellschaft, welche sich in den restaurierten Gebäuden des ehemaligen Eisenbahnausbesserungswerkes Lingen angesiedelt und dort ein IT-Zentrum aufgebaut hat.

Ich habe nachdem ich zur unmenschlichen Uhrzeit von 0700 Uhr aufgestanden bin und einer Fahrt durch solch malerische Orte wie Ankum und Bersenbrück gegen 0950 Uhr den Eingang erreicht und dort mein Badge abgeholt. Im Gebäude gab es von einigen Herstellern Messestände, an denen man sich informieren konnte, sowie einen Tisch mit gekühlten Getränken, welche mir gerade sehr gelegen kamen. Es begann dann aber auch gleich die Keynote, vorausgegangen war ein Grußwort der 1. Bürgermeisterin von Lingen, Ursula Haar.

Die Keynote wurde auf Englisch gehalten von John Craddock von XTSeminars aus Großbritannien und drehte sich um das Thema „Cloud Computing – Is it right for you?“. Der Vortrag war relativ ausgewogen und stellte die Chancen und Risiken von Cloud Computing dar, ohne eine direkte Empfehlung auszusprechen. Man merkte jedoch, dass Herr Craddock eher ein Fürsprecher für Cloud Computing ist. Auch wenn das auf mich nicht so ganz zutrifft, fand ich die enthaltenen Informationen interessant, insbesondere im Zusammenhang mit Microsoft BPOS, der Business Productivity Online Standard Suite, welche z.B. auch Exchange Online beinhaltet. Weiterhin grenzte er die Begriffe IaaS, PaaS und SaaS sehr detailliert und ausführlich gegeneinander ab, was für zukünftige Diskussionen sehr nützlich sein könnte.

Als erstes hörte ich mir dann den Talk „Performance Monitoring und Kapazitätsmanagement – Warum Expertenwissen mehr zählt als jedes Produkt“ aus dem IT-Pro Track an. Das war leider ein etwas trockenes Thema, was jedoch dafür relativ ansprechend präsentiert wurde. Es ging dabei vor allem um Kennzahlen, mit denen man die Auslastung eines Systems bewerten kann. Im Rahmen des Vortrags beschränkte der Sprecher, Nicholas Dille, auf Prozessor, Festplatte und Hauptspeicher und stellte Leistungsindikatoren des Windows Performance Monitors vor, die dazu geeignet sind, die Performance des Systems sinnvoll zu bewerten. Das war durchaus aufschlussreich, insbesondere die genutzten Indikatoren für den Hauptspeicher kannte ich noch nicht – werde ich Zukunft wohl öfters gebrauchen.

Anschließend lief mir Florian über den Weg, mit dem ich zunächst einen Kaffee trinken ging und anschließend in den Talk „Active-Directory-Berechtigungen oder: Die Tücken der Delegation“ von Nils Kaczenski ging. Inhaltlich kannte ich vieles bereits aus den Unterlagen zur Microsoft 70-640 Zertifizierung, allerdings waren die Praxisbeispiele sehr interessant und das Tool LIZA zum Bewerten von effektiven Active Directory Berechtigungen waren sehr nützlich. Leider war die Zeit etwas knapp, so dass das Beispiel 3, welches darum ging, einem Praktikanten alle Lese-Berechtigungen im AD abzunehmen nur noch sehr rudimentär abgehandelt werden konnte. Ansonsten hat mir der Vortrag sehr gefallen.

Danach gab es dann bereits Mittagessen, was extrem lecker war. Es gab in einem angrenzenden Zelt Kartoffeln aus einer großen Pfanne, Paprikagemüse, Schweinefilet und Hähnchen mit Bacon drumzu. Überaus gutes Essen also :)

Nach der Mittagspause begann dann der zweite Vortrag von John Craddock, dieser zum Thema „Active Directory Federation Services – How does it really work?“. Auf diesen Vortrag war ich sehr gespannt, weil AD:FS eine der K0mponenten von Active Directory ist, mir der ich bisher noch ca. garnichts zu tun hatte. Leider war ich mittagsbedingt etwas müde, sodass ich mich nicht gut darauf konzentrieren konnte, jedoch war dieser Vortrag sehr interessant und gut geeignet, um einen ersten Überblick über AD:FS zu bekommen.

Daraufhin war ich im Vortrag „Hyper-V 101 – for Small Businesses“, in dem es um die Möglichkeiten und Einsatzzwecke von Microsofts Hypervisor Hyper-V ging. Insbesondere die Möglichkeiten, die man in der neuen Version bei 2008 R2 durch die Anbindung von gemeinsamen Storage in Clustern hat, waren sehr faszinierend. Für mich als jemand, der prinzipiell eher VMware favorisiert sah das schon ziemlich gut aus. Die Live-Migration einer Maschine von einem auf einen anderen Host lief absolut flüssig ab. Außerdem gab es einen kurzen Abriss über die Lizensierungsmodelle bei Hyper-V, was auch gut zu wissen ist.

Im Anschluss folgte ein extrem faszinierender Talk mit dem Titel „Virtuelle Desktops Ungefiltert – Protokolle und Grafikleistungen unter Realbedingungen“. Dabei stellte der Vortragende, Dr. Bernhard Tritsch die Ergebnisse von Messungen vor, die er mit einem Kollegen durchgeführt hat. Diese Messungen untersuchen die Performance verschiedener Remote Desktop Protokolle auf relativ Schmalbandigen Verbindungen (50ms / 2MBit/s), also quasi über WAN-Strecken. Hierbei zeigten sich große Unterschiede zwischen RDP, ICA, RDP+ u.a. – vor allem bei den Unterschiedlichen Content-Kategorieren GDI (Notepad), PDF, Video sowie 3D. Dabei war es faszinierend zu erfahren, was die Hersteller für Aufwand betreiben um für bestimmten Content diverse Sonderlösungen in ihre Protokolle zu implementieren, damit bestimmte Inhalte besser laufen. Eine schöne Anekdote war, dass auf einer früheren Veranstaltung, bei der er diese Ergebnisse präsentiert hatte, diverse Leute von den unterschiedlichen Herstellern im Anschluss um ihn herumstanden und ihm Tipps gegeben haben, wie man deren Protokoll noch tweaken kann um die Ergebnisse zu verbessern.

Der letzte reguläre Talk hatte den schönen Titel „Softwareschwächen nutzen: Admin werden – Livedemo“. Dabei stellte Mark Heitbrink von gruppenrichtlinien.de Mittel und Wege vor, wie durch Schwächen in aktueller Software, insbesondere durch Designfehler, die die Zuweisung von Hauptbenutzer- bzw. Programme-Schreib-Berechtigungen erfordern zu scheinen, es möglich ist, sich lokale Administratorrechte zu verschaffen. Es war sehr schön anzusehen mit welch einfachen Mitteln es möglich ist, entweder komplett alleine oder mittels etwas Aufwand + Social Engineering an Administratorrechte zu gelanden. Zudem gab es ein bischen Entwicklerbashing, dafür gabs gleich ein paar Bonuspunkte :) In meinen Augen vom Unterhaltungsfaktor her auf jeden Fall der beste Vortrag.

Als letzter Programmpunkt stand dann die Abschlusskeynote „Die Digitale Weltrevolution“ von Dr. Ingo Dahm an. Anhand eines Faustkeils und eines Handys hat er sehr unterhaltsam die Entwicklung und die Grundlage für menschlichen Fortschritt aufgezeigt. Ein super Zitat von ihm was ich vorhin auch schon getwittert hab, aber leider nicht genug Platz hatte um das vernünftig zu schreiben:

Man kann die Arbeit eines Admins mit einem Anästhesisten vergleichen, der dafür sorgt dass man am Leben bleibt, wenn ein Chirurg – Entwickler – etwas tut was einen eigentlich töten würde.

Anschließend habe ich dann nicht mehr die Abendveranstaltung besucht, da ich nach 10 Stunden dort und 12 Stunden auf den Beinen und unterwegs dringend nach Hause wollte und mich ausruhen musste. Leider war ich der Meinung, dass ich auch ohne Navi nach Hause finden müsste, da ich ja eigentlich nur die B214 zurück fahren musste. Das wurde recht schnell bestraft, da ich an irgendeinem Kreisel zwischendurch wohl die falsche Ausfahrt genommen habe und plötzlich unterwegs war nach Bramsche. Dort fuhr ich dann schließlich auch auf die A1 und dann über Holdorf nach Hause. Minimaler Umweg… Immerhin konnte ich mehr NSFW-Podcast hören ;)

Alles in allem war das aber eine sehr schöne Veranstaltung mit vielen interessanten Vorträgen. Sofern das nächstes Jahr passt, werde ich da wohl wieder hinfahren.

ICE-Zeit weiterlesen

Klingel repariert

Soo, seit Mittwoch haben wir hier auch wieder eine funktionierende Klingel bzw. ich hab meine eigene :) Hab den morgen damit verbracht, die teilweise spinnenbewohnte alte Klingel zu demontieren. Nachdem ich dann herausgefunden hatte, wie man die neue Klingel montiert, hab ich diese auch relativ schnell anbringen können.

Samstag kam dann noch der Trafo für die Beleuchtung dazu und jetzt sieht das doch schon ganz ordentlich aus, finde ich. Außerdem hab ich dann noch die Verkabelung an der Anlage etwas ordentlicher gemacht und alle Verteilungen wieder zugemacht, sodass das gewitter-verschuldete Projekt nun auch wieder abgeschlossen ist.

(Und wehe, ein gewisser Jemand beschwert sich wieder über den Gelbstich :P)