Fix HP Compaq 6910p Fan Noise under Linux

Although I prefer Macs as my primary work horses, I keep a trusty old HP Compaq 6910p around as a fallback. While generally nice the 6910p has one major flaw when being run with Linux: The fans will keep running constantly, emitting a high frequency whine that makes working unbearable in a couple of minutes. By chance I found a fix for the problem here. Open a terminal window and issue the following commands:

sudo -i
for i in 0 1 2 3 4; do echo "0" > /sys/class/thermal/cooling_device${i}/cur_state; done

While this will not completely eliminate the fans spinning up, it will at least make them spin down again when no more cooling is needed.

IPv6 bei Strato mit Debian “Jessie”

Nach dem Upgrade eines meiner Server bei Strato auf Debian “Jessie” funktionierte auf einmal das Routing von IPv6 nicht mehr. Schuld ist wohl, dass Strato den Eintrag fe80::1 als Default-Route verwendet, was unter Jessie anscheinend nicht mehr so einfach möglich ist. Funktionieren tut es bei mir jetzt wieder mit diesem Eintrag in /etc/network/interfaces:

iface eth0 inet6 static
    pre-up modprobe ipv6
    address 2a01:238:429c:2900:dead:beef:2bad:4dad
    netmask 128
    gateway fe80::1
    post-up ip -6 route add default via fe80::1 dev eth0

Wichtig ist dabei die letzte Zeile. Sie weist das Betriebssystem an, das Default-Gateway über das Interface eth0 anzusprechen und nicht – wie es das normalerweise tun würde – über lo.

Die Lüge vom Wählerwillen

Nun ist er also mal wieder in vielen Zeitungen: der bereits am Wahlabend insbesondere von den großen Parteien so gern zitierte “Wählerwille”, der – zumindest denselben Parteien zufolge – eine “große Koalition gewünscht” habe. Frisch aufgewärmt nach Abschluss der Koalitionsverhandlungen. Jetzt mag es ja noch angehen, dass sich Parteien diese Freiheit der Interpretation eines Wahlergebnisses nehmen. Was mich allerdings zutiefst bestürzt ist, dass diese schöne Floskel vollkommen kritiklos auch von der Presse geschluckt und ohne weiteres Hinterfragen verbreitet wurde und wird.

Entschuldigung, aber auf meinem Wahlzettel fand sich kein Feld “Große Koalition”, bei dem ich mein Kreuzchen hätte machen können. Und durch Befragungen im Freundes-, Bekannten- und Kollegenkreis konnte ich feststellen, dass auch dort weder bei der Wahl ein entsprechendes Feld aufgetaucht ist, noch sich einer der Befragten eine große Koalition gewünscht hätte.

Auch wenn unsere Politiker das verständlicher Weise nicht so gerne hören und vermutlich auch nicht wahrhaben wollen: Ausser den nun in der großen Koalition vereinten Parteigrößen (und zumindest bei der SPD gesichert der Mehrheit ihrer Mitglieder) wollte wohl niemand diese große Koalition. Ist doch der bereits aus dem letzten Experiment dieser Art bekannte Effekt schon jetzt absehbar: Aus den Programmen der jeweiligen Parteien wird ein fauler Kompromiss geschmiedet, mit dem die Politiker gut, die Bürger dafür weniger gut leben können. Hurra, ein Hoch auf den glücklicher Weise frei interpretierbaren Wählerwillen.

Anstatt nur die SPD-Mitglieder zu ihrer Meinung zu befragen (und, seien wir mal ehrlich: hatte irgendwer erwartet, dass die sagen “Nö, wir verzichten auf die Macht! Schon aus Prinzip! Woll!”? Ernsthaft jetzt?) hätte, würden die Volksvertreter ihrem Namen nur halbwegs gerecht werden wollen, das gesamte Volk befragt werden müssen, bevor man ihm einfach einen dem großen Teil der Politik gerade passenden “Willen” oder “Wunsch” unterjubelt. Ok, das wäre sicherlich – wenn überhaupt – nur mit großem Aufwand machbar gewesen und hätte natürlich das Risiko geborgen, dass das Wahlvieh vielleicht doch nicht ganz so dumm ist wie angenommen oder zumindest erhofft und daher gesagt hätte: “Ja nee, das “Große Koalition”-Dingens wollten wir dann jetzt doch nicht.”.

