Backup solution with Raspberry Pi – part 1

What I want to show you in this series is how to ...

  • (part 1) set up your Raspi to provide a mountable drive for your clients
  • (part 1) do an incremental and versioned back-up of your Linux clients to that drive via rsync
  • (part 2) mirror your backup to your friend's Raspi to have an (encrypted) copy in case of desaster
  • (part 2) include your phone or tablet into this scenario (well, kind of ...)
the hardware setup
(Icons made by srip from www.flaticon.com, licensed by CC 3.0 BY)

For this to work we only need the hardware and some basic Linux commands. This is what you'll need:

Continue reading "Backup solution with Raspberry Pi – part 1"

sniff own https traffic

In a Java programming project I needed to see what SOAP request my application sends out to a server. Everything soapy was done inside a 3rd-party-library and I couldn't make it log the request to the console.

So what I did was using a tool called mitmproxy. This provides a man-in-the-middle proxy server that accepts HTTP calls and can forward them via HTTPS.

First you need to create a configuration file. Mine is named httpser.py and looks like this (it actually is a python program):

def request(context, flow):
  flow.request.scheme = 'https'
  flow.request.port = 443

Then fire up the server by running:

mitmproxy -s httpser.py

Now tell your Java program to use a http proxy server by starting it with these JVM parameters:

-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080

To learn how to use mitmproxy's UI, check out their website.

MinimalXPert theme: links not working

Since WordPress 4.4 the MinimalXPert theme used here didn't produce correct links anymore. "Read more" links, clicks on the title, the featured image, search results or catagory links did not work anymore.

Solution: go to the theme's folder or your child theme's folder and find all the_permalink calls which have a parameter to them. (I found some the_permalink(' ') calls.) Remove the parameter (make it the_permalink()) and it works again.

Thunderbird: Move Messages (to SPAM) with Keyboard Shortcut

