Montag, 28. Dezember 2009

wxPython-Versionen auswählen

Wenn mehrere wxPython-Versionen gleichzeitig auf einem System installiert sind, so lädt ein einfaches

import wx

natürlich immer die Version, mit der man gerade nicht arbeiten will.

import wxversion
wxversion.select('2.8')
import wx

Die Version des gerade geladenen Moduls erhält man mit:

print wx.__version__

Freitag, 25. Dezember 2009

Changing USB device permissions in Ubuntu Karmic

If you plug an USB device into a Linux box that uses a current distro, udev dynamically creates an entry in the /dev directory. You can list all currently available USB units with the lsusb command:

$ lsusb
Bus 002 Device 003: ID 03eb:6125 Atmel Corp. 
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

The only "real" device here is my XAiOX GPS logger (first entry). The output shows that it has the vendor id (hex) 03eb, the product id (hex) 6125.

The device file created by udev is: /dev/bus/usb/002/003
(Yes, these are the bus and device numbers shown in the lsusb output).

The default permissions are rather restrictive:

$ ls -l /dev/bus/usb/002
insgesamt 0
crw-rw-r-- 1 root root 189, 128 2009-12-23 22:14 001
crw-rw-r-- 1 root root 189, 128 2009-12-23 22:19 003

Only root can read and write to the USB device. Anybody else only has read access.

In order to retrieve the stored GPS info from my GPS logger (e.g. by using itrackutil), I have to instruct the device to send the data. In order to send this command I need the write privileges.

I could start itrackutil as root, but from a security standpoint that is not what I want.

This problem usually arises only, if the USB device is not (yet) managed by the system, because part of that managing process is... changing the permissions.

The solution I'm suggesting here works with Ubuntu Karmic.

The first step is to create a group named usbusers (or any other name), then make yourself member of that group and instruct udev to set the device group id to usbusers and set the permissions accordingly.

On the command line, creating a group and adding the user (e.g. mike) is quite simple:

sudo groupadd usbusers
sudo adduser mike usbusers

If you pefer the Gnome GUI, you find the appropriate program under "System - Administration - User and groups":


After unlocking the panel ("Click to make changes"), click onto "Manage Groups".



"Add Group".



Make enter "usbusers" as group name, make sure that the group id suggested by the system is not zero. It's usually in the 1000+ range, enable the "Group Members" and click "Ok".

As a last step you have to create a new udev rule:

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="usbusers"

Save it under the following name: /etc/udev/rules.d/45-xaiox.rules

Then reboot.

Two remarks regarding the filename:
  • in order to be executed, the filename must end with .rules (all other files are ignored)
  • the 45 ensures that the file is executed before the corresponding "old" rule found in /lib/udev/rules.d/50-udev-default.rules
If you now plug-in your usb device, the permissions look like this:

$ ls -l /dev/bus/usb/002/total 0crw-rw-r-- 1 root usbusers 189, 128 2009-12-25 20:20 001crw-rw-r-- 1 root usbusers 189, 133 2009-12-25 22:22 006

And being a member of usbusers, you have read and write access.

Donnerstag, 10. Dezember 2009

Blender 2.5 alpha, slow screen update


Now that I got Blender 2.5 alpha 0 running on my old laptop, I noticed that when rotating what must be the most deleted cube in the 3D world, the refresh rate was very slow. An update rate of 2 or 3 times per second makes the program unusable.

Granted, the laptop is not very fast, but in the old version of Blender (2.49a) the cube followed the mouse movement without any visible delay.

Having seen Blender using OpenGL without hardware acceleration before, I tried pressing one of the OpenGL buttons down in the "header" of the 3D window:




This produced the error: "Failed to create OpenGL offscreen buffer".


Something was wrong with the use of OpenGL.

User teeth in the developer IRC channel #blendercoders on freenet.org, suggested to change the user preferences from "Triple Buffer" to "Overlap".


You can display these settings using "File - User Preferences" or Ctrl-Alt-U. Then select "System" and look for the "Window draw method".

Don't forget to "Save as default".

It worked here. If you have the same problem, it's worth a try.

Dienstag, 1. Dezember 2009

Bisecting mesa - bug 446632


Bug 446632 is responsible for the segfaulting blender on start-up on machines with ATI graphics cards running Ubuntu Karmic.

Analysis showed that the segfault originated in the mesa library. The code of the mesa contains the OpenGL implementation under Linux, and is used by Blender and various other programs.

During the pre-release process of Karmic, various builds of the mesa package have been made and are still available online. Tests showed that the last build without the bug was 7.6.0~git20090817.7c422387-0ubuntu8. The next one was 7.6.0-1ubuntu1.

To determine which patch between those two releases is responsible for the bug, a process called git-bisecting is used. For this, you give git the id of a version with and without the bug. Git chooses a version in the middle. You check it out, compile it and test it. After that you tell git if this version was good or bad. After that git chooses another version halfway between the last good and the first bad one. This process is repeated until you find the bad commit.

Sounds simple enough.... but it raises the following questions:
  • What Git repository does Ubuntu use for the mesa package?
  • Which commits correspond to the above mentioned builds?
  • And once you have the source, how do you compile, package and use it?
Within the Ubuntu project there is no git repository that describes the way from 7.6.0~git20090817.7c422387-0ubuntu8 to 7.6.0-1ubuntu1. Therefore we use the upstream git repository at git://anongit.freedesktop.org/mesa/mesa (browseable: http://cgit.freedesktop.org/mesa/mesa) on which the Ubuntu version is based.

7c422387 is the commit id within the freedesktop repository (well, not quite. The real commit ID is 7c4223876b4f8a78335687c7fcd7448b5a83ad10, but the first few digits are usually sufficient to find it).

The last commit of the 7.6.0 branch in this repository has the label mesa_7_6

The way to compile the source is described later in this post. As you will see, packaging is not necessary. The compiled drivers can be used directly.

"Git"ting started

You need git-core - and also download gitk (which is not really necessary, but makes a nice graphical representation).

sudo apt-get install git-core gitk
choose a directory and download the entire repository (in this tutorial I use my home directory).

cd ~
git clone git://anongit.freedesktop.org/mesa/mesa

This will create the subdirectory mesa, and a subdirectory .git, that contains the content of the cloned repository.

Be patient. After counting the elements to be transferred it takes some time before the actual download begins. All in all around 100 MB.

The code that we are going to compile needs some additional source files:

sudo apt-get build-dep mesa
sudo apt-get install libx11-dev libxt-dev libxmu-dev libxi-dev


Further preparations

make clean
./autogen.sh
./configure --prefix=/usr --mandir=\${prefix}/share/man \
--infodir=\${prefix}/share/info --sysconfdir=/etc \
--localstatedir=/var --build=i486-linux-gnu --disable-gallium --with-driver=dri \
--with-dri-drivers="r200 r300 radeon" --with-demos=xdemos --libdir=/usr/lib/glx \
--with-dri-driverdir=/usr/lib/dri --enable-glx-tls --enable-driglx-direct --disable-egl \
--disable-glu --disable-glut --disable-glw CFLAGS="-Wall -g -O2"
make clean removes the "debris" from previous compilations. But we haven't created any yet... Do it anyway - it's good practice :-)

./autogen.sh verifies that all prerequisites are met. If anything is missing, it will complain.

./configure sets up what is compiled, where and how.

During the tests remove -O2 (under CFLAGS). This disables compiler optimisations. The resulting code is a bit larger and a little bit slower, but it is easier to use during debugging.

--with-dri-drivers="..." determines which drivers are compiled. As the original bug only affects ATI machines, we only need the drivers we use. That saves a lot of compile time. If yours is not among them, check out ~/mesa/src/mesa/drivers/dri/ and add it.

You can find out which driver you are using with:
xdriinfo driver 0

Verify the good build

We know that build 7c4223876b4f8a78335687c7fcd7448b5a83ad10 still works with Blender. So let's check it out, compile it and test it. If Blender does not crash, we know that the process so far is working correctly.

git checkout 7c422387
make

We could enter the entire ID, but the first few digits are usually sufficient.

make should finish without errors. Now we start Blender using:

LD_LIBRARY_PATH="~/mesa/glx" LIBGL_DRIVERS_PATH="~/mesa/src/mesa/drivers/dri/radeon" Blender

LD_LIBRARY_PATH and LIBGL_DRIVERS_PATH make Blender (and only Blender, or any other program you specify) use the just compiled libraries. No need to reboot or to restart X. No effects to the remaining programs.

Please note, that you may need to replace the radeon part of the driver path with r200 or r300 depending on the driver you use.

Blender should run correctly.

Bisecting

We now officially start the bisecting process:
git bisect start
... and tell git that this was a "good" build.
git bisect good


Checking out the bad build

As we can not pinpoint which git version corresponds to first bad Ubuntu build (7.6.0-1ubuntu1) we simply start at the newest commit in the mesa_7_6 branch:
git checkout mesa_7_6

