« Archives in March, 2012

Neuer Dockstar Kernel für Debian (3.0.26)

Heute wurde ein neuer longterm Kernel freigegeben, es handelt sich um 3.0.26. Ihr findet ihn wie immer unter “Dockstar Kernel“. Dort gibt es die Installationsanleitung, Downloadlinks und md5sums usw.

Kleine Änderung beim Update von 2.6.32.57 auf 3.0.23: Die organgene LED heißt jetzt “dockstar:orange:misc” und nicht mehr “dockstar:orange:health”. Also bitte eure Skripte anpassen, falls ihr die orangene LED irgendwo nutzt. (/etc/rc.local zum Beispiel). Die Grüne LED heißt genau gleich wie vorher! Falls ihr bereits auf >3.0.23 seit, ist das für euch nicht mehr relevant. Alle anderen lesen bitte die Anmerkungen im letzten Kernel Post oder auf der Dockstar Kernel Seite.

Wie immer: Falls eure Dockstar brennt, kaputt geht, in die Luft fliegt oder sonstiges, übernehme ich keine Verantwortung dafür.

Danke an Jeff für seine Konfig und seine fantastische Arbeit mit der Dockstar. Besucht sein Forum, es ist die beste Anlaufstelle für Dockstarnutzer.

Neuer Dockstar Kernel für Debian (3.0.25)

Heute wurde ein neuer longterm Kernel freigegeben, es handelt sich um 3.0.25. Ihr findet ihn wie immer unter “Dockstar Kernel“. Dort gibt es die Installationsanleitung, Downloadlinks und md5sums usw.

Kleine Änderung beim Update von 2.6.32.57 auf 3.0.23: Die organgene LED heißt jetzt “dockstar:orange:misc” und nicht mehr “dockstar:orange:health”. Also bitte eure Skripte anpassen, falls ihr die orangene LED irgendwo nutzt. (/etc/rc.local zum Beispiel). Die Grüne LED heißt genau gleich wie vorher! Falls ihr bereits auf >3.0.23 seit, ist das für euch nicht mehr relevant. Alle anderen lesen bitte die Anmerkungen im letzten Kernel Post oder auf der Dockstar Kernel Seite.

Wie immer: Falls eure Dockstar brennt, kaputt geht, in die Luft fliegt oder sonstiges, übernehme ich keine Verantwortung dafür.

Danke an Jeff für seine Konfig und seine fantastische Arbeit mit der Dockstar. Besucht sein Forum, es ist die beste Anlaufstelle für Dockstarnutzer.

Schneller Reconnect der FRITZ!Box in Python

Python Logo

Wer hätte nicht gerne eine Möglichkeit mal eben schnell die FRITZ!Box per Shellskript zu einem Reconnect zu überreden? Ganz am Anfang (Jahr 2000 oder so?) gab es ja nur so eine “dubiose” Binary für Windows, welche per UPNP ulra schnell die FRITZ!Box reconnecten konnte.(2 Sekunden ca.)

Heute machen wir das ein bisschen schöner(nicht nur für Linux!) in Python (Version 2.x):

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2011  Geekparadise.de
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: http://geekparadise.de/contact/
# Usage: ./reconnect.py
# Version: 1.0
# Only for Python 2.x!

import re
import pycurl
import StringIO
import sys

def post_data(data):
        encoded_data = ["Content-Type: text/xml", \
        "charset: utf-8", "SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#"+data]
        encoded_data2=("""<?xml version="1.0" encoding="utf-8"?>
        <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
        <u:"""+data+"""s xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
        </s:Body>
        </s:Envelope>""")
        try:
                b = StringIO.StringIO()
                curl = pycurl.Curl()
                curl.setopt(pycurl.POSTFIELDS, encoded_data2)
                curl.setopt(pycurl.HTTPHEADER,encoded_data)
                curl.setopt(pycurl.TIMEOUT,10)
                curl.setopt(pycurl.CONNECTTIMEOUT,10)
                curl.setopt(pycurl.URL, "http://fritz.box:49000/upnp/control/WANIPConn1")
                curl.setopt(pycurl.WRITEFUNCTION, b.write)
                curl.perform()
                return b.getvalue()
        except:
                print "Error: connection problems."
                exit(-1)