With the keyconfig extension you can attach little scripts to keyboard shortcuts. It took me quite some googleing to find the right commands for moving the selected message to a specific folder:

  • Download and install keyconfig
  • Right-click on your destination folder (here: SPAM) and choose "Prefences"
  • Copy the address of the folder (here: imap://koem%40blabla.de@capella.uberspace.de/SPAM)
  • Open the Add-Ons-Manager and choose Prefences of keyconfig
  • Create a new shortcut and paste this as the code: MsgMoveMessage(MailUtils.getFolderForURI("<the-copied-folder-address>"));
  • Name it, save it and assign a keyboard shortcut

Ubuntu: User verstecken

Möchte man am Anmeldebildschirm und im Unity-Menü oben rechts einen User nicht anzeigen, hilft die Information, dass dort nur User sichtbar sind, deren UID >= 1000 ist.

Mit dem Befehl

sudo usermod -u 888 <username>

kann man die UID eines Users ändern. Danach ist er vom Anmeldebildschirm und aus dem Unity-Menü verschwunden.

Android, S4 mini: externe SD-Karte kaputt

Jetzt ist es schon zum 2. Mal passiert: die SD-Karte in meinem Samsung S4 mini hat sich verabschiedet. Ich soll sie formatieren, sagt Android. Aber wenn ich das tue, macht er es nicht. Auch im Recovery geht es nicht.

Hier ein paar Tipps:

  • unter Windows hilft angeblich ein chkdsk /X /F <driveletter>:
  • Installier testdisk, lass es als root laufen. Karte steckt im (USB-)SD-Karten-Adapter. Damit kannst du wenigstens die Dateien retten.
  • mach danach im Zielordner ein find -name "_*" -exec file {} \;. Damit findest du Dateien, deren Namen nicht mehr korrekt gerettet werden konnten.
  • zum wieder lesbar machen der SD-Karte: starte testdisk nochmal und versuch diese Optionen: (danach sind aber trotzdem sicherlich einige Dateien nicht lesbar oder haben 0 Byte -> find -size 0 -exec rm {} \; ):

>Create a new log file
[Choose Disk]
>Intel/PC partition
>Advanced
[Choose Partition]
>Boot
>Repair FAT
[Accept Defaults and Write]
>(Q)uit until exited

Meine beste Lösung bei diesem Problem ist:

  1. Daten sichern mit testdisk
  2. SD-Karte wieder lesbar machen
  3. Karte formatieren im Recovery oder mit gparted (fat32)
  4. Backup aufspielen und danach die Dateien aus dem ersten Schritt aufspielen

Aktuelle mysql-Version für Uberspace kompilieren

Auf Uberspace.de kann es passieren, dass die installierte MySQL-Version veraltet ist und man eine aktuellere Version verwenden möchte. Hier die Schritte um das zu realisieren.

In Kürze bedeutet es: CentOS installierenMySQL kompilierenkompilierte Version von MySQL zu Uberspace übertragenMySQL einrichtenStartscripte erstellenz.B. in WordPress verwendenaufräumenBackup einrichten

Ich benutze folgende beispielhafte Konventionen in dieser Anleitung:

  • grobi: der Username auf uberspace.de
  • enif: der Servername auf dem der Uberspace-Account liegt. Alle Server haben Namen von Sternen oder Sternbildern. Z.B. hamal.uberspace.de oder capella.uberspace.de
  • ich verwende hier CentOS 6.6
  • ich installiere hier im Beispiel die MySQL-Version 5.6.24
  • ich installiere die Version nach ~/.mymysql
  • die MySQL-Version soll auf Port 33306 laufen

CentOS installieren

Zuerst finden wir raus, welche CentOS auf uberspace läuft. Also per SSH verbinden und dieses Kommando absetzen:

> cat /etc/redhat-release
CentOS release 6.6 (Final)

Also laden wir erstmal die Version herunter: Minimal ISO 64 Bit von http://wiki.centos.org/Download. Danach diese Version installieren, z.B. in eine VirtualBox VM.

  • Deutsches System
  • Rechnername: enif (siehe oben)
  • Netzwerk konfigurieren: eth0 bearbeiten → Automatisch verbinden
  • Zeitzone: Berlin

Nach der Installation loggen wir uns als root ein und richten einen Account für grobi ein:

> adduser grobi
> passwd grobi

MySQL kompilieren

Jetzt als root ein paar Pakete installieren:

> yum install wget cmake gcc-c++ ncurses-devel

Wir loggen uns als grobi ein, damit wir beim kompilieren auch ja nicht in den Genuss von root-Rechten kommen, denn die haben wir ja auf Uberspace auch nicht. Nicht dass da was passiert, was uns nachher - als normaler User - das Genick bricht.

> sudo su - grobi

Nun laden wir die gewünschte MySQL als Sourcen herunter:

  • per Browser auf einem anderen Rechner auf http://dev.mysql.com/downloads/mysql/ gehen
  • "Source Code" und "Generic Linux" auswählen
  • bei "Compressed TAR Archive" auf Download klicken
  • auf der nächsten Seite den Link "No thanks, just start my download." kopieren
  • im CentOS mit wget die Sourcen runterladen, entpacken und ins Verzeichnis wechseln. Z. B.:

> wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.24.tar.gz
> tar xzf MySQL-5.6.24.tar.gz
> cd mysql-5.6.24

Zum kompilieren müssen wir ein paar Optionen mitgeben (mehr hier: http://dev.mysql.com/doc/mysql-sourcebuild-excerpt/5.5/en/source-configuration-options.html) und dann geht's los:

> cmake -DCMAKE_INSTALL_PREFIX=/home/grobi/.mymysql/ -DSYSCONFDIR=/home/grobi/.mymysql/
> make
> make install

zu Uberspace übertragen

MySQL 5.6 ist nun im Verzeichnis /home/grobi/.mymysql installiert. Wir übertragen das ganze Verzeichnis in unser $HOME auf Uberspace. Z.B. mit scp:

> cd
> tar czf mymy.tgz .mymysql/
> scp mymy.tgz grobi@enif.uberspace.de: # nicht den Doppelpunkt am Ende vergessen

Es sind ca. 1 GB Daten - gepackt ein Viertel davon. Keine Ahnung, was davon alles wirklich benötigt wird... Vielleicht fummel ich das später mal raus ...

Fahr dein CentOS jetzt runter, es frisst nur Strom.

MySQL einrichten

Unser selbst installiertes CentOS hat jetzt ausgedient. Wir brauchen es nicht mehr. Eigentlich. Wenn du eventuell noch ein paar andere Optionen beim Kompilieren ausprobieren willst, solltest du es noch nicht wegwerfen.

Wir loggen uns erstmal per ssh auf unserem Uberspace ein, entpacken die übertragene Datei und wechseln ins Installationsverzeichnis

> ssh grobi@enif.uberspace.de
> tar xzf mymy.tgz
> cd .mymysql/

Next step: Wir erstellen hier die Datei my.cnf mit diesem Inhalt:

[mysqld]
socket=
port=33306
datadir=/home/grobi/.mymysql/data/
tmpdir=/tmp/

[mysql]
socket=
port=33306
protocol=TCP

Wir erstellen jetzt die Systemtabellen und können dann unseren MySQL-Server starten:

> scripts/mysql_install_db --basedir=/home/grobi/.mymysql/
> bin/mysqld

Nun noch root-Passwort vergeben und ein paar Einstellungen machen (auf einer weiteren Konsole). Dazu muss die Datei bin/mysql_secure_installation angepasst werden, so dass korrekte Werte für port und protocol verwendet werden (dies kann bei MySQL 5.7 angeblich per Kommandozeile geschehen). MySQL 5.6: In der Funktion "sub make_config" fügen wir diese Werte hinzu (nur die 2. Zeile ist neu):

"passwort='$sec_pass'",
"socket=''", "port=33306", "protocol=TCP", # diese Zeile einfügen
"connect-expired-password");

Und ausführen:

> bin/mysql_secure_installation

  • current password: Enter
  • set root password: Y
  • remove anonymous users: Y
  • disallow root login remotely: Y
  • remove test database and access to it: Y
  • reload privilege tables now: Y

Ok! Wir haben fertig und die Datenbank läuft! Cool? Sehr cool!

Jetzt kann man mit

> bin/mysql --port=33306 -u root -p

das Client-Programm verwenden. Dafür sollte man sich einen Alias einrichten. Zum Beispiel so:

> alias mymy='/home/grobi/.mymysql/bin/mysql --port=33306'

Dies funktioniert bei mir ohne User / Password, weil in der schon vorhandenen ~/.my.cnf Passwort und User der alten MySQL-Version stehen. Ich habe für die 5.6er die gleichen Werte für User und Passwort ringerichtet.

Startscripte erstellen

Auch Uberspace-Server werden wohl ab und an mal neugestartet. Selten, aber wenn, dann soll unser MySQL beim hochfahren mitgestartet werden.

> uptime
05:58:35 up 301 days, 10:50, 0 users, load average: 0.29, 0.51, 0.50

Dazu müssen wir einen Service einrichten. Die ganze Anleitung dazu gibt es hier: https://wiki.uberspace.de/system:daemontools. Wir beginnen mit der Vorbereitung:

> test -d ~/service || uberspace-setup-svscan

Schreib jetzt ein Script ~/bin/mymysqld das den MySQL-Daemon startet und mach es ausführbar. Inhalt:

#!/bin/sh

exec ~/.mymysql/bin/mysqld

Die Startscripte erstellst du mit

> uberspace-setup-service mymysqld ~/bin/mymyslqd

Hier kannst du nachlesen, wie du ausprobierst, ob das Starten und Stoppen funktioniert (-u / -d / usw). Loggingausgaben kannst du dir mit

> tail -f ~/service/mymysqld/log/main/*

anzeigen lassen.

Beispiel: in WordPress verwenden

In WordPress musst du die DB_HOST Variable so setzen:

define('DB_HOST', '127.0.0.1:33306'); /* nicht localhost verwenden */

Aufräumen

  • dein selbst installiertes CentOS kann jetzt gelöscht werden
  • Datei mymy.tgz im Home deines Uberspace kann gelöscht werden

Backup einrichten

So! Nachdem nun alles sauber läuft, sollte man sich noch um den Backup kümmern. Denn auch wenn dein Server gesichert wird, ist es keine gute Idee, auf eine Dateisicherung des MySQL-Arbeitsverzeichnisses zu vertrauen. Hier im Beispiel machen wir einen MySQL-Dump in die Datei ~/.mymymsql/backup.dump.

~/.mymysql/bin/mysqldump --host=127.0.0.1 --port=33306 --all-databases > ~/.mymysql/backup.dump

Diesen Befehl in die crontab und gut ist. Denn die Datei backup.dump wird ja beim nächsten Backup mitgesichert.

Man beachte: während eines Dumps wird die Datenbank kurz gesperrt. Bei großen Datenbanken kann das natürlich zu Problemen führen (siehe auch hier).

Quartz in Tomcat 7 einbinden

Quartz ist ein Scheduler der es auf relativ einfache Weise ermöglicht, Aktionen zu bestimmten Zeitpunkten auszuführen. Wenn man Quartz in Tomcat einbindet, wird es automatisch gestartet und gestoppt. Außerdem zeige ich hier, wie man einen Scheduler erzeugt, den man dann in den Servlets / WebServices oder was auch immer verwenden kann um neue Jobs einzustellen.

web.xml

Hier wird dafür gesorgt, dass Quartz gestartet und gestoppt wird. Der erste Parameter gibt an, wo die config-Datei zu finden ist. In diesem Beispiel liegt sie im root des classpath.

 <listener>
 <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
 </listener>
 <context-param>
 <param-name>quartz:config-file</param-name>
 <param-value>quartz.properties</param-value>
 </context-param>
 <context-param>
 <param-name>quartz:shutdown-on-unload</param-name>
 <param-value>true</param-value>
 </context-param>
 <context-param>
 <param-name>quartz:wait-on-shutdown</param-name>
 <param-value>false</param-value>
 </context-param>
 <context-param>
 <param-name>quartz:start-scheduler-on-load</param-name>
 <param-value>true</param-value>
 </context-param>

Scheduler holen

Den Scheduler holt man jetzt aus dem ServletContext:

    /**
     * returns the scheduler
     */
    public static Scheduler getScheduler(ServletContext context)
            throws SchedulerException {
        StdSchedulerFactory factory = (StdSchedulerFactory) context
                .getAttribute("org.quartz.impl.StdSchedulerFactory.KEY");
        return factory.getScheduler("MyScheduler");
    }

That's it. Jetzt kann man Quartz in Tomcat verwenden.

JobStore in der Datenbank

Um die in der web.xml definierte DataSource der Anwendung mitzubenutzen muss man in quartz.properties nur folgendes einstellen:

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.dataSource = <datasource-name>
org.quartz.dataSource.eweb_pool.jndiURL = java:comp/env/jdbc/<datasource-name>
org.quartz.jobStore.tablePrefix = QRTZ_

Die Definitionen für die Datenbanktabellen sind im Downloadpaket von Quartz enthalten.

Ubuntu 14.04: Tastatur auf “englisch” eingestellt nach Neustart

Wenn deine Tastatur ständig auf englisch anstatt auf deutsch eingestellt ist, wenn du den Rechner neu startest, kannst du das so in den Griff bekommen:

  • installier den dconf-editor
  • öffne ihn
  • geh zu desktop -> ibus -> general
  • setz das Häkchen bei "use-system-keyboard-layout"

Jetzt sollte deine Tastatur nach einem Neustart deutsch eingestellt sein.

PHP 5.5 unter IIS zum Laufen kriegen

In einem gerade beendeten Projekt musste ich mich mal wieder mit Windows herumschlagen. Diese Klickerei ... gruselig.

Da dieser Blog auch ein Notizbuch ist, möchte ich hier aufschreiben, wie man unter Windows Server 2012 einen IIS 8.5 mit PHP 5.5.11 und eine Anbindung an SQL Server Express 2014 hin bekommt.

Alles nur stichpunktartig, aber m. E. völlig ausreichend.

Windows Server 2012 R2

Man kann sich für lau eine Testversion herunterladen, z. B. als ISO-Datei. Sie ist nach Aktivierung für 180 Tage nutzbar.

Ich habe die "Standard Testversion mit grafischer Oberfläche" in einer VirtualBox mit 2GB RAM und 25GB HD installiert. Das langt massig. Hier auf meinem Lenovo X230, 8 GB, 4 Kerne, 2.9 GHz mit Ubuntu 14.4 läuft das ganz fluffig.

VirtualBox Gasterweiterungen

Danach sollte man die Gasterweiterungen installieren. Man findet sie, wenn Windows im Fenster läuft, oben im Menü.

Helferlein

Dann kommen erstmal ein paar Programme drauf, die unverzichtbar sind:

  • natürlich Firefox - der IE ist so komisch voreingestellt, er ist quasi unbenutzbar. Probier es aus, du wirst verzweifeln. Versuch gar nicht erst, das zu beheben. Das ist echt nicht nötig.
  • Notepad++ - ein ganz brauchbarer Texteditor. Natürlich ist das nur eine Krücke gegen den VI 🙂
  • den Web Platform Installer (WPI) - Das Ding kann ein paar Serverkomponenten installieren. Vorsicht: installieren ja, deinstallieren kann das Teil nicht. Man merkt, dass es aus Redmond kommt. Und damit installierte Sachen wieder wegzubekommen ist echt schwierig.

IIS (das ist ein Web Server!)

Die Installation macht man mit dem Server Manager:

  • Rechts oben auf Manage
  • Add Roles and features
  • Next, Next, Next
  • Web Server (IIS) Add Features
  • Next, Next, Next, Next
  • Install

SQL Server 2014 Express

Den gibt's auch gratis ... Microsoft, was ist los mit dir? Man könnte meinen ihr hättet was verstanden! Naja, der Druck durch MySQL ist wohl einfach zu stark.

Hier eine Version, die mit SQLEXPRWT beginnt, auswählen. WT heißt "with tools" ... Der Download läuft? Dann aber erstmal mit dem Web Platform Installer (WPI) ".Net 3.5 SP1" installieren.

Die Installation von SQL Express geht so:

  • "New SQL-Server Standalone bla bla bla ..."
  • Feature Selection: nix ändern
  • Instance Configuration: "Named instance" klicken, weiter, weiter, weiter usw.
  • Database Engine Configuration: hier habe ich "Mixed Mode" gewählt und ein Passwort vergeben - Das bedeutet, dass man auch User in der DB einrichten kann und nicht nur die User, die unter Windows eingerichtet sind, verwenden kann.

Noch nie war Windows einfacher, ehrlich. Ich war teilweise echt begeistert. Zumindest bis die ersten Probleme kamen und die Lösungen mal wieder nix mit den Fehlermeldungen zu tun hatten. Da hat sich seit den 80ern echt nichts dran geändert.

PHP 5.5.11

Jetzt kommt Butter bei die Fische:

  • PHP 5.5.11 per WPI installieren
  • fastcgi-Fehler beheben: "Visual C++ Redistributable for Visual Studio 2012 (Update 4)" installieren - vcredist_x86.exe, nicht x64! Dies ist nötig, weil irgendein PHP-Modul mit Visual C++ 2012 kompiliert wurde und wir die Libs (dll) noch nicht auf dem Rechner haben. WPI weiß das aber nicht.

PHP version prüfen:

PHP Driver für SQL Server installieren (v3.1 ist für PHP 5.5):

  • hier: http://www.microsoft.com/en-us/download/details.aspx?id=20098 - da es für PHP 5.6 noch keine Treiber gibt, bleibt uns nur 5.5. Auch das weiß WPI noch nicht.
  • SQLSRV31.EXE ausführen und als Pfad zum Entpacken "C:\Program Files (x86)\PHP\v5.5\ext\" angeben!
  • in php.ini ganz unten eintragen: "extension=php_sqlsrv_55_nts.dll"

Test ob SQL Server Extension geladen werden kann:

  • in der sogenannten Powershell (hier geht sogar ls) dies ausführen: php -d display_startup_errors=1 -d error_reporting=-1 -d display_errors -c "C:\Program Files (x86)\PHP\v5.5\php.ini" -m
  • es sollte sqlsrv im output erscheinen

Fertig

So, das war's - jetzt am besten die VM ausmachen, klonen und zur Seite legen, bevor du wieder irgendwas kaputt machst, Junge!