Archiv August 2006

Donnerstag, 31. August 2006

MySQL über SSH tunneln

Heute habe ich die lang ersehnte Instanz auf einem VMWare ESX-Server erhalten und werde in den nächsten Tagen Web-Sites von einem Solaris-System auf LAMP (Debian, Apache2, PHP4, MySQL 4.0) migrieren.

Bereits wenige Stunden nach der Installation von Debian stand ich vor einem grösseren Problem: Wie kopiere ich eine über 50 MB grosse Datenbank-Tabelle vom einen auf den anderen Server? (Achtung: Es steht hier jetzt nicht zur Diskussion, ob ich die Daten richtig normalisiert habe …) Und zwar selbständig, ohne den Sysadmin der Solaris-Kiste anzuflehen, mir das Tabellenfile zum Download zur Verfügung zu stellen? Auch phpMyAdmin kam nicht in Frage: Das Ding ist gut und recht – nur würde sich die Applikation garantiert an der Grösse der Textdateien verschlucken. Wenn nicht beim Download, dann spätestens beim Upload.

Was nun? SSH ist – wie so oft – die Lösung. Das Konzept ist simpel: Auf dem Zielrechner tunnle ich Anfragen über einen bestimmten Port via SSH auf den Solaris-Rechner und habe so Zugriff auf die zu migrierende Datenbank, als würde ich lokal am Server angemeldet sein.

Drei einfache Schritte sind nötig, um eine Datenbank-Tabelle von Server A nach Server B zu verschieben:

Port Forwarding über SSH Tunnel einrichten

Auf Server B erstellt man in der Datei ~/.ssh/config eine neue SSH-Konfiguration:

Host <irgendeine Wunschbezeichnung>
Hostname <IP Server A>
User <SSH-Benutzernamen auf Server A>
Localforward <beliebiger, nicht verwendeter Port> localhost:3306