# Query actual IP and show it
ip = re.split(r"<NewExternalIPAddress>",post_data("GetExternalIPAddress"))
if len(ip) > 1:
        ip = re.split(r"</NewExternalIPAddress>",ip[1])
else:
        print "Error: IP query failed."
        exit(-1)
print "Actual IP: "+ip[0]

# start reconnect
sys.stdout.write("Reconnect...")
sys.stdout.flush()
post_data("ForceTermination")
print "done."

# Query actual IP
ip2 = re.split(r"<NewExternalIPAddress>",post_data("GetExternalIPAddress"))
if len(ip2) > 1:
        ip2 = re.split(r"</NewExternalIPAddress>",ip2[1])
else:
        print "Error: IP query failed."
        exit(-1)

# Check if IP has changed: True -> show new IP; False -> show error.
if ip[0] != ip2[0]:
        print "New IP: "+ip2[0]
        exit(0)
else:
        print "Error: IP did not change."
        exit(-1)

Für Distributionen mit Python 3 als Standard sollte man die erste Zeile in

#!/usr/bin/python2

ändern.

Das ganze in reconnect.py (oder wie ihr es nennen wollt..) packen und mit chmod +x reconnect.py ausführbar machen.

Weiterhin muss der UPNP Kram in der Fritz!Box aktiviert sein.(Bei mir ist das irgendwo bei “Netzwerkeinstellungen” und dort muss ” Statusinformationen über UPnP übertragen (empfohlen)” und “Änderungen der Sicherheitseinstellungen über UPnP gestatten” aktiviert sein.)

Übrigens: Der reconnect selbst geht extrem schnell (~1-2 Sekunden) nur die Abfrage der neuen IP braucht einige Sekunden, in der Weboberfläche ist sie viel schneller sichtbar.

Getestet hab ich das auf einer FRITZ!Box SL Wlan, ob das bei neueren Modellen auch noch geht, weiß ich nicht.

Die Idee stammt übrigens nicht von mir, ursprl. kommt sie glaube ich aus einem Reconnect Binary für Windows,
blog.Jbbr.net hat dann eine Curlvariante für Linux dazu geschrieben. Details zur Fritz!Box UPNP Geschichte hab ich dann bei OpenShots gefunden. Danke dafür!

Falls ihr sagt “Wow, WTF ist eine FRITZ!Box?”, FRITZ!Box ist ein DSL-Router der Firma AVM. Falls ihr auch einen schnellen Reconnect wollt: Kauft euch eine FRITZ!Box, AVM freut sich ;)

Update(18.03.2012):
Aufgrund einer Nachfrage hier noch die “verbesserte” Version, ich weiß gar nicht mehr genau was ich geändert habe, jedenfalls versucht diese Version 3 Mal die IP zu wechseln. Zusätzlich habe ich ein paar Kleinigkeiten geändert, weil es bei der älteren manchmal etwas Probleme gab .. wie auch immer, jedenfalls klappt diese Version ganz gut, ich nutze sie schon länger…
Noch eine Änderung gab es: Es wird nun checkip.dyndns.org genutzt um die eigene IP abzufragen, weil das bisherige da eher unzuverlässig war.

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2012  Geekparadise.de
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact: http://geekparadise.de/contact/
# Usage: ./reconnect.py
# Version: 1.1
# Only for Python 2.x!

import re
import pycurl  
import StringIO 
import sys
import time

def getIP():
        b = StringIO.StringIO()
        curl = pycurl.Curl()
        curl.setopt(pycurl.TIMEOUT,10)
        curl.setopt(pycurl.CONNECTTIMEOUT,10)
        curl.setopt(pycurl.URL, "http://checkip.dyndns.org")
        curl.setopt(pycurl.WRITEFUNCTION, b.write)
        curl.perform()
        ip = re.search(r'\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b',b.getvalue())
        if ip:
                return ip.group(0)
        else:
                return false	


def post_data(data):
        encoded_data = ["Content-Type: text/xml", \
        "charset: utf-8", "SoapAction: urn:schemas-upnp-org:service:WANIPConnection:1#"+data]
        encoded_data2=("""<?xml version="1.0" encoding="utf-8"?>
        <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
        xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
        <u:"""+data+"""s xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" />
        </s:Body>
        </s:Envelope>""")
        try:
                b = StringIO.StringIO()
                curl = pycurl.Curl()
                curl.setopt(pycurl.POSTFIELDS, encoded_data2)
                curl.setopt(pycurl.HTTPHEADER,encoded_data)
                curl.setopt(pycurl.TIMEOUT,10)
                curl.setopt(pycurl.CONNECTTIMEOUT,10)
                curl.setopt(pycurl.URL, "http://fritz.box:49000/upnp/control/WANIPConn1")
                curl.setopt(pycurl.WRITEFUNCTION, b.write)
                curl.perform()
                return b.getvalue()
        except:
                print "Error: connection problems."
                exit(-1)
                
def reconnect():
        # Query actual IP and show it
        ip = re.split(r"<NewExternalIPAddress>",post_data("GetExternalIPAddress"))
        if len(ip) > 1:
                ip = re.split(r"</NewExternalIPAddress>",ip[1])
        else:
                print "Error: IP query failed."
                exit(-1)
        print "Actual IP: "+ip[0]
        # Start reconnect
        sys.stdout.write("Reconnect...")
        sys.stdout.flush()
        post_data("ForceTermination")
        print "done."
        # Query actual IP
        ip2 = getIP()
        if ip2 == False:
                print "Error: IP query failed."
                exit(-1)
        if ip[0] != ip2:
                print "New IP: "+ip2
                return True
        else:
                return False
        
counter = 0
bool = reconnect()
while not bool and counter < 3:
        print "Error: IP did not change."
        time.sleep(2)
        print "Trying again...."
        bool = reconnect()
        counter = counter + 1 

if counter >= 3:
        print "Error: 3 failed attempts...abborting."
        exit(-1)        
exit(0)

Neuer Dockstar Kernel für Debian (3.0.24)

Heute wurde ein neuer longterm Kernel freigegeben, es handelt sich um 3.0.24. Ihr findet ihn wie immer unter “Dockstar Kernel“. Dort gibt es die Installationsanleitung, Downloadlinks und md5sums usw.

Kleine Änderung beim Update von 2.6.32.57 auf 3.0.23: Die organgene LED heißt jetzt “dockstar:orange:misc” und nicht mehr “dockstar:orange:health”. Also bitte eure Skripte anpassen, falls ihr die orangene LED irgendwo nutzt. (/etc/rc.local zum Beispiel). Die Grüne LED heißt genau gleich wie vorher! Falls ihr bereits auf 3.0.23 seit, ist das für euch nicht mehr relevant. Alle anderen lesen bitte die Anmerkungen im letzten Kernel Post oder auf der Dockstar Kernel Seite.

Wie immer: Falls eure Dockstar brennt, kaputt geht, in die Luft fliegt oder sonstiges, übernehme ich keine Verantwortung dafür.

Danke an Jeff für seine Konfig und seine fantastische Arbeit mit der Dockstar. Besucht sein Forum, es ist die beste Anlaufstelle für Dockstarnutzer.

Archlinux: dm-crypt && trim/discard && dropbear_initrd_encrypt don’t work together!

Today I accidentially found out that trim/discard does not work with a dm-crypt device when you use dropbear_initrd_encrypt (version 0.8-16).
You won’t notice that it is not working when you use the online discard with the discard option in /etc/fstab because there is not error thrown, but when you use fstrim you get this error: FITRIM ioctl failed: Operation not supported.

I tried some things and tracked this down to the encryptssh hook from dropbear_initrd_encrypt which seem to use some older version of /lib/initcpio/hooks/encrypt. You also may notice that you don’t get the “Enabling TRIM/discard support.” at boot while using encryptssh instead of encrypt. Encryptssh is missing the whole Trim stuff :/