Ganz abgesehen davon, dass es eine große Koalition so dringend braucht, wie ein Fisch ein Fahrrad. Oder feste Koalitionen über eine Legislatur-Periode hinweg überhaupt.

Würden nämlich die Parteien, anstatt sklavisch an ihren Programmen, Ideologien und natürlich den jeweils aktuellen Lobbyisten zu hängen, mal das tun, was eigentlich ihre Aufgabe ist – nämlich die Interessen des Volkes zu vertreten -, dann sollte es nach gesundem Menschenverstand auch gar kein Problem sein, für Projekte, Gesetze und was sonst noch so aus dem Berliner-Moloch entspringt Mehrheiten über alle Parteien hinweg zu finden (das mit dem Fraktionszwang – übrigens genau so ein Unding wie Koalitionen – lasse ich jetzt mal der Einfachheit halber unter den Tisch fallen). Und damit gleichzeitig und dann tatsächlich auch für die Mehrheit aller Wähler.

Vereinfacht gesagt: zum Regieren braucht es eigentlich keine auf welchem Weg auch immer künstlich herbei geführte absolute Mehrheit. Sie macht das Regieren nur bequem und einfach. Und deswegen ist auch die große Koalition für Politiker so toll. Weil sie es den dann Regierenden bequem und einfach macht.

Ich will aber nicht, dass es sich die Leute, die letztlich auch über mein Wohl entscheiden, bequem und einfachen machen. Ich will, dass die über das, was sie entscheiden, vorher gründlich nachdenken. Dass sie abwägen, andere Meinungen anhören (müssen) und eventuell sogar aktiv einholen. Und ich bin mir verdammt sicher, dass sich das noch viele andere Leute wünschen. Und ich will nicht, dass mir – als Angehörigem der Gruppe “Wähler” – unterstellt wird, ich würde die “bequem und einfach”-Variante doch wollen. Weder von Politikern, noch von Journalisten.

Vielleicht merkt das ja doch noch mal der ein oder andere Journalist in unserem Land und hält inne und reflektiert, bevor er das nächste Mal davon schreibt, was der “Wählerwille” wollte. (Spezielle Grüße gehen an dieser Stelle an Walter Roller von der Augsburger Allgemeinen, der mein persönliches Fass zum Überlaufen gebracht hat). Bei Politikern habe ich die Hoffnung schon aufgegeben, die haben zum größten Teil längst jegliche Bodenhaftung verloren.

Once more: How to really install Oracle Java on Mac OS X

After upgrading to Mac OS X 10.9 “Mavericks” you may notice that the upgrade also removed any versions of Java you may have had installed. If you’re just using Java Applets in the browser, you can simply go to the Java Download Page, install the offered version of the JRE and be done with it.
If, however, you also need to run local Java apps like for example Eclipse, you’ll get prompted to install Apple’s version of Java. If you do that, this will not only break the browser plugin but also install a version of Java that’s quite outdated and not well maintained by Apple.

The better solution is to download Oracle’s JDK (yup, the complete thing) and make OS X work happily with that. To do this, head over to Oracle’s Java SE download page, click the big button labeled “Java Download” and on the next page accept the License Agreement and select the jdk-7uXX-macosx-x64.dmg for download.
Install by double-clicking on the downloaded file and follow the on-screen instruction. Afterwards open a terminal window and issue

sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_XX.jdk /System/Library/Java/JavaVirtualMachines/

(That’s quite a long line above, so make sure to scroll to the right and select everything. Also make sure to replace the ‘XX’ in the version number with the correct version of the JDK you downloaded)

That’s it. From now on Mac OS X 10.9 (and 10.8, for that matter) will work happily with Oracle’s Java and no longer prompt for installing the Apple version.

802.11ac: weniger ist eben doch manchmal mehr