This replaces the files in the mesa directories and its subdirectories (except .git) with the new ones.

We compile it:
make
and test it:
LD_LIBRARY_PATH="~/mesa/glx" LIBGL_DRIVERS_PATH="~/mesa/src/mesa/drivers/dri/radeon" Blender

This time Blender should crash. We notify git:
git bisect bad

With this command, git chooses a commit approx. in the middle:
Bisecting: 482 revisions left to test after this (roughly 9 steps)
[ee066eaf6d0dd3c771dc3e37390f3665e747af2a] llvmpipe: Allow to dump the disassembly byte code.

The make, test, bisect process is repeated until git displays the first bad commit.

bfbad4fbb7420d3b5e8761c08d197574bfcd44b2 is first bad commit
commit bfbad4fbb7420d3b5e8761c08d197574bfcd44b2
Author: Pauli Nieminen
Date: Fri Aug 28 04:58:50 2009 +0300
r100/r200: Share PolygonStripple code.
:040000 040000 1b1f09ef26e217307a5768bb9806072dc50f2a14 eb20bf89c37b2f59ce2c243b361587918d3c9021 M src

As an interesting side note, the driver from this commit does crash Blender, but not with a segfault. There is even an output on the console: "drmRadeonCmdBuffer: -22".

The next commit in this branch 4322181e6a07ecb8891c2d1ada74fd48c996a8fc makes Blender crash the way we have come to know.

The previous commit (e541845959761e9f47d14ade6b58a32db04ef7e4) would be a good candidate to keep Blender running until mesa is fixed:

git checkout e541845959761e9f47d14ade6b58a32db04ef7e4
make
LD_LIBRARY_PATH="~/mesa/glx" LIBGL_DRIVERS_PATH="~/mesa/src/mesa/drivers/dri/radeon" Blender

Ackowledgements
Tormod Volden for creating and updating https://wiki.ubuntu.com/X/BisectingMesa and various other info.

References
https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/446632
http://bugs.freedesktop.org/show_bug.cgi?id=25354
https://wiki.ubuntu.com/X/Bisecting
https://wiki.ubuntu.com/X/BisectingMesa
https://launchpad.net/~xorg-edgers/+archive/ppa
http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
http://cgit.freedesktop.org/mesa/mesa

Montag, 30. November 2009

Update zum "Blender"-Bug

Bei den Abstürzen von Blender unter Ubuntu Karmic scheint es sich nicht um einen Fehler in Blender zu handeln, sondern um einen Bug im Paket mesa, das für die OpenGL-Implementierung unter Linux zuständig ist.

Der Bug-Report ist unterdessen upstream gemeldet.

Freitag, 27. November 2009

Blender-Absturz in Karmic

Blender 2.5 Alpha 0 ist gerade erschienen, und dass dies nicht auf Anhieb funktioniert erwartet man fast.

Dass allerdings die ältere Version von Blender (2.49a) aus den Ubuntu-Repositories nicht funktioniert, ist dann schon ärgerlicher, zumal sich wahrscheinlich das nächste halbe Jahr nichts daran ändern wird.

Blender stürzt nach dem Aufruf mit einem Segfault ab.

Probleme scheinen mal wieder nur die ATI-Karten zu haben.

Bug-Report in Ubuntu's Launchpad

Mittwoch, 18. November 2009

itrackutil 0.1 veröffentlicht


Seit einigen Wochen bin ich Besitzer eines XAiOX iTrackU GPS Loggers.

Das Gerät verwendet den SirfIII Chipsatz, besitzt Bluetooth und kann bis zu 250.000 Wegpunkte speichern, das sind, wenn man einen Punkt pro Sekunde aufzeichnet, fast drei Tage.

So lange hält der eingebaute Akku zwar nicht, aber die - laut Prospekt - immerhin 17 Stunden sind reichlich bemessen.

Außerdem hat er eine Sprachansage, zur Quittierung verschiedener Betriebszustände (Bluetooth ein/aus, Satellitensuche, Fix).

Die Sprachansage ist wohl eher dem (bis auf die Firmware) baugleichen Gerät mit dem Namen TrapScout zu verdanken, das als "Speed Camera Detector" per USB eine Datenbank mit Koordinaten programmiert bekommt und dann an den "Points of Interest" die Ansage "Sie fahren zu schnell." ausgibt.

Für OSM-Tracker ist natürlich die erste Variante interessanter.

Und zunächst sah es so aus, als hätte ich nach längerer Zeit ein Gerät gefunden, für das es unter Linux keine Software gab. Aber auch hier war mir jemand zuvorgekommen. Harmut Schimmel hatte bereits vor einiger Zeit ein paar Perl-Skripte geschrieben, mit denen das Gerät von der Kommandozeile aus programmiert und ausgelesen werden konnte und diese auf seiner Site veröffentlicht.

Ein paar offene Fragen gab es dann aber doch noch. Die Ergebnisse von USB Sniffer und ein wenig Knobelei habe ich dokumentiert und sie sind in meine Utility itrackutil, das auf SourceForge in der Version 0.1 veröffentlicht worden ist, eingeflossen.

Viele Stellen in den vom Logger gesendeten Daten sind noch unklar, und können nur durch Vergleich mit anderen XAiOX iTrackU mit SirfIII Chipsatz vielleicht weiter entschlüsselt werden.

Außerdem berichtet Hartmut, dass weitere Geräte "kompatibel" sind. Tester mit diesen Geräten suche ich auch:
  • XAiOX iTrackU mit Nemerix Chipsatz
  • Gisteq PhotoTrackr
  • Gisteq PhotoTrackr Lite (DPL700)
Das Programm läuft zurzeit unter Linux (Ubuntu Karmic), stellt aber von den weiteren Abhängigkeiten keine allzu großen Hürden auf.

Und obwohl diese Pakete auch unter Windows verfügbar sind, haben erste Versuche gezeigt, dass die zur USB-Kommunikation eingesetzte Bibliothek libusb dann doch nicht 100%ig ihrem Linux-Pendant entspricht.

Mittwoch, 21. Oktober 2009

USB Sniffing unter Linux

USB Sniffing – also das „Belauschen“ der USB-Kommunikation zwischen Computer und Endgerät – wird gerne eingesetzt, wenn für ein Gerät zwar ein Windows-Treiber aber kein Linux-Treiber vorhanden ist. Man versucht dabei herauszubekommen, welche Aktionen in der Windows-Anwendung welche USB-Kommunikation nach sich zieht, um dies dann in einer Linux-Anwendung nachzubilden.

Hierzu wird normalerweise ein Treiber im Windows-System installiert, der die Daten abfängt und protokolliert, bevor Sie an die USB-Schnittstelle weitergeleitet werden.

Auch unter Linux gibt es eine derartige Einrichtung. Sie nennt sich:

usbmon

Das Aktivieren ist unter Ubuntu Jaunty denkbar einfach:

sudo mount -t debugfs none_debugs /sys/kernel/debug

Unter Hardy ist usbmon noch ein separates Kernelmodul, das zusätzlich mit

sudo modprobe usbmon

eingebunden werden muss.

Danach erscheinen unter /sys/kernel/debug/usbmon diverse Dateien. Zum Beispiel:

$ls /sys/kernel/debug/usbmon

 0s 0t 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u

Die Zahl im Namen bezeichnet die Nummer des USB-Busses (hier 1, 2 und 3). Der virtuelle „Bus 0“ liefert die Events aller Busse. Der Buchstabe hinter der Zahl (s, t, u) beschreibt, was ausgegeben werden soll:

u – der mitgeschnittene Datenverkehr
s – Statusmeldungen
t – eine Teilmenge von „u“ (dieser Eintrag wird in absehbarer Zeit nicht mehr unterstützt).

Was bleibt, ist diese Datei auszugeben und/oder in eine Datei umzuleiten, z.B.:

cat /sys/kernel/debug/usbmon/0u > usbmon.txt

Wireshark

Ganz ohne dieses Modul kommt Wireshark aus. Mit „Capture – Interfaces“ kann auch ein USB-Bus ausgewählt werden. Hierzu sind natürlich root-Rechte notwendig.

Wireshark stellt die USB-Kommunikation in ähnlicher Weise wie sonst den Netzwerkverkehr dar. Außerdem werden die diversen Konstanten und Strukturen, wie bei Wireshark üblich, schon dekodiert und mit Klartext ausgegeben.

Was bringt's?

Virtuelle Maschinen (z.B. VirtualBox, Vmware) haben unterdessen die Möglichkeit, USB-Geräte im virtualisierten System laufen zu lassen, die über das Gast-System auf die USB-Schnittstelle zugreifen.

Kombiniert man diese beiden Möglichkeiten, so lassen sich z.B. Geräte in einer virtualisierten Windows-Umgebung betreiben, und „von außen“ belauschen.