Die IP nach Hostname entspricht der IP des Servers A, auf dem die zu spiegelnde Datenbank liegt. Nach User steht der Name eines gültigen SSH-Users auf Server A. 3307 ist der lokale Port (auf Server B, der auf Server A geforwardet wird und dort auf Port 3306 endet (dem MySQL-Port, notabene).

Ist die Textdatei gespeichert, braucht man nur noch die Verbindung zu starten:

ssh <irgendeine Wunschbezeichnung>

Man sollte nicht verblüfft sein, wenn alles wie eine normale Verbindungsaufnahme zu einem SSH-Server daherkommt. Man loggt sich wie gewohnt ein und lässt die Session laufen (Verbindung nicht trennen!). Es ist von Vorteil, wenn diese Verbindung in einem screen-Terminal geöffnet wurde.

Dump anlegen

Die Verbindung besteht nun also. Port 3307 steht bereit, Daten zu empfangen und diese an Server A weiterzuleiten.

Nun gut, auf was warten wir? Spätestens jetzt sollte man das Package mysql-client installieren, da darin mysqldump enthalten ist. Genau dieses verwenden wir nun, um die Tabelle in eine Datei ins lokalen Filesystem des Servers B zu speichern:

mysqldump -h 127.0.0.1 -P 3307 -u <MySQL-Benutzernamen Server A> -p <MySQL-Datenbank Server A> --tables <MySQL-Tabelle Server A> > /tmp/dump.sql

mysqldump nimmt nun Verbindung mit dem Datenbankserver auf. Nachdem man das korrekte Passwort übermittelt hat, wird der Dump schnurstracks in das entsprechende File übertragen. Nach kaum einer Minute waren 50MB an Daten über die Leitung transferiert und in /tmp/dump.sql gespeichert worden.

Dump einspielen

Die SSH-Verbindung zu Server A kann nun gekappt werden. Jetzt bleibt nur noch eines übrig: Den Dump in die Datenbank auf Server B einzulesen. Nichts leichter als das:

mysql -u <MySQL-Benutzernamen Server B> -p <MySQL-Datenbank Server B> < /tmp/dump.sql

Sind bis hierhin keine Fehlermeldungen aufgetaucht, ist die Tabelle nun auch auf Server B anzutreffen.

PS: Ob Kollege Torquie seine unzählige Gigabytes umfassende SAP-Datenbanken auf dieselbe Art spiegelt? *grins*

Nützliche Links

Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 31. August 2006

Nicht nur für Frauen: Einparkierhilfe

Wer wie Kollege Torquie allmorgendlich bereits kaum lösbare Herausforderungen zu bewältigen hat, kann nun online üben:

Parking Perfection

Via: Richtig parken: Kein Kinderspiel

Tags:
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 27. August 2006

Disable iConquer Trial Limit

Nachtrag: Langer Rede kurzer Sinn – wer folgenden Befehl in Terminal.app ausführt, hebelt das Trial Limit aus (<user> muss entsprechend ersetzt werden):

chmod 000 "/Users/<user>/Library/Application Support/.ic241"
chmod 000 "/Library/Application Support/.ic241"

Dieses Wochenende gehörte voll und ganz iConquer. Nach einigen Runden (die ich allesamt gegen Melanie und den Computer verloren hatte) war klar: Da muss eine Lizenz her. Noch am Samstag-Mittag bestellte ich deshalb über die Web-Site des Entwicklers einen Lizenzschlüssel. Leider ist bis jetzt, kurz nach Sonntag-Mitternacht, immer noch kein Mail eingetrudelt, mit dessem Inhalt ich die Applikation freizuschalten wäre. Das ist nicht so erfreulich:

Da es sich um Trial-Ware handelt, ist das Produkt zwar benutzbar – aber nur für 10 „uses“ (Spiele? Programmtarts?). Das Limit hatten ich und Melanie leider bereits am späteren Samstag-Abend erreicht …

Da sich umgehend erste Entzugserscheinung breit machten, versprach ich Melanie, das Programm zu „hacken“ (auch hier wieder in Anführungszeichen, denn wie bei meinen anderen „Hacks“ trennen mich Welten von den Mitnicks & Co. da draussen).

Wer nun denkt, dass ich kurzerhand zu im Netz herumschwirrenden Serials griff, liegt komplett falsch. Mein Ziel war es, das Programm völlig legal freizuschalten, den Zähler also auf null Spiele zurückzusetzen.

Speicherort verzweifelt gesucht …

Ich vermutete (korrekterweise), dass der Entwickler des Programms die Anzahl gespielter Spiele irgendwo speichern musste (eigentlich logisch). Als erstes löschte ich deshalb den Applikations-Ordner, auch wenn ich keine grosse Hoffnung hegte, den Zähler so zurücksetzen zu können. Und tatsächlich: Nachdem ich das Programm frisch aus dem .dmg auf die Platte kopiert hatte, war der Zähler immer noch da. Nächste Vermutung deshalb: Irgendwo unter ~/Library/ wird sich eine Datei befinden, die die gesuchten Daten enthält. Fände ich diese Datei, könnte ich den Zähler zurücksetzen.

Disable FontAgent Pro Trial Limit

Ich erinnerte mich daran, dass ich auf identische Weise in grauer Vorzeit bereits eine Test-Version von FontAgent Pro mehr oder weniger in eine Kauf-Version umgewandelt hatte.

Irrweg lsof

Die wohl einfachste Methode, die gesuchte Datei zu finden, war die Applikation beim Start zu „debuggen“ (oder verwende ich hier den falschen Begriff? Wäre „tracen“ besser?“). Auf gut deutsch: Mittels eines anderen Tools aufzuzeichnen, auf welche Dateien iConquer.app nach dem Doppelklick auf das Applikations-Symbol zugriff. Die gesuchte Datei müsste relativ zu Beginn des Startvorgangs geladen werden, da der Nag-Screen sekundenbruchteile nach dem Start auftauchte.

Leider entschied ich mich für das falsche Tool – lsof – welches für diese Zwecke nicht wirklich geeignet war. Immerhin entdeckte ich eine sehr ausführliche Seite im Netz, die so einiges an Kommandozeilen-Parameter erläuterte:

lsof

Wichtig erschien mir hierbei die Option -r <sec>, mit der man lsof anwies, alle X Sekunden erneut die Liste der geöffneten Dateien auszugeben. Mittels grep versuchte ich, die Datenmengen zu filtern, doch irgendwie tauchten in der Liste keine vielversprechenden Dateinamen auf:

lsof -r 1 | grep iConquer

Ob mit -r 1 evtl. Informationen verloren gehen?

Wieso in die Ferne schweifen …

… das Gute liegt so nah!

Nach ca. 30 Minuten pröbeln verpasste lsof seine letzte Chance und ich begann mich, nach anderen Tools umzusehen. Zuerst stiess ich auf die GUI-Applikation fseventer, die noch weniger brauchbar war. Erst danach bemühte ich Google erneut und stiess … auf einen Blog-Eintrag von mir selbst:

fstat, lsof und fs_usage unter Mac OS X

fs_usage – der nächste Bitte!

fs_usage? Ja klar doch, wieso habe ich dieses Tool nicht bereits früher herangezogen?!

Ich aktivierte es also mittels …

sudo fs_usage | grep iConquer | grep open

… und wurde nicht enttäuscht:

01:14:18  open            /Library/Application Support/.ic241                                               0.000010   iConquer    
01:14:18  open            /Users/mario/Library/Application Support/.ic241                                   0.000007   iConquer

Sehr schön, wie der Entwickler die Datei getarnt hat: Der Punkt verhindert, dass die Textdatei, die nur eine Zahl enthält, im Finder angezeigt wird. Der kryptische Name soll den Urheber verschleiern. Aber gegenüber fs_usage kann auch hier nichts vertuscht werden *smile*

Mit vim setzte ich die Zahl von 10 auf 0 zurück (man könnte die Datei übrigens auch einfach löschen – ist etwas sauberer) – und genoss weitere zehn Runden iConquer.

Nachtrag

Wer fahrlässigerweise mit einem Benutzerkonto arbeitet, das über Administratorenrechte verfügt, muss zusätzlich folgende Datei anpassen:

iConquer.app/Contents/Resources/English.lproj/Statistics.strings

Als Administrator hat man nämlich die Berechtigung, in Applikations-Ordner zu schreiben, wovon der Entwickler von iConquer Gebrauch gemacht hat: In dieser Datei wird sozusagen doppelt Buch geführt über die Anzahl der Programmstarts.

Wenn doch der Lizenzschlüssel bald kommen würde …

Gerätegebunden?

Eine Frechheit finde ich es übrigens, dass das Game dank einer eindeutigen (?) Maschinen-Nummer an den PC gebunden wird. Ich möchte das Programm auf meinem MacBook wie auch auf meinem PowerMac installieren und benutzen.

Unterschied zu Windows?

Die Registry. Unter Windows würde ein solcher Zähler garantiert in dieser teuflischen Registry gesichert. Da lob‘ ich mir doch, dass unter Mac OS X – wie bei allen anderen Unixes – solche Dinge in hundsnormale Dateien gespeichert werden.

Tags:
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Samstag, 26. August 2006

Tabellenlayout adé! (Und: XSS vorbeugen)

(Ich hoffe, dass die Entwickler von Partyguide.ch mitlesen …)

Gestern habe ich mich daran gemacht, die Web-Site meines Arbeitgebers zu überarbeiten.

Tables are so 2003!

Zuerst nahm ich mich dem Layout an. Dieses hatte ich zu Beginn des Jahres 2003 entwickelt – einer Zeit, als Tabellenlayouts noch State-Of-The-Art waren (jedenfalls in meinem Kopf) und ich CSS gerade erst zu entdecken begann, um damit … Texte zu formatieren.

Dass man mit den Cascading Stylesheets noch viel mehr anstellen konnte, verschloss sich mir damals noch.

Viel hat sich in der Zwischenzeit getan und heute möchte ich die Funktionalität von CSS2 nicht mehr missen. Die Templates für Web-Sites lassen sich rascher und mit viel weniger Overhead erstellen und auch nachträglich ohne Eingriff in den Code abändern. Zudem sind sie behindertengerechter.

Leider, leider, hat sich der 500-Pfund-Gorilla aus Redmond bei der CSS-Implementation in den sichersten Browser der Welt (just kidding) nicht viel Mühe gegeben, weshalb man immer überprüfen muss, ob auch der MSIE auch wirklich alles korrekt anzeigt, wie es seine standardkonformeren Kollegen Firefox, Safari und Opera anstandslos tun.

Erst dank CSS habe ich gelernt, ganz normale HTML-Tags wie h1 und p zu lieben. Zu nothing-Zeiten benutzte ich beispielsweise nicht etwa h1, um Überschriften festzulegen, sondern etwas in der Form

<span class="contentTitleFirstLevel">Title</span>

Es gibt Leute, die Spass daran haben, das Rad immer wieder neu zu erfinden. Auch ich gehörte dazu. Abgebucht unter: Jugendsünde. Denn er wusste nicht, was er tat …

XSS vorbeugen

Neben der Verschlankung des Designs (die Grösse des Templates konnte in etwa halbiert werden!) liess ich natürlich auch eine Web 2.0-Komponente in das Design einfliessen: Eine interaktive Personensuche.

Aus den Fehlern von Partyguide schlau, legte ich besonderes Augenmerk auf XSS-Sicherheitslücken. Für Aussenstehende: XSS bedeutet das „Einschleusen“ von Code auf eine Web-Site. Je nach Art der Web-Site lassen sich so mehr oder weniger grosse Dummheiten anstellen. Bei Partyguide hatte man bei der Attacke beispielsweise Zugriff auf die Cookies des Benutzers, in denen das (glücklicherweise nach meiner Intervention) verschlüsselte Passwort abgelegt war.

Damit bei meiner Personensuche nicht ungewollt Code eingeschleust werden kann, der sich für eine XSS-Attacke missbrauchen liess, baute ich eine (hoffentlich recht zuverlässige) Sicherung ein:

 1 ...
 2 if(!isset($_GET['string'])) {
 3 $str_output .= '<p>Fehler: Formular nur teilweise übermittelt.</p>';
 4 die($str_output);
 5 }
 6
 7 $str_lookup_string = $_GET["string"];
 8 $str_lookup_string = preg_replace("/[^a-zA-ZäöüÄÖÜ]/",NULL,$str_lookup_string);
 9
10 if(strlen($str_lookup_string) < 3) {
11 $str_output .= '<p>Hinweis: Mind. 3 Zeichen eingeben.</p>';
12 die($str_output);
13 }
14 ...
15 $str_atom = $str_field . " LIKE '%" . mysql_escape_string($str_search_string) . "%'";
16 ...

Hier kurz einige erläuternde Erklärungen:

  • Zeile 2: Wurde die GET-Variable gar nicht erst übermittelt, ist etwas faul – Abbruch (Zeile 4). Ich beharre zudem auch darauf, dass eine GET-Variable hereinkommt und nicht POST oder sonstwas (Verwendung des GET-Arrays, nicht des REQUEST-Arrays)
  • Zeile 8: Da es sich um eine Personensuche handelt, haben Sonderzeichen nichts in der Anfrage verloren. Ich filtere diese mit PCRE aus. Und zwar so, dass ich festlege, was erlaubt ist und der Rest gelöscht wird – und nicht umgekehrt, dass ich festlege, was nicht erlaubt ist, und blöderweise doch noch etwas wichtiges vergesse, das durch den Check dann hindurchkommt. Wichtig ist hier insbesondere, dass die Markierer von HTML-Tags, > (grösser als) und < (kleiner als) weggefegt werden.
  • Zeile 10: Was beim Web-Shop von Digitec nervt, erscheint hier sinnvoll: Niemand wird wohl mit nur einem bestimmten Buchstaben (z.B. ‚e‘) nach Personen suchen. Deshalb verbieten wir zu kurze Suchanfragen lieber auch gleich (bei Digitec wiederum wäre es manchmal sinnvoll, wenn ich auch nur nach zwei Zeichen suchen könnte, weil technische Geräte nun mal oft so benannt sind).
  • Zeile 15: Obwohl der Such-String mittlerweile „clean“ sein sollte, gehe ich auf Nummer sicher, wenn ich ihn der Datenbank übergebe – und lasse mysql_escape_string drüberlaufen.

Tags:
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Samstag, 26. August 2006

Zeitvertrieb


iConquer – Mario loses
Originally uploaded by emeidi.

iConquer – ein genialer Zeitvertrieb (für Mac OS X), angelehnt an das Brettspiel Risiko.

Nur mit dem Gewinnen hapert es noch ein wenig. Bis zum nächsten gemeinsamen Wochenende mit Melanie muss ich mich deutlich verbessern. Das bedeutet: Üben, üben und nochmals üben …

Tags:
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 24. August 2006

Local.ch funktioniert!

„Geben wir Local.ch mal eine Chance …“ dachte ich mir soeben.

Das Ziel war simpel: Ich suchte eine Papeterie in der Stadt Bern (Objekt der Begierde: Sichtmäppchen für CD-Hüllen zum Einordnen).

Und tatsächlich, es funktioniert:

Papeterie in Bern

Solchen Lokalisierungs-Diensten gehört eindeutig die Zukunft.

Einziger Kritikpunkt: In der Marktgasse gibt es wohl die grösste (?) Papeterie in Bern, wo ich bereits solche Hüllen gekauft habe. War es Paputik? Ah, nein, Kollbrunner! Beide werden nicht angezeigt.

Zwei Erklärungsversuche:

  • Diese beiden Läden sind nicht unter dem Begriff ‚Papeterie‘ im System erfasst
  • Die beiden Läden sind überhaupt nicht im System erfasst (Wieso?)

Ich hau’s jetzt jedenfalls ab in die City und kaufe mir eine Ladung Mäppchen.

Özel: Off.

Tags:
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 23. August 2006

USB Sticks unter Windows 98

Es soll ja noch Leute geben, die mit Windows ME, 98 oder gar 95 unterwegs sind … Heute bin ich wieder einem solchen Sonderfall begegnet.

Viele Computer, die anno dazumal (noch im letzten Jahrhundert) mit Windows 98 ausgeliefert wurden, weisen eine USB-Schnittstelle auf – doch um daran Geräte wie Digitalkameras oder USB-Sticks (die glücklicherweise der Floppy und den ZIP-Drives endlich den wohlverdienten Todesstoss verpasst haben) zu betreiben, benötigt man … Treiber.

Während Windows 2000 und XP bereits generische Treiber mitbringen, die wohl fast jedes „normale“ USB-Gerät unterstützen, das sich als Wechsellaufwerk vorstellt, benötigt Windows 98 im Normalfall einen Treiber, der vom Hersteller des Sticks geliefert wird. Quizfrage: Wer kriegt heutzutage schon eine Treiber-CD zu seinem USB-Stick mit? Respektive: Wer hat diese nicht schon längst dem Rundordner übergeben?

Wie dem auch sei, das WWW lässt einem auch in dieser Angelegenheit nicht in Stich:

nusb23e.exe – Generischer Treiber für USB-Sticks unter Windows 98

Windows 98, especially in it’s second edition (also known as Windows 98SE), handles USB very well, however there are no generic drivers preinstalled in the operating system, so you will need to install some additional drivers for it.

Quelle: Installing USB Mass Storage Devices on Windows 98

Den (englischen) Treiber habe ich kaltblütig unter einem französischen Windows 98 installiert und die Frage, ob explorer.exe mit einer englischen Version ersetzt werden sollte, verneint. Auch bin ich mir nicht sicher, ob das betreffende Gerät wirklich über das anscheinend erforderliche Windows 98SE (= Second Edition) verfügte.

Auf jeden Fall kam das Gerät nach dem obligatorischen Neustart ohne Probleme hoch. Der Stick wurde aber erst erkannt, als ich im Geräte-Manager nach dem Treiber suchen liess und den USBSTOR.INF (oder sinngemäss) als passenden Treiber auswählte. Das gelbe Fragezeichen verschwand und der Stick wurde in der Folge problemlos gemountet.

Fünf Minuten – wenn doch beim PC-Support immer alles so rasch und erfolgreich abliefe …

Tags:
Labels: Allgemein

3 Kommentare | neuen Kommentar verfassen

Mittwoch, 23. August 2006

Korrekt quoten

(Nein, es geht hier nicht um Frauen- oder sonstige Quoten, sondern um das engl. Verb „to quote“, sprich zitieren).

Da wollte ich der Menschheit etwas gutes tun und regte Kollege Söudu mit einigen lesenswerten Links (Outlook auf englische Abkürzungen umstellen RE statt AW sowie Wie stelle ich mein Microsoft Outlook XP/2000 richtig ein?) an, E-Mail-Antworten an mich doch korrekt zu betiteln und zu „quoten“ (bitte kein Tofu). Nada. Anstelle des >-Zeichens läuft er mit Outlook (Microsoft sei Dank!) Amok – und ich erhalte nun Mails mit folgendem Totschläger-Einrückzeichen:

Asülgesetz nein! 2x nein!—–Ursprüngliche Nachricht—–
Asülgesetz nein! 2x nein!Von: Mario Aeby
Asülgesetz nein! 2x nein![…]

(Notabene: Inhaltlich durchaus auf meiner Linie, aber formell überhaupt nicht)

Mittlerweile habe ich den meines Erachtens wohl besten Artikel zum Thema gefunden – leider auf Englisch, aber was solls. Mehr gibt es zum Thema wirklich nicht zu sagen:

How to correctly quote e-mails and news posts

Tags:
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 22. August 2006

Kinder, putzt brav eure Zähne!


Kids, take care of your teeth …
Originally uploaded by emeidi.

Dann werdet ihr auch so gross und stark wie diese Heisssporne!

PS: Der Schnuggel vorne Rechts wäre noch zu haben. Bewerbung inkl. Ganzkörper-Photo per E-Mail bitte an mich …

Tags:
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Montag, 21. August 2006

Shortcuts ins Dock!


Dock – Links to Samba Shares
Originally uploaded by emeidi.

Terminal – Save Shortcut
Originally uploaded by emeidi.

Im Dock von Mac OS X kann man nicht nur Icons von häufig benutzten Applikationen ablegen, sondern auch Laufwerke und Ordner darauf ziehen, deren Inhalt bei gedrückter Maustaste angezeigt wird.

Nachfolgend zwei Beispiele, wie man mit solchen Ordnern seine Produktivität steigert:

SSH-Shortcuts

Man öffne Terminal.app und wähle im Menu Save as… aus. Im erscheinenden Dialogfeld legt man einen (aussagekräftigen) Dateinamen („Save as:“) fest, aktiviert den unteren Radio-Button mit der Beschreibung „Execute this command (specify complete path)“ und gibt im Eingabefeld den gewünschten Befehl ein, der mit Klick auf diesen Shortcut im Terminal ausgeführt werden soll.

In unserem Falle also beispielsweise:

ssh luna@192.168.0.101

Da ich sicherlich nicht der einzige bin, der desöfteren mit SSH auf verschiedenste Server zugreifen muss, handelt es sich hierbei um eine deutliche Arbeitserleichterung (und spart eine Menge Tipparbeit).

Für jeden Server eröffnet man nun einen solchen Shortcut. Sobald die Funktionsfähigkeit der erstellten Kurzbefehle geprüft worden ist, erstellt man von den Befehlen Aliasse. So kann man den Befehlen beliebige Namen geben und die lästige .term-Endung weglassen. Die Aliasse werden in einem separaten Ordner abgelegt und dieser danach ins Dock gezogen.

Mittels weniger Mausgesten kann ich ab sofort Verbindung zu all meinen Linux-Kisten aufnehmen. Arbeitet man mit SSH-Keys und nicht mit Passwörtern, loggt man sich so ohne zusätzliche Benutzerinteraktion auf den entfernten Server ein. Wunderbar, nicht?

SMB-Shares-Shortcut

Analog verfährt man mit auf dem Desktop gemounteten Samba-Freigaben: Mit Apfel+L erstellt man einen Alias des Netzlaufwerkes. Klickt man mit Doppelklick darauf, wird das Laufwerk gemountet (vorher das Share mittels Apfel-E „ejecten“, damit man Mac OS X nicht durcheinander bringt). falls man die SMB-Zugangsdaten (Workgroup, User, Password) in der Keychain abgelegt hat, geschieht auch dies ohne weitere Benutzerinteraktion.

Auch diese Shortcuts legt man in einen Dateiordner ab (bei mir heisst dieser „SMB“) und zieht ihn dann ins Dock.

Tags:
Labels: Uncategorized

Keine Kommentare | neuen Kommentar verfassen