Dank der baulichen Gegebenheiten (Stahlbeton) hatte ich bislang immer mindestens zwei WLAN-Router in Betrieb – pro Etage einen. Nur so war durchgängiger WLAN-Empfang zu gewährleisten. Dank ständiger Aktualisierung der Hardware war bislang noch 802.11n das Maß der Dinge. Seit einer Weile arbeitet hier aber auch ein Router, der das neue 802.11ac unterstützt: ein Belkin AC1200.
Und mit dessen Einzug fingen dann auch die Probleme an. Clients verloren immer wieder die Netzwerkverbindung, gelegentlich ließ sich gar keine Verbindung aufbauen und viele Ärgernisse mehr. Die Lösung war aber so einfach, dass ich zunächst gar nicht drauf gekommen bin: Einfach den zweiten WLAN-Router abschalten. Der AC1200 deckt problemlos alle Stockwerke ab, auch durch die Betonmauern. Damit wäre für mich zumindest belegt, das 802.11ac tatsächlich eine bessere Reichweite hat als seine Vorgänger. Und Strom für den zweiten Router spare ich auch noch. Fein.

Crocodile Dundee’s Handy

Mein aktueller Begleiter für Zwecke wie telefonische Erreichbarkeit, kurzen E-Mail-Check oder auch gelegentliche Fernwartung von Servern ist ein iconBIT Mercury S. Wenn man das Ding zum ersten Mal sieht und mit den sonst üblichen Handys vergleicht, denkt man spontan an Crocodile Dundee: “Das soll ein Handy sein? DAS ist ein Handy.”
Mehr als 250 Gramm schwer, satte Bildschirmdiagonale von 5,8 Zoll – wer braucht sowas eigentlich? Ich. Definitiv.

Mercury S, iPhone 3GS, Defy+Wuchtbrumme(r): das Mercury S ist schon ein Brett …

Warum? Mehrere Gründe:

  • Dank Dual-SIM muss ich nicht zwei Handys für Firma und Privatgespräche mit mir rumschleppen
  • Guter Empfang – wo das iPhone schon längst aufgibt kann ich mit dem Mercury S noch surfen und telefonieren. Bislang nur geschlagen von meinem Motorola Defy+, das noch ‘nen Tacken hartnäckiger am Funksignal hängt
  • Großes Handy = großer Akku. Wenn grad wenig los ist hält der auch schon mal drei Tage durch. Drei Tage! Mit WLAN, Bluetooth und …
  • Dank meiner nicht ganz zierlichen Hände (vulgo: “Pratzen”) kann ich das Brett immer noch mit einer Hand bedienen. Ok, viel größer dürfte es nicht mehr sein. Aber es passt noch in die Arschtasche der Jeans – und überlebt es, wenn man sich draufsetzt. Perfekt.
  • Das große Display sorgt dafür, dass ich nicht jedes Mal die Lesebrille brauche, wenn ich E-Mails oder bei längeren Bahnfahrten auch mal Bücher lesen will
  • Selbst Kommandozeile oder RDP geht erstaunlich gut, trotz der eigentlich inzwischen indiskutablen Auflösung von 800×480 Pixeln

So Sachen wie die etwas schwächliche Kamera oder das mit Android 4.0.4 doch schon etwas angestaubte OS stören mich dann eher weniger. Ich brauch’ ja auch keinen polierten Hammer, um Nägel ins Holz zu hauen. Das Mercury S ist ein Arbeitsgerät, und den Job erledigt es für mich extrem gut.

mercuryS_iphone3_motorolaDefy_height2Dick geht anders: Links Motorola Defy+, Mitte iconBIT Mercury S, Rechts iPhone 3GS

Fazit: Auch wenn mich der Rest der Welt für verrückt hält – speziell wenn ich mir das Brett tatsächlich mal vor den Kopf ans Ohr halte: Das Mercury S ist eines der wenigen Geräte, die seit langem mal wieder den “Editor refuses to give it back”-Award erhält. Es sei denn, jemand gibt mir ein “iPad Micro Retina + Phone”. Da könnte ich dann doch schwach werden.

Finally: A Fix for Python 2.7 Aborts on Import of ctypes

This has been bugging me for quite some time now: Every time I tried to import the ctypes module into Python 2.7, all I would get was the famous “Aborted” message. With some time to spare I could trace the problem down to the file closures.c of the libffi submodule. Most likely due to a compiler/optimization bug in older versions of gcc a double-free is happening there in line 151.
Since the surrounding function only checks for the presence of SELinux on the host and since the box I need to run Python 2.7 on doesn’t have SELinux installed, I opted for simply removing the whole thing:

--- a/Modules/_ctypes/libffi/src/closures.c 2012-04-10 01:07:33.000000000 +0200
+++ b/Modules/_ctpyes/libffi/src/closures.c 2012-06-20 17:35:40.277850045 +0200
@@ -119,52 +119,7 @@
 #define LACKS_SYS_MMAN_H 1
 
 #if FFI_MMAP_EXEC_SELINUX
-#include <sys/statfs.h>
-#include <stdlib.h>
-
-static int selinux_enabled = -1;
-
-static int
-selinux_enabled_check (void)
-{
-  struct statfs sfs;
-  FILE *f;
-  char *buf = NULL;
-  size_t len = 0;
-
-  if (statfs ("/selinux", &sfs) >= 0
-      && (unsigned int) sfs.f_type == 0xf97cff8cU)
-    return 1;
-  f = fopen ("/proc/mounts", "r");
-  if (f == NULL)
-    return 0;
-  while (getline (&buf, &len, f) >= 0)
-    {
-      char *p = strchr (buf, ' ');
-      if (p == NULL)
-        break;
-      p = strchr (p + 1, ' ');
-      if (p == NULL)
-        break;
-      if (strncmp (p + 1, "selinuxfs ", 10) != 0)
-        {
-          free (buf);
-          fclose (f);
-          return 1;
-        }
-    }
-  free (buf);
-  fclose (f);
-  return 0;
-}
-
-#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \
-                 : (selinux_enabled = selinux_enabled_check ()))
-
-#else
-
 #define is_selinux_enabled() 0
-
 #endif /* !FFI_MMAP_EXEC_SELINUX */
 
 #elif defined (__CYGWIN__)

Compile, install – works. Now on to some other stuff that needs Python 2.7 to run properly ;)

Astaro ASG as OpenVPN Access Server client

Just about four weeks ago I posted about the resurrection of the .ovpn to .apc converter script. In the meantime Alois told me in the comments that while this was nice it didn’t work for current versions of the OpenVPN Access Server and the .ovpn files it creates.

Well, since there’s been nothing much else to do I did some more work on the script and I can now happily say that it now also converts the new .ovpn format to an .apc the Astaro can understand. Unfortunately, there’s a little catch: the OpenVPN Access Server relies on ‘tls-auth’ for client connections and the Astaro neither knows of that concept not provides a method to import the needed key file. So I had to do some creative manipulation to make the Astaro do my bidding to include the necessary config statements. In addition, you will need to manually copy the key file to the Astaro to make everything work as expected. To make things as easy as possible, the script will tell you what to do.

If you’re interested, check out the latest version of ovpn-to-apc.sh on Gitorious. If it works for you, let me know. If it doesn’t, let me know, too.

Kleine Erfolgserlebnisse

Vorher

Check name    Uptime    Downtime    Outages   Response time
#######       58.54%    9h 57m 02s    189      9649ms

Nachher

Check name    Uptime    Downtime    Outages   Response time
#######       100.00%   0h 00m 00s     0        647ms

.ovpn to .apc Converter Revisited

The Astaro Security Gateway (ASG) is a great firewall and remote access solution. The only flaw of it being that Astaro, too, tries to build a walled garden around their suite of products. One major drawback here is that while the ASG has outstanding capabilities as a remote access server, there’s no easy way to use it as a client to connect to an OpenVPN SSL server. The main show stopper is that the ASG expects to get all it’s connection information from a .apc file while OpenVPN at best provides a .ovpn file which has a completely different structure.
Back in 2009 Patrick Schneider provided a simple bash script that would convert .ovpn files together with the needed certificates and key files into a .apc file the ASG could read. Unfortunately the script stopped working with newer ASG releases. Since I needed the functionality for a current project, I resurrected the code, polished and updated it a bit. The result can now be found on Gitorious: the new OVPN-to-APC converter script. Feel free to clone and enhance.

Update: Just pushed a new version to Gitorious that now handles the new .ovpn format provided by the OpenVPN Access Server as well.

Nginx + Dokuwiki and nice URLs

After almost tearing my hair out while trying to get those two to fully work together, I found the solution in the end. While most of the things that can be read here and there are right and true, all solutions I found one the web have one problem: After activating nice URLs in Dokuwiki, you won’t be able to use ACLs anymore with Nginx as the web front end.
The solution is quite simple, there’s an additional global rewrite needed:

rewrite ^/?$ /doku.php last;

The reason being that if you rely on “try_files” doing the right thing, it will do what you want for normal pages. But it will trigger a 302 redirect for admin pages, thereby losing all the POST data that should have been sent. Using the rewrite will keep the POST data and thus make the ACLs editing work again, even with pretty URLs.

Slowing down

This has been a very hectic couple of weeks. Not only the beta testing for the (now not so) new Netgear ReadyNAS boxes with ARM architecture: the Duo v2 and the NV+ v2. But also building add-ons for the new interface. Currently available are:

Especially the new web interface was a major obstacle there for in some situations it behaves quite different than the old and trusty Frontview. But now that I’ve got the hang of it I’m quite confident that more stuff is going to follow soon. And of course updates to the ReadyNAS Sparc stuff that has been put on hold for doing the ARM thing ;) Since I’ve just upgraded this site to WordPress 3.3, I might do an add-on for that as well – we’ll see.

For now it’s relaxing time – at least until the end of the week.

Fixing PHP-FPM’s SCRIPT_NAME Bug The Brute Force Way

It’s not really news that PHP in it’s CGI or FPM flavor has slight to modest problems getting it’s environment right when using Apache as the front end web server, especially the $_SERVER[‘SCRIPT_NAME’] variable many scripts rely on to determine their true location on the hard drive. This erratic behavior is heavily documented in bug reports 51983 and 55208. As is common practice for the PHP-FPM team, their approach is to sit still and wait until this bug goes away on it’s own. This approach, proven to work for many politicians, may however not work for those folks, that need a solution to the problem at hand. A quite simple solution that unfortunately requires to recompile PHP is the following brute force patch for PHP 5.3.8:

--- php-5.3.8/sapi/fpm/fpm/fpm_main.c.org   2011-07-18 23:03:44.000000000 +0200
+++ php-5.3.8/sapi/fpm/fpm/fpm_main.c.  2011-11-24 18:29:37.000000000 +0100
@@ -1084,6 +1084,7 @@
 {
    char *env_script_filename = sapi_cgibin_getenv("SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME") - 1 TSRMLS_CC);
    char *env_path_translated = sapi_cgibin_getenv("PATH_TRANSLATED", sizeof("PATH_TRANSLATED") - 1 TSRMLS_CC);
+   char *env_redirect_url = sapi_cgibin_getenv("REDIRECT_URL", sizeof("REDIRECT_URL") - 1 TSRMLS_CC);
    char *script_path_translated = env_script_filename;
    char *ini;
    int apache_was_here = 0;
@@ -1118,6 +1119,16 @@
 
        /* Hack for buggy IIS that sets incorrect PATH_INFO */
        char *env_server_software = sapi_cgibin_getenv("SERVER_SOFTWARE", sizeof("SERVER_SOFTWARE") - 1 TSRMLS_CC);
+                if (env_redirect_url &&
+                        strncmp(env_server_software, "Apache", sizeof("Apache")-1) == 0) {
+                        /*
+                         * If we have an env_redirect_url and the web server is Apache
+                         * it's very likely that env_redirect_url is the one we really
+                         * want
+                         */
+                        env_script_name = _sapi_cgibin_putenv("SCRIPT_NAME", env_redirect_url TSRMLS_CC);
+                }
+
        if (env_server_software &&
            env_script_name &&
            env_path_info &&
@@ -1159,7 +1170,7 @@
        if (CGIG(fix_pathinfo)) {
            struct stat st;
            char *real_path = NULL;
-           char *env_redirect_url = sapi_cgibin_getenv("REDIRECT_URL", sizeof("REDIRECT_URL") - 1 TSRMLS_CC);
+           // char *env_redirect_url = sapi_cgibin_getenv("REDIRECT_URL", sizeof("REDIRECT_URL") - 1 TSRMLS_CC);
            char *env_document_root = sapi_cgibin_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT") - 1 TSRMLS_CC);
            char *orig_path_translated = env_path_translated;
            char *orig_path_info = env_path_info;