Dienstag, 22. September 2009

Licht im Tunnel

Um die meist textbasierten Internet-Protokolle von Hand auszuprobieren verwendet man häufig Telnet. So kann man sich mit


telnet www.google.de 80

mit einem Web-Server verbinden und eine Seite mit

GET / HTTP/1.0

abrufen.

In ähnlicher Weise kann man andere Protokolle ausprobieren.Wenn Sie also immer schon wissen wollen, was der Befehl UIDL bei POP3-Servern bewirkt, telnet bringt Sie Ihrem POP3-Server näher.

Wenn die Verbindung mit SSL verschlüsselt ist, hilft telnet nicht mehr weiter.

In einem Artikel bei Heise wird der Einsatz von openssl beschrieben. Die Unterfunktion s_client stellt das SSL-Pendant zum guten alten telnet dar.

openssl s_client -connect www.heise.de:443

Nachdem die SSL-Verbindung aufgebaut ist, werden diverse Informationen angezeigt (chain of trust, Serverzertifikat, verwendete Verschlüsselungsalgorithmen usw.).

Danach kann man sich - wie bei Telnet - mit dem Server unterhalten.



Montag, 14. September 2009

Der lange Marsch nach Huawei


Das UMTS-Modem

Zurzeit gibt es bei Aldi-Süd den „Internet-USB-Stick S4011“ für knapp 60 €.

Die von lsusb ausgegebene USB-ID sowie die „Selbstauskunft“ des Sticks zeigen aber, dass es sich um ein Huawei E160 handelt, wie sie im Augenblick zu Tausenden in Startersets von diversen Mobilfunkanbietern unter die Leute gebracht werden.

Unter der Glasabdeckung des Lebensmitteldiscounters war jedoch die Rückseite nicht zu erkennen, die auf das hauseigene Starterset hinweist. Ganz unten findet sich dann aber dann der Hinweis, dass dieses Starterset nicht im Lieferumfang enthalten ist.

Und in der Tat hat dieser Stick, im Gegensatz zu vielen anderen (teilweise teureren) „Startersets“, keinen Sim-Lock und ist hier schon mit den SIM-Karten der unterschiedlichsten Mobilfunkanbieter gelaufen.

Eine kurze Recherche zeigte, dass der Stick vom (noch) aktuellen Ubuntu Jaunty unterstützt wird, und in der Tat läuft er mit dem Network-Manager ohne Probleme.

Der Datentarif

Ohne SIM-Karte läuft aber auch dieses Modem nicht. Da der Stick nur gelegentlich eingesetzt werden soll, fiel die Wahl - nach einiger Suche - auf die Prepaid-Karte von Fonic.

Auch dort gibt es ein Starterset – 69,95 € mit 5 Tagen freies Surfen. Der Stick, ein – wer hätte es gedacht – Huawai E160, hat jedoch, nach Auskunft der Hotline, einen Simlock.

Da ich ja nun bereits ein simlock-freies E160 habe war die Alternative die normale SIM-Karte von Fonic (mit 111 Freiminuten). Da die Freiminuten bzw. die „Frei-Tage“ als Guthaben auf das Prepaid-Konto gutgeschrieben werden besteht zwischen den Angeboten kein großer Unterschied.

Der normale Datentarif kostet zurzeit 0,24 €/MB und kann von der Hotline vom Volumentarif auf die Tagesflatrate zu 2,50 € umgestellt werden. Bei der Flatrate wird nach 1 GB am Tag die Geschwindigkeit gedrosselt.

UMTSmon

Wie bereits erwähnt läuft der Stick unter Network-Manager ohne Probleme. Bei meiner Recherche bin ich aber auf das Programm UMTSmon gestoßen.

UMTSmon gab es schon bevor die Funktion in den Network-Manager integriert wurde. Es hat ein paar nützlich Zusatzfunktionen, wie das Anzeigen der Empfangsfeldstärke, SMS-Versand und das Nachhalten der verbrauchten Zeit und des verbrauchten Datenvolumens.

UMTSmon ist leider nicht in den Ubuntu-Repositories verfügbar. Ein i386 Binary ist jedoch im Download-Bereich des Projekts zu finden.

usb_modeswitch

UMTSmon verlangt nach einem weiteren Progamm: usb_modeswitch. Das Programm ist auf der Seite des Autors erhältlich. Das Debian-Projekt hält es als .deb-Paket vor. Bei neueren Kernels ist usb_modeswitch eigentlich nicht mehr notwendig, da der Kernel diese Funktion übernimmt.

Die Huawai-Sticks melden sich nämlich zunächst als USB-Massenspeicher an. Dieser Massenspeicher enthält Software und Treiber, die unter Windows per Autorun gestartet und installiert werden. Diese Treiber schalten dann den Stick in den „Modem-Modus“ um. Unter Linux übernimmt diese Funktion usb_modeswitch, und seit einiger Zeit der Kernel. Diese Technik ist auch als ZeroCD bekannt.

… und die Problemchen

Beim ersten Aufruf prüft UMTSmon diverse Abhängigkeiten. Zunächst bemängelte es das fehlende SUID-Bit bei usb_modeswitch. usb_modeswitch braucht für seine Aufgabe Root-Rechte. Diese waren schnell nachgetragen mit:

sudo chmod u+s /usr/sbin/usb_modeswitch

Das nächste Problem bestand darin, dass sich das Modem in kein Netz einwählen konnte. Der Network Operator Wizard (Verbindung – Netzbetreiber auswählen) zeigte zwar diverse Netze an, nur ansprechen konnte ich sie nicht. Dieses Problem löste sich aber mit der Zeit von selbst. Man sollte bei neuen SIM-Karten warten bis sie freigeschaltet sind... :-)

Nach der Freischaltung fand das Modem auch das von Fonic verwendete O2-Netz.



Danach habe ich eine neues Profil für Fonic angelegt (Verbindung – Profile bearbeiten – Add Profile). Als APN (Zugangspunkt) habe ich die im Netz angegebene Adresse „pinternet.interkom.de“ verwendet (ohne Gewähr). Ansonsten habe ich die Standardeinstellungen belassen.

pppd

Der Versuch, sich mit dem Internet zu verbinden (2. Icon von links - „Connect to default profile“), scheiterte mit der Fehlermeldung:



und den vielsagenden Erklärungen:

  • << ppp did not provide any stdout information >> und
  • << ppp did not provide any stderr information >>

Leider brachte mich der gutgemeinte Hinweis auf die Kommandozeilen-Option -v4 nicht viel weiter. Sie bewirkt, dass UMTSmon Debug-Informationen ausgibt. Unter anderem sieht man die Kommunikation mit dem Modem.

Zum Einbinden des Internets ruft UMTSmon den pppd Daemon auf. Sehen wir uns die Datei pppd mal genauer an:

$ ls -l /usr/sbin/pppd
-rwsr-xr-- 1 root dip 277352 2009-02-20 18:25 /usr/sbin/pppd


Das Programm kann nur von root oder einem Mitglied der Gruppe dip gestartet werden – und das bin ich „normalerweise“ nicht. Der Grund, weshalb UMTSmon keine Informationen von ppp erhält ist, dass das pppd mangels fehlender Rechte nicht gestartet wurde.

Wo ist dip?

Natürlich könnte man UMTSmon einfach mit root-Rechten aufrufen, aber das gehört sich nicht. Die einfachste Variante zum Mitglied der Gruppe dip zu werden ist der Befehl:

sudo adduser user_name dip

Der Versuch dies über die GUI (System – Systemverwaltung – Benutzer und Gruppen) zu erledigen läuft zunächst ins Leere. Ruft man nach dem „Entsperren“ den Punkt „Gruppen verwalten“ auf, so sucht man dort die Gruppe dip vergebens. Diese Gruppe versteckt sich bei den Benutzerrechten.

Also: Benutzer anklicken – Eigenschaften – Benutzerrechte – „Internet-Verbindung mit Modem aufbauen“ ankreuzen.

Eigentlich logisch – aber das muss man wirklich erst einmal wissen. Die Option „Modems verwenden“ muss ebenfalls aktiv sein, was sie jedoch standardmäßig ist. Sie macht einem zum Mitglied der Gruppe dialout.

Dann muss man sich erst einmal ab- und wieder anmelden, bevor diese neue Einstellung aktiv ist. Ein Neustart ist jedoch nicht nötig.

Ein neuer Versuch

Der nächste Versuch, ins Internet zu kommen, scheiterte auch. Diesmal war die Fehlermeldung (stdout) etwas umfangreicher. Hier ein gekürzter Ausschnitt:

pppd options in effect:
debug debug debug # (from command line)
...
/dev/ttyUSB1 # (from command line)
460800 # (from command line)
lock # (from command line)
crtscts # (from command line)
...
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB1
...
LCP: timeout sending Config-Requests
Connection terminated.
Receive serial link is not 8-bit clean:
Problem: all had bit 7 set to 0
Modem hangup