Edit: I patched the missing parts from /lib/initcpio/hooks/encrypt to /lib/initcpio/hooks/encryptssh and updated everything else to the newest encrypt hook (trim).
Here is my patch for /lib/initcpio/hooks/encryptssh (encryptssh_hook).
Here is my patch for /lib/initcpio/install/dropbear (dropbear_install).
Or if you can download the new encryptssh hook here and the new dropbear install hook here.

But: It does not work over ssh anymore. Don’t know why, it seems to hang in a loop after mounting successful.

Try on your own risk! This is still not working!

Edit #2: I got it running with trim now, not the most beautiful solution, but working…basically I added --allow-discards to every important command.
Changes to /lib/initcpio/install/dropbear (changed line is marked):

[...]
#!/bin/sh
if [ -c "/dev/mapper/control" ]; then
  if eval /sbin/cryptsetup luksOpen \`cat /.cryptdev\` \`cat /.cryptname\` --allow-discards ; then
    echo > /.done
[...]

Changes to /lib/initcpio/hooks/encryptssh (changed lines are marked):

[...]
if [ -f ${ckeyfile} ]; then
   if eval /sbin/cryptsetup --key-file ${ckeyfile} luksOpen ${cryptdev} ${cryptname} --allow-discards ${CSQUIET}; then
      dopassphrase=0
   else
[...]
[...]
#loop until we get a real password
while ! eval /sbin/cryptsetup luksOpen ${cryptdev} ${cryptname} --allow-discards ${CSQUIET}; do
   if [ -f /.done ]; then
     break
   fi
[...]
[...]
exe="/sbin/cryptsetup create ${cryptname} ${cryptdev} --allow-discards"
tmp=$(echo "${crypto}" | cut -d: -f1)
[...]

For me, this seems to be some working solution until the script is updated to the latest encrypt hook. :)

Neuer Dockstar Kernel für Debian (3.0.23)

Wie angekündigt, hier der Wechsel von 2.6.32.x auf 3.0.x. Nachdem der Support von 2.6.32.x nur noch “extended longterm support” ist, d.h. nur sehr unregelmäßige Updates, war der Schritt zu 3.0.x absolut sinnvoll. Greg Kroah-Hartman empfiehlt das sogar, nachdem er mit 2.6.32.58 den alten longterm Kernel abgegeben hat.

Auch hier auf dem Blog gibts dazu eine kleine Änderung: Der aktuelle longterm Dockstar Kernel ist nun immer unter “Dockstar Kernel” zu finden, d.h. es gibt nun eine zentrale Stelle dafür auf geekparadise.de. Weiterhin heißt der Kernel nun nicht mehr “eigenbau” sondern “geekparadise.de”, aber das ist eigentlich eine unwichtige Änderung.

Da ihr dort auch die Installationsanleitung, Downloadlinks und md5sums findet, postet ich sie nicht mehr in den einzelnen Posts, es wird aber weiterhin kleine Statusposts geben, sobald neue Kernelversionen erscheinen. Erspart mir viel arbeit, dann muss ich nicht immer 5 Stellen editieren bei einem Update ;)

Daher: Klick zur neusten Version meines Dockstar Kernels.

Kleine Änderung beim Update von 2.6.32.57 auf 3.0.23: Die organgene LED heißt jetzt “dockstar:orange:misc” und nicht mehr “dockstar:orange:health”. Also bitte eure Skripte anpassen, falls ihr die orangene LED irgendwo nutzt. (/etc/rc.local zum Beispiel). Die Grüne LED heißt genau gleich wie vorher!

Wie immer: Falls eure Dockstar brennt, kaputt geht, in die Luft fliegt oder sonstiges, übernehme ich keine Verantwortung dafür.

Danke an Jeff für seine Konfig und seine fantastische Arbeit mit der Dockstar. Besucht sein Forum, es ist die beste Anlaufstelle für Dockstarnutzer.