Im Rahmen der Fehlersuche hatte ich mit dmesg das Boot-Protokoll abgefragt. Dort findet man u.a.:

[ 11.424602] USB Serial support registered for GSM modem (1-port)
[ 11.424737] option 2-2:1.0: GSM modem (1-port) converter detected
[ 11.425007] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB0
[ 11.425071] option 2-2:1.1: GSM modem (1-port) converter detected
[ 11.425322] usb 2-2: GSM modem (1-port) converter now attached to ttyUSB1
[ 11.425405] usbcore: registered new interface driver option
[ 11.425452] option: v0.7.2:USB Driver for GSM modems


Hier ist zu erkennen, dass der Kernel für das Modem zwei serielle Devices einrichtet: /dev/ttyUSB0 und /dev/ttyUSB1

Startet man umtsmon mit den Optionen -v4 und --force-autodetect kann man schön verfolgen, wie
  • zunächst das Modem als solches erkannt wird
  • die beiden seriellen Devices gefunden und
  • nacheinander getestet werden (ein Modem antwortet auf „AT“ mit „OK“)
  • und dann sowohl für die AT-Befehle als auch für die PPP-Verbindung /dev/ttyUSB1 ausgewählt wird.

Hier die interessanten Ausgaben:

##P3 t=372: Start iterating through all AutoDetectors

##P3 t=372: Let's continue with the next AutoDetector

##P3 t=372: AutoDetectBase::go() for 'USB ZeroCD Autodetection'
##P3 t=372: AutoDetect_USB::traverseTrees()
##P4 t=372: Checking USB device on 001:006
##P3 t=372: AutoDetect_USB::matchIDs(0x12d1, 0x1003)
##P3 t=372: This is a known ZeroCD Device: "Huawei E220 / E800"
##P3 t=372: AutoDetect_USB_ZeroCD::findPortNames()
##P3 t=372: AutoDetect_USB::findPortNames()
##P4 t=372: looking for ttyUSB ports
##P4 t=372: Found serial port number 1 with name 'ttyUSB0'
##P4 t=372: Found serial port number 2 with name 'ttyUSB1'
##P3 t=372: INFO: 'There are 2 ports available'

##P3 t=372: AutoDetect_USB::traverseTrees()
##P4 t=372: Checking USB device on 001:006
##P3 t=372: AutoDetect_USB::matchIDs(0x12d1, 0x1003)
##P2 t=372: GOOD: 'A 'Huawei E220 / E800' modem detected'
##P3 t=372: AutoDetect_USB::findPortNames()
##P4 t=372: looking for ttyUSB ports
##P4 t=372: Found serial port number 1 with name 'ttyUSB0'
##P4 t=372: Found serial port number 2 with name 'ttyUSB1'
##P3 t=372: INFO: 'There are 2 ports available'
...
##P3 t=372: Device: probing port '/dev/ttyUSB0' for AT commands
##P3 t=372: TempSerialPort::TempSerialPort()
##P3 t=372: Serial::openDev('/dev/ttyUSB0') as FD 7 - Serial instance 0xbfa4eec0
##P4 t=372: Query sends the following mesage: 'AT'
##P2 t=372: Device port '/dev/ttyUSB0': no response to "AT", return code 5
##P3 t=372: Device: probing port '/dev/ttyUSB0' failed
##P3 t=372: TempSerialPort::~TempSerialPort()
##P3 t=372: SerialPort::closeDev() for FD 7
##P3 t=372: Device: probing port '/dev/ttyUSB1' for AT commands
##P3 t=372: TempSerialPort::TempSerialPort()
##P3 t=372: Serial::openDev('/dev/ttyUSB1') as FD 7 - Serial instance 0xbfa4eec0
##P4 t=372: Query sends the following mesage: 'AT'
##P4 t=372: answer 1:'AT'
##P4 t=372: answer 2:'OK'
##P3 t=372: Got Query::OK from port
##P3 t=372: Device: probing port '/dev/ttyUSB1' successful

##P3 t=372: TempSerialPort::~TempSerialPort()
##P3 t=372: SerialPort::closeDev() for FD 7
##P3 t=372: set AT serial to '/dev/ttyUSB1'
##P3 t=372: set PPP serial to '/dev/ttyUSB1'
##P3 t=373: Serial::openDev('/dev/ttyUSB1') as FD 7 - Serial instance 0x9ff3b70
##P2 t=373: GOOD: 'Device created successfully'
##P1 t=373: Found hardware configuration stored to disk
##P3 t=373: TheDeviceManagerSingleton::writeToConfigFile()
##P3 t=373: Everything done - device created


Könnte es also sein, dass man für die PPP-Verbindung /dev/ttyUSB0 statt 1 verwenden sollte? Die entsprechende Option beim Aufruf lautet:

umtsmon -s/dev/ttyUSB1,/dev/ttyUSB0

Und siehe da... Internet!

Damit man dies nicht andauernd eingeben muss, kann man es auch in der Konfiguration von UMTSmon dauerhaft ändern (zu finden unter ~/.umtsmon/umtsmonrc):

[device]
ATPortName=/dev/ttyUSB1
PPPPortName=/dev/ttyUSB0


Happy surfing.

Mittwoch, 29. Juli 2009

Linux, Python und die MS-Access-Datenbank

Hier lag sie nun - ein Überbleibsel aus einer anderen Zeit und Welt. Eine Bilderdatenbank, die ich vor Jahren unter Windows mit dem bekannten Programm "Daumen Plus" erstellt hatte und deren Daten ich nun gerne nutzen wollte. Das Problem war das Format: MS-Access

Dieses Format ist unter Linux nicht gerade gängig, der Zugriff ist aber - wenn auch nicht "out of the box" - durchaus möglich.

Die hier beschriebenen Schritte beziehen sich auf eine Standardinstallation von Ubuntu Jaunty - sie dürften sich aber so oder ähnlich auch auf anderen Systemen nachvollziehen lassen.

Der Treiber

Der eigentliche Treiber findet man im Paket libmdbodbc. Wie der Name schon andeutet, läuft der Treiber im ODBC-Framework.

Die Schnittstelle ODBC

ODBC ist eine standardisierte Schnittstelle, in der auf der einen Seite Treiber wie Plugins die Verbindung zu den verschiedenen Datenbankentypen herstellen, und die auf der anderen Seite von Programmen - unabhängig vom Typ der Datenbank - immer in der gleichen Weise angesprochen werden können.

ODBC ist in Jaunty nicht standardmäßig installiert. Man braucht das Paket unixodbc. Zusätzlich sollte man noch unixodbc-dev holen, das wir weiter unten brauchen.

Zunächst muss man ODBC über das Vorhandensein des Treibers informieren. Die Treiber werden in Form sog. Templates eingerichtet. Hier das Template für MS Access.

[MDB]
Description = Microsoft Access ODBC Driver
Driver = /usr/lib/libmdbodbc.so.0
Setup =
FileUsage = 1
CPTimeout =
CPReuse =
UsageCount = 1

Es besagt, dass der Treiber libmdbodbc.so.0 nun im ODBC-Framework unter dem Namen frei gewählten Namen MDB angesprochen werden kann.

Speichern Sie dieses Template (z.B. unter derm Namen msaccess.template) und installieren Sie es mit dem folgenden Befehl:

odbcinst -i -d -f msaccess.template

Das Template wird in der Datei /etc/odbcinst.ini abgelegt. Diese Datei im INI-Format könnte man natürlich auch von Hand editieren.

Die Datenquelle

Eine Datenquelle fasst mehrere Parameter unter einem Namen (Data Source Name, DSN) zusammen. Diese Parameter könnten zwar auch beim Aufruf der Datenbank angegeben werden, aber der Parameterstring wird schnell sehr lang und seine Länge ist begrenzt.
Unter einem DSN werden in diesem Beispiel der verwendete Treiber, der Server und der Pfad zur Datenbank hinterlegt. Weitere Angaben sind je nach verwendetem Treiber möglich.

Das Verfahren ähnelt dem Einrichten des Treibers. Hier ein Beispiel:

[bilderdb]
Description = Bilder-Datenbank
Driver = MDB
Database = /home/mike/fotos.mdb
Servername = localhost
UserName =
Password =
Port = 5432

Abgespeichert in einer Textdatei mit dem Namen bilder.template, erfolgt die Installation entweder systemweit mit

odbcinst -i -s -l -f bilder.template

oder benutzerspezifisch mit

odbcinst -i -s -f bilder.template

Gespeichert wird diese Information in der INI-Datei /etc/odbc.ini (systemweit) bzw. ~/.odbc.ini (benutzerspezifisch).

Zugriff via Python

Zum Zugriff braucht man das Paket pyodbc. Das wiederum gibt es leider zurzeit nicht in einem Ubuntu-Paket. Man muss es - wie früher - aus dem Quellcode kompilieren. Hierzu braucht man zum einen den Sourcecode von pyodbc sowie die oben erwähnte Datei unixodbc-dev.

Wer das erste Mal selbst kompiliert, installiert noch build-essential, letzteres ist wieder bequem über apt-get oder Synaptic aus den Ubuntu-Archiven verfügbar.

Das pyodbc-Archiv muss entpackt werden. Danach begibt man sich in das beim Auspacken angelegte Verzeichnis und gibt

sudo python setup.py build install

ein. Das war es schon.

Kurze Zusammenfassung:

Aus den Ubuntu-Repositories braucht man:
build-essential, unixodbc-dev, unix-odbc und libmdbodbc.
Aus dem Web:
pyodbc

Und los geht's
import odbc

con = pyodbc.connect("DSN=bilderdb")
cursor = con.cursor()
cursor.execute("sinnvoller SQL-Befehl")
result = cursor.fetchone()

Jedem, der in Python mit Datenbanken zu tun hatte, sollten diese Zeilen bekannt vorkommen.

Die bei connect verwendete Zeichenkette, die in diesem Beispiel nur auf eine Datenquelle (DSN) verweist, kann viele andere Parameter aufnehmen, z.B. Username und Passwort bei einer passwortgeschützten Datenbank:

con = pyodbc.connect("DSN=bilderdb;UID=name;PWD=passwort")

Die einzelnen Parameter werden, durch Semikolon getrennt, in der Form Attribut=Wert aneinandergereiht. Die Namen der Attribute hängen vom verwendeten Treiber ab und sind recht vielfältig.

Zum Schluss noch ein paar nützliche Tipps beim Erkunden einer MS-Access-Datenbank:

Liste der Tabellen in einer Datenbank

import pyodbc

con = pyodbc.connect('DSN=bilderdb')
cursor = con.cursor()

for row in cursor.table():
print row


Die Zeilen haben den Aufbau (Werte: String oder None):

table_cat
table_schem
table_name Name der Tabelle
table_type SYSTEM TABLE, VIEW, TABLE

Die eigentlichen Tabellen werden unter dem Typ TABLE aufgelistet.

Aufbau einer Tabelle

Dieser lässt sich mit dem normalen SQL-Befehl erfragen:

cursor.execute('DESCRIBE TABLE tablenname")


Das Ergebnis wird in der Form (Name, Type, Größe) zurückgegeben.

Sonntag, 26. Juli 2009

Webdav-Bug in Ubuntu Jaunty

Möchte man das Mediacenter vom GMX nutzen, so hat man mehrere Optionen, die Daten zum GMX-Server zu übertragen und dort zu verwalten (löschen, umbenennen usw.).

Zum einen den klassischen Weg über das Web-Interface mit Javascript, oder - sehr viel einfacher - über Webdav.

Mit Webdav lässt sich der Webspace so einbinden, als wäre er ein normaler Ordner, auf den man dann mit den normalen Funktionen des Betriebssystems zugreifen kann. In der Windows-Welt ist diese Funktion als "Webordner" bekannt.

Zum Einbinden sind die folgenden Informationen nötig:
  • Adresse: mediacenter.gmx.net
  • Username: die GMX-Kundennummer
  • Passwort: das GMX E-Mail-Passwort
Die Kommunikation kann verschlüsselt oder unverschlüsselt erfolgen. Da bei Webdav das Passwort (hier ist es sogar das E-Mail-Passwort) bei jedem Zugriff quasi unverschlüsselt übertragen wird, sollte man die Kommunikation als Ganzes absichern und die Option "davs:" bzw. "https:" wählen.

Unter Gnome gibt es diverse Möglichkeiten eine Verbindung zu einem Webdav-Server herzustellen. Am häufigsten dürfte wohl "Verbindung zu Server" im Menü "Orte" eingesetzt werden.

Wenn man diesen Menüpunkt aufruft, öffnet sich ein Fenster, in dem man das Protokoll ("sicheres WebDAV"),

den Server und den Benutzernamen eingeben kann.

Nach einem Klick auf "Verbinden" öffnet sich erwartungsgemäß ein weiteres Fenster, das nach dem Passwort fragt...
und nach dessen Eingabe erscheint in "Ubuntu Jaunty" eine Fehlermeldung, die sich über eine nicht korrekte Identifizierung beklagt.



Dies scheint ein Bug in der augenblicklichen Gnome-Version zu sein, unter Ubuntu Hardy und Intrepid arbeitet dieser Menüpunkt korrekt.

Der Work-Around

Einfach keinen Usernamen im ersten Fenster eintragen.


In diesem Fall wird in der zweiten Abfrage nach Usernamen und Passwort gefragt.


Nach deren korrekten Eingabe öffnet sich dann das gewünschte Nautlius-Fenster.


Ähnlich verhält es sich mit bei der zweiten Möglichkeit Webdav-Server anzusprechen:

Man gibt in der Adresszeile eines Nautilus-Fensters

davs://mediacenter.gmx.net

ein, statt einer URI mit Username:

davs://username@mediacenter.gmx.net



Die Ergebnisse und Fehlermeldungen sind entsprechend.

Und warum?

Schaut man sich mit einem Paket-Sniffer die Kommunikation zwischen Gnome und GMX an, dann läuft diese im Fall ohne Angabe des Usernamens wie folgt ab:

  1. Gnome sendet eine OPTIONS-Abfrage an GMX, ohne Username und Passwort.
  2. GMX antwortet mit dem Fehler 401 (Nicht authentifiziert) und Angabe eines sog. Realms.
  3. Gnome fordert den Usernamen und das Passwort vom Benutzer an und
  4. sendet eine erneute OPTIONS-Abfrage, diemal mit Username + Passwort.
  5. GMX sendet ein OK (200) - und es folgt der normale Datenaustausch.
Gibt man hingegen den Username vorher an, so sind Schritt 1 und 2 identisch.
In Schritt 3 wird nur noch das Passwort abgefragt.
Schritt 4 fehlt, und deshalb gibt es auch keinen Schritt 5.
Nur eine Fehlmeldung von Gnome, dass es nicht geklappt hat.

Der Bug ist unterdessen gemeldet. Bis dahin halt den Usernamen nicht direkt angeben.

Dienstag, 14. Juli 2009

Eigene Videos auf das Cybershot

Das Handy Sony Ericsson Cybershot C902 ist keine eierlegende Wollmilchsau (auch Eier legende Wollmilchsau) wie das iPhone - sondern eher zum Telefonieren gedacht.

Nun gut - ein paar Multimedia- und Organizer-Funktionen hat es dann doch, sowie einen 5 Megapixel-Fotosensor, und es kann Videos aufnehmen und wiedergeben.

Die Handhabung ist ... naja - aber hier geht es ja um...

Die Zusammenarbeit mit Linux

Die Kamera wird unter Linux über das mitgelieferte USB-Kabel als Standard-Massenspeicher erkannt und wie ein normaler USB-Stick behandelt, was den Datentransport sehr beschleunigt. Und seitdem unter Ubuntu Jaunty die Bluetooth-Treiber wieder funktionieren, klappt der Datenaustausch auch drahtlos.

Als Videoformate können 3GP- und MP4-Dateien wiedergegeben werden. Das Display hat 320 x 240 Pixel. Was die Bildgröße der Videos angeht, so skaliert und dreht das Handy (es hat einen Lagesensor) den wiedergegeben Clip, wenn dieser größer oder kleiner als das Display ist.

Erstellen einer MP4-Datei über die Kommandozeile

Ein auf verschiedenen Seiten empfohlener Workflow ist - das Codieren mit mencoder:

mencoder input_file \
-vf scale=320:240 \
-ovc lavc -lavcopts vcodec=
mpeg4:vbitrate=300 \
-ofps
25 \
-oac
faac -faacopts br=64:object=2 -channels 2 -srate 44100 \
-o output.avi
Dieser Aufruf skaliert das Video auf 320x240 Pixel, codiert es als mpeg4 mit einer Bitrate von 300 kbps und 25 Bildern pro Sekunde. Das Audio wird mit AAC codiert (hierzu muss ggf. das Paket libfaac0 nachinstalliert werden). Audioeinstellungen: Bitrate 64 kbps, Stereo (2 Kanäle) und eine Samplerate von 44100 Hz.

Weil mencoder angeblich kein normgerechtes MP4 erzeugen kann, wird das Ergebnis zunächst als AVI gespeichert, und im nächsten Schritt mit mplayer wieder in eine Video- und eine Audio-Datei getrennt:

mplayer output.avi -dumpvideo -dumpfile temp.mp4v
mplayer output.avi -dumpaudio -dumpfile temp.aac
Diese werden dann mit dem Programm mp4creator (aus dem Paket mpeg4ip-server) wieder zusammengefügt - diesmal normgerecht:

rm output.mp4
mp4creator -r 25 -c temp.mp4v output.mp4
mp4creator -c temp.aac output.mp4
mp4creator -optimize output.mp4

Das Ergebnis ist dann eine MP4-Datei, die vom C902 wiedergegeben werden kann. Die Bildrate (in diesem Beispiel 25 fps) muss hier explizit angegeben werden.

Man kann mit den Werten ein wenig spielen und z.B. die Audio-Abtastrate an das Quellmaterial anpassen. 300 kbps für Video und 64 kbps für Audio liefern für die Wiedergabe auf dem Handy brauchbare Ergebnisse.

Erstellen der MP4-Datei mit Avidemux

Avidemux ist ein Videokonvertier-Programm mit einigen rudimentären Schnittmöglichkeiten und diversen Bearbeitungsoptionen. Es lässt sich meist über das Repository der jeweiligen Distribution nachinstallieren.

Im Programm selber nimmt man dann - in Anlehnung an die von mencoder verwendeten Werte - folgende Grundeinstellungen vor:

Video: MPEG-4 ASP
Audio: AAC (FAAC)
Format: MP4












Video - Konfigurieren


Benutzerschnittstelle
Kodier-Modus:
Einfacher/zweifacher Durchlauf mit (Durchschnitts-)Bitrate

Bitrate (kb/s): 300






Audio - Konfigurieren

Konfigurieren:
Bitrate: 64 kb/s






Nun können auch die restlichen Filter und Bearbeitungsfunktonen zum Einsatz kommen. z.B. das Zuschneiden des Clips, Änderungen in der Bildgröße, De-Inferlace-Funktionen, Anlegen neuer Tonspuren, um nur einige zu nennen.

Das Ergebnis ist nach einem "Datei - Speicher - Video speichern" direkt auf dem C902 einsetzbar.

Und sollte die Wiedergabe des Videos das Handy einmal zum Absturz bringen - die Batterie lässt sich ja einfach aus- und wieder einbauen.

Sonntag, 12. Juli 2009

Firefox 3.5 in Ubuntu (AMD 64)

Nun sollte es aber auch jeder mitbekommen haben... Die endgültige Version von Firefox 3.5 ist fertig.

Und da, wie zuletzt berichtet, bei der jetzigen Ubuntu-Version (Jaunty) nicht damit zu rechnen ist, dass ein Update verfügbar wird... auf zu mozilla.org, Firefox runtergeladen, läuft...

... wenn da nicht die Flash-Integration wäre. Die ist auf AMD64-Systemen nämlich ohne Tricks nicht so einfach zu haben.

Das Flash-Plugin von Adobe gibt es nur in 32 Bit, und läuft ohne weiteres nicht in 64-Bit-Versionen von Firefox. Dafür gibt es dann den npwrapper, mit dem dann 32-Bit-Plugins auch im 64-Bit-Firefox laufen.

Und auch wenn der Firefox von mozilla.org eine 32-Bit-Version war, so erkannte das von Adobe geladene Installationsprogramm für Flash eine 64-Bit-Umgebung, und brach ab.

Aber es geht auch einfacher!

Christoph Langner fasst in seinem Blog die Möglichkeiten in einem FAQ zusammen. Im Fall von Jaunty ist es besonders einfach - es gibt bereits ein Paket mit dem Namen "firefox-3.5". Dieser übernimmt auch die bestehenden Einstellungen (inklusive der Plugins).

Eine detaillierte Liste der installierten Plugins gibt es im übrigen mit der Eingabe about:plugins in der Adress-Zeile.

Freitag, 19. Juni 2009

eth-Null bleibt eth-Null bleibt eth-Null

In früheren Linux-Versionen hatte man in Systemen mit mehreren Ethernet-Netzwerkkarten hin und wieder das Problem, dass sich die eth-Gerätenummer z.B. nach einem Kernel-Update änderte, weil die Reihenfolge, in der Treiber aufgerufen wurden, auf einmal anders war.

Funktionen, die auf diesen Gerätenummern aufbauten - wie z.B. iptables-Firewalls - bringt dies natürlich durcheinander; und man hat sich unter Umständen ausgesperrt. Wenn der Computer dann nicht so einfach zugänglich ist, ist das... unangenehm.

Bei neueren, auf udev basierenden Systemen passiert das nicht mehr. Das System merkt sich die MAC-Adresse der Karte und weist ihr fest einen Gerätenamen zu. Das Ergebnis sind udev-Regeln, die man in /etc/udev/rules.d/70-persistent-net.rules * finden kann:

# PCI device 0x10de:0x0057 (forcedeth)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:55", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Diese Datei ist Ergebnis des Scripts /lib/udev/write_net_rules welches seinerseit von der udev-Regel /etc/udev/rules.d/75-persistent-net-generator.rules gestartet wird. (Beispiele aus Ubuntu Hardy).

In anderen Systemen, stehen diese Dateien teilweise in anderen Verzeichnissen, und die Nummer im Dateiname ist leicht verändert. Mit locate lassen sie sich aber leicht finden.

Dienstag, 16. Juni 2009

Die Kehrseite der häufigen Ubuntu-Releases

Kehrseite der halbjährlichen Ubuntu-Releases ist die Tatsache, das während eines Release-Zyklus zwar Sicherheitsupdates veröffentlicht werden, Feature-Updates oder nicht sicherheitsrelevante Fehler frühestens mit dem nächsten Release behoben werden.

War es im vorletzten Release (Intrepid) - wegen Änderungen im Bluetooth-Stack - der nicht mehr funktionierende Bluetooth-Dongle, so schmerzen die beiden Bugs in Jaunty dann doch:

In OpenOffice verschwinden plötzlich Tabellen aus Word-Dokumenten, und Inkscape lässt sich nach dem Update wegen Durcheinander in den zu ladenden Bibliotheken nicht mehr starten.

Diese beiden Fehler treten bei mir nur in der wohl nicht so weit verbreiteten 64-Bit-Versionen auf und sollen teilweise schon behoben sein.

Auch wenn der Besuch auf dem Ubuntu-Bugtracker-Portal Launchpad einem das warme Gefühl vermittelt, dass man mit dem Problem nicht allein ist, dem Durchschnitts-Ubuntuaner (oder heißen Sie Ubuntuniken...) also dem Durchschnitts-Ubunter-User werden diese Updates wohl frühestens ab Oktober mit Karmic zur Verfügung stehen.

Montag, 8. Juni 2009

Firefox - online auch ohne Internet

Es kommt zwar selten vor, aber hin und wieder betreibe ich meinen Ubuntu-Laptop auch ohne Verbindung zum Internet. Unterwegs - z.B. beim Erste-Hilfe-Einsatz als Computer-Doktor - ist der Zugriff auf die Laptop-Kopie meines Wikis recht nützlich.

Wenn eine Netzwerkverbindung fehlt schaltet Firefox in den Offline-Modus. Auf einen im Laptop laufenden Apache-Server kann so nicht zugegriffen werden.

Natürlich kann man nun mit "Datei - Offline arbeiten" diesen Modus wieder ausschalten. Auf die Dauer nervt diese Zwischenschritt; deshalb hier die Option, wie man ihn umgehen kann:

Mit der Eingabe about:config in der Adresszeile zeigt Firefox seine diversen Konfigurations-Optionen an, die so selten gebraucht werden, dass sich ein eigenes Panel dafür nicht lohnt. Hier sucht man nun nach

toolkit.networkmanager.disable

und setzt die Option auf True.

Man kann sich die Suche erleichtern, wenn man z.B. toolkit als Filterausdruck eingibt.

Hiermit wird Firefox angewiesen den Netzwerkstatus nicht beim Networkmanager zu erfragen und bleibt deshalb immer im Online-Modus. Das als Startseite konfigurierte Wiki wird nun direkt angezeigt.

Samstag, 6. Juni 2009

ng-upnp2mrtg Version 0.2.3 freigegeben

Das Dienstprogramm ng-upnp2mrtg zur Abfrage von Byte-Countern in UPNP-Routern ist nun in Version 0.2.3 verfügbar.

Neu in dieser Version ist die Option --nowrap

Beim Neuaufbau von Verbindungen (z.B. nach einer Zwangstrennung) setzen Modems häufig die Empfangs- und Sende-Zählerstände auf Null zurück. MRTG interpretiert dies als 32-Bit-Zählerüberlauf, was in der grafischen Darstellung zu einer Spitze führt. Diese lässt sich auch durch andere MRTG-Optionen nicht sicher verhindern.

Wenn diese ng-upnp2mrtg-Option gesetzt ist, werden die Zählerstände vom Skript zwischengespeichert und nach einem Reset als Offset bei allen nachfolgenden Ausgaben hinzuaddiert.

Ohne diese Spitzen kann die Funktion zur automatischen Skalierung wieder richtig arbeiten.

Samstag, 9. Mai 2009

T-Mobile und GnuPG/PGP


Ab diesem Monat gibt es die Handy-Rechnung nicht mehr auf Papier – natürlich aus Umweltschutzgründen. Wohin die gesparten Druck- und Versandkosten fließen, bleibt ungenannt.

Zu bekommen ist die Rechnung über das T-Mobile-Internet-Portal, aber auch der zusätzliche Versand per E-Mail ist vorgesehen. Diese E-Mail kann sogar mit PGP/GnuPG verschlüsselt werden. Falls der Rechnung noch der Einzelverbindungsnachweis beiliegen soll, ist die Verschlüsselung sogar zwingend vorgeschrieben.

Den Masken zum Einrichten ist eine ausführliche Seite mit Anweisungen vorgeschaltet. Jeder der in der Lage ist, ein GnuPG/PGP-Schlüsselpaar zu generieren, den öffentlichen Schlüssel auszulagern und hochzuladen, wird mit der Beschreibung keine Probleme haben...

Probleme hatte an diesem Tag hingegen der entsprechende Server bei T-Mobile, der den Versuch diese Konfiguration einzurichten mit einem „unbekannten Fehler“ quittierte. Zwar erhielt ich nach dem Einrichten die zugehörige verschlüsselte E-Mail mit der Bestätigung, der darin enthaltene Bestätigungscode wurde aber nicht angenommen. Unterdessen funktioniert aber auch das.



So sehr man T-Mobile für eine der ersten realen Einsatzmöglichkeit für GnuPG/PGP danken möchte, ein weit verbreiteter Einsatz ist nicht zuletzt wegen des umständlichen Verfahrens unwahrscheinlich.

Montag, 20. April 2009

UPnP – Entdeckungsreise... zu Fuß

Für die im Folgenden beschrieben Abläufe gibt es sicher spezialisierte Programme. Das Ziel war aber ein kurzes Skript, das von mrtg aufgerufen werden soll. Hierzu ist nur die Kenntnis einer Handvoll Strings notwendig, die in das Skript integriert werden müssen.

Auch will ich hier nicht das UPnP-Protokoll vollständig wiedergeben. Vielmehr werden nur die Teile vorgestellt, die zur Abfrage von Werten (z.B. der Anzahl der übertragenen Bytes) benötigt werden.

Mit diesen Kenntnissen sollte sich ng-upnp2mrtg eigentlich an alle UPnP-Modems, die die UPnP-Abfrage unterstützen anpassen lassen.

Die eigentliche Abfrage

Nachdem eine TCP-Verbindung zum UPnP-Server im Modem aufgebaut ist, erfolgt die Kommunikation nach dem HTTP-Protokoll.

Schauen wir uns eine typische Abfrage an.

Der Client sendet:
POST /WANCommonInterfaceConfigService/control HTTP/1.0
HOST: 192.168.0.1:49300
CONTENT-LENGTH: 340
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesReceived"

<?xml version="1.0"?>
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetTotalBytesReceived xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1">
</u:GetTotalBytesReceived>
</s:Body>
</s:Envelope>
  • Die erste Zeile ist ein HTTP-Befehl (eine Methode, gefolgt von einer URL, gefolgt von der Protokollversion).
  • Ihr folgen einige Header-Zeilen in der Form 'Schlüssel: Wert'.
  • Eine Leerzeile trennt den Header von der eigentlichen Nachricht.
  • Diese liegt im XML-Format vor (SOAP).
Die interessanten variablen Teile sind fett dargestellt. Dies sind zum einen die URL in der ersten Zeile, und in der Zeile SOAPACTION den – nennen wir ihn – Dienstbezeichner (vor dem #-Zeichen mit 'urn:schemas-upnp.org' beginnend) und die darauf anzuwendende Aktion (hinter dem #).

Natürlich müssen auch die Werte für HOST und CONTENT-LENGTH angepasst werden. Sie haben die im HTTP-Protokoll definierten Bedeutungen und sind selbsterklärend.

Die variablen Teile in der XML-Nachricht kennen wir schon aus dem Header.

In der gleich TCP-Verbindung liefert der Server seine Antwort. Hier wieder ein typisches Beispiel:
HTTP/1.1 200 OK
EXT:
CONTENT-TYPE: text/xml; charset="utf-8"
SERVER: IAD, UPnP/1.0, MicroStack v1.0.2777

<?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:GetStatusInfoResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewConnectionStatus>Connected</NewConnectionStatus>
<NewLastConnectionError>ERROR_NONE</NewLastConnectionError>
<NewUptime>30864</NewUptime>
</u:GetStatusInfoResponse>
</s:Body>
</s:Envelope>
Man erkennt eine Standard-HTTP-Antwort, mit dem HTTP-Ergebniscode in Zeile 1, weitere Headerzeilen, die unvermeidliche Leerzeile, gefolgt von Text, wieder im XML-Format. Im <u>-Tag selbst findet man wieder die Werte für Aktion und Dienst-Bezeichner. Der <u>-Tag umschließt die gewünschten Information, die ihrerseits von <tag> ...</tag> eingeschlossen sind.

Der Ergebniscode hat die bei HTTP definierte Bedeutung – kurz gesagt: 200 ist ok, bei allen anderen Werten muss man nachforschen.

Um also eine bestimmte Information abzufragen braucht man:
  • IP-Adresse und Port-Nummer des UPnP-Servers
  • die URL
  • den Bezeichner für den Dienst bzw. das Gerät und die Aktion
  • sowie den Namen des Tags, in dem in der Antwort die gewünschte Information steht.
Die IP-Adresse ist meist mit der des Routers identisch, doch spätestens bei der Port-Nummer wird es schwierig. So verwendet die FritzBox Port 49000, das NetCologne-Modem hingegen Port 49300.

Der Weg in den Router

Glücklicherweise werden diese Informationen – und noch einige mehr – vom UPnP-Server per UDP-Broadcast verbreitet. Standardmäßig wird dieser Broadcast an die IP-Adresse 239.255.255.250. Port 1900 gerichtet. Das Protokoll heißt SSDP (Simple Service Discovery Protocol).

Die Pakete kann man z.B. mit Wireshark auffangen und decodieren. Grenzen Sie ggf. die Anzeige mit 'ip.addr == a.b.c.d' auf die IP des Routers ein.

Lassen Sie sich Zeit. Es kann einige Minuten dauern, bis die ersten SSDP-Pakete angezeigt werden. Untersuchen Sie den Text-Inhalt. Nach einiger Zeit wird dieser sich wiederholen, Sie sollten aber mehrere unterschiedliche Pakete finden.

Hier der Textinhalt eines solchen Pakets
NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
LOCATION: http://192.168.0.99:49000/igddesc.xml
SERVER: mynet UPnP/1.0 AVM FRITZ!Box WLAN 3170 49.04.57
CACHE-CONTROL: max-age=1800
NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1
NTS: ssdp:alive
USN: uuid:75802409-bccb-40e7-8e6c-001C4A50656D::urn:schemas-upnp-org:device:InternetGatewayDevice:1
Auch hier erkennt man wieder die HTTP-Struktur: eine Methode (NOTIFY), eine URL (*) (naja) und die Protokollversion, gefolgt von UPnP-Headern, die diverse nützliche Informationen enthalten.
  • LOCATION: eine URL mit einer XML-Datei, die die Dienste weiter beschreibt.
  • NT: den „Dienst-Bezeichner“
  • NTS: ssdp:alive = das Geräte meldet sich an; ssdp:byebye = das Gerät meldet sich ab
  • USN: nochmal der Name des Diensts, diesmal mit einer eindeutigen ID, die von Gerät zu Gerät unterschiedlich ist, auch wenn die Dienstnamen identisch sind.
Tell me more...

Der nächste Schritt ist, die URL aus LOCATION in den Browser einzugeben. Ergebnis ist eine weitere XML-Datei. (Wenn Sie hierzu Firefox verwenden, wird die Datei übersichtlich formatiert dargestellt.) Interessant sind die Einträge unter <serviceList>, die an mehreren Stellen und in unterschiedlichen Ebenen im XML-Baum auftreten können:

Hier ein Beispiel:
...
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
<serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>
<SCPDURL>WANCommonInterfaceConfigService/scpd.xml</SCPDURL>
<controlURL>WANCommonInterfaceConfigService/control</controlURL>
...
</service>
...
</serviceList>

Unterhalb von <serviceList> findet man diverse Dienste mit <service> aufgelistet.
  • Der <serviceType> ist der Dienst-Bezeichner, den wir in der UPnP-Abfrage brauchen.
  • Die <controlURL> ist die URL für die UPnP-Abfrage (ohne vorangestellten Backslash).
  • <SCPDURL> verweist auf eine weitere XML-Datei, die die Aktionen näher beschreibt.
Stellen Sie der <SCPDURL> 'http://IP-Adresse:Port/' voran und geben Sie sie im Browser ein.

In dieser XML-Datei findet sich unter <actionList> ein oder mehrere Einträge <action>. Eine Ebene tiefer finden sich <name> und die <argumentList> mit einem oder mehreren <argument> Einträgen. Und bei <argument> interessieren wir uns vor allem für <name> und <direction>.

Prinzipieller Aufbau:
<scpd>
...
<actionList>
<action>
<name>Name_der_Aktion</name>
<argumentList>
<argument>
<name>ArgumentName_1</name>
<direction>in</direction>
</argument>
<argument>
<name>ArgumentName_2</name>
<direction>out</direction>
</argument>
...
</argumentList>
</action>
...
</actionList>
</scpd>

Die Namen der Tags sind selbsterklärend. Interessant für eine Abfrage sind natürlich nur die Aktionen mit der <direction> out.
  • Der Name der <action> ist der Aktionsname für unsere Abfrage.
  • Der Name bei <argument> ist der Name des Tags bei der Antwort, der den entsprechenden Wert einklammert.
Somit hätten wir also alle Informationen zusammen, die wir für die Abfrage brauchen.

Zum Abschluss

Die Stellen in ng-upnp2mrtg, an denen diese Werte eingetragen werden müssen, sind im Quelltext einfach zu finden.
Die Byte-Counter befinden sich meist in einer Aktion, die als Antwort die Tags „NewTotalBytesReceived“ und „NewTotalBytesReceived“ zurück gibt. Für die Verbindungsdauer sucht man am besten nach „NewUpTime“. Alle Werte werden bei einem Verbindungsaufbau zurückgesetzt, was bei MRTG leider einen Spike erzeugt.

Mittwoch, 15. April 2009

ng-upnp2mrtg nun auf SourceForge

Das Projekt ng-upnp2mrtg wird ab heute auf SourceForge gehosted.

Neuere Versionen sind künftig dort erhältlich.

Donnerstag, 2. April 2009

NetCologne Premium-Modem und die Statusabfrage via UPnP

Sysadmins lieben schöne Bilder. Durch die grafische Darstellung des zeitlichen Verlaufs von Systemvariablen wie dem Durchsatz einer Internet-Verbindung oder der Temperaturen von Festplatten, fallen Veränderungen gegenüber der Norm meist recht schnell auf.

Ein dafür sehr gern eingesetztes Werkzeug ist das Round Robin Database Tool (RRDtool) von Tobias Oetiker und der speziell für den Einsatz in Netzwerken angepasste Multi Router Traffic Grapher MRTG vom gleichen Author.

MRTG beherrscht SNMP, das Protokoll mit dem sich bei industriell eingesetzten Netzwerkgeräten Statusmeldungen, wie eben die übertragene Datenmenge, abfragen lassen. Router für Endkunden besitzen diese Option meist nicht. Dafür beherrschen diese zunehmend UPnP (Universal Plug and Play). Dieser Standard wurde entwickelt, damit z.B. die Internet-fähige Stereoanlage den Internet-Router für ihre Bedürfnissen konfigurieren kann.

Was die Internet-fähige Stereoanlage kann, können aber auch Schadprogramme, die den Router dann z.B. so programmieren können, dass der Rechner direkt von außen erreichbar wird. Deshalb ist diese Option bei den meisten sicherheitsbewussten Anwendern ausgeschaltet.

Neben der Programmierung eines Routers sieht UPnP aber auch die Möglichkeit der Statusabfrage vor. Leider kann MRTG Daten nicht direkt über UPnP abfragen. In der Konfigurationsdatei /etc/mrtg.cfg kann jedoch unter Target[XXX] statt einer SNMP-OID ein Programm angegeben werden, das von MRTG aufgerufen wird, um die Daten zu ermitteln und an MRTG weiterzureichen (siehe auch „man mrtg-reference“). Für die weit verbreiteten Router der Marke FritzBox kommt hier meist upnp2mrtg zum Einsatz.

Vorbereitungen beim NetCologne-Router Premium

Bei diesem NetCologne-Router kann im Expertenmodus über „Sicherheit – UPnP“ getrennt eingestellt werden, ob UPnP zur Programmierung von Portweiterleitungen und/oder (nur) zur Statusabfrage eingesetzt wird. Hier muss die UPnP-Abfrage freigeschaltet (und die UPnP-Steuerung sollte aus den oben genannten Gründe deaktiviert) werden.



Bei gleicher Gelegenheit sollte man mit „System – Zugangsschutz“ ein Passwort für die Web-Schnittstelle definieren – standardmäßig ist leider kein Passwort definiert.



Probleme bei der Abfrage mit upnp2mrtg

Leider schlägt der Aufruf von upnp2mrtg fehl. Die Standardwerte für HOST („firtz.box“) und PORT (49000) passen nicht zur NetCologne-Box.

Der HOST beim NetCologne-Router heißt „netconnect.box“ (oder man verwendet die entsprechende IP-Adresse, standardmäßig wird „192.168.0.1“ verwendet).
Port 49000 ist beim NetCologne-Router jedoch geschlossen. Ein Port-Scan zeigt, dass Port 49300 offen ist (dieser Wert liegt zumindest in der Nähe von 49000).
Jeses UPnP-Gerät sendet aber auch sog. SSDP-Notify-Pakete, um sich bekannt zu machen. Mit Wireshark können diese Pakete aufgezeichnet und analysiert werden:



Der Inhalt dieser Pakete bestätigt Port 49300 als UPnP-Port. Aber der entsprechend modifizierte Aufruf von upnp2mrtg:

sudo upnp2mrtg -a netconnect.box -p 49300

liefert kein Ergebnis.

Der Grund hierfür – so fand ich bei der Programmierung des Tools ng-upnp2mrtg heraus – liegt darin, dass der NetCologne-Router auf CR LF als Zeilenende-Zeichen besteht – die FritzBox begnügt sich auch mit dem Unix-Standardwert LF.

Unterschiede ng-upnp2mrtg.py / upnp2mrtg

upnp2mrtg ist ein Bash-Script, während ng-upnp2mrtg.py ein Python-Script ist. Python ist heutzutage auf jedem Linux-System standardmäßig installiert. Das ng-Script ist genügsam und nutzt nur die Python-Standardbibliotheken.

Wie in einem der nächsten Blog-Postings gezeigt braucht man zur Abfrage eines bestimmten Router-Werts nur vier Parameter. Diese scheinen sich von Router zu Router geringfügig zu unterscheiden. Hat man diese Information erst einmal ermittelt, lässt sich das Python-Programm leicht an andere Geräte anpassen. Sollten Sie das Programm mit anderen Router-Typen erfolgreich einsetzen, lassen Sie es mich wissen.

Die jetzige Version des Skripts ng-upnp2mrtg enthält neben den Parametern für den NetCologne-Router auch die für eine Fritzbox. Mangels Internetverbindung über eine FritzBox kann ich sie leider nicht testen. Die Auswahl erfolgt zurzeit noch durch ein- und auskommentieren am Ende des Skripts.

ng-upnp2mrtg - Was Sie brauchen

mrtg: Dieses Programm sollte über die Repositories Ihrer Distribution erhältlich sein. Ansonsten finden Sie es hier.

ng-upnp2mrtg.py: Das Skript läuft unter Python, was heute auf jedem Linux-System installiert sein sollte, und braucht keine besonderen Bibliotheken. Im Augenblick ist es hier abrufbar.

mrtg.cfg: Konfigurationsdatei für mrtg angepasst an ng-upnp2mrtg.py, Im Augenblick hier zu bekommen.

Ich werde versuchen das Skript bei einem der OpenSource-Projekt-Sites als Projekt anzumelden. Die Dateien und neuere Versionen werden dann dort abrufbar sein.

Installation von ng-upnp2mrtg

Für die folgenden Schritte brauchen Sie Root-Rechte:

Passen Sie oben im Skript ng-upnp2mrtg.py die Variablen HOST und PORT an.
Kopieren Sie das Skript nach /usr/local/bin und machen Sie es ausführbar
Die Konfigurationsdatei mrtg.cfg kommt nach /etc.

cp -a ng-upnp2mrtg.py /usr/local/bin
chmod 755 /usr/local/bin/ng-upnp2mrtg.py
cp -a mrtg.cfg /etc

Für den regelmäßige Aufruf von mrtg sorgt der folgende crontab-Eintrag:

0-59/5 * * * * env LANG=C /usr/bin/mrtg --logging /var/log/mrtg.log

Das Ganze wurde getestet mit Ubuntu 8.04, mrtg 2.14.7, Python 2.5.2.
Schwierigkeiten bei der Übernahme auf andere System sind eigentlich nicht zu erwarten... aber das sagt man ja vorher immer.