Problem mit eigener udev Regel

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
eagle
Beiträge: 2282
Registriert: 05.11.2002 11:20:53
Wohnort: Berlin

Problem mit eigener udev Regel

Beitrag von eagle » 03.02.2007 15:27:50

Ich bin gerade dabei mir eine udev Regel für meinen USB Stick mit truecrypt Partition zu schreiben und stoße auf einig Probleme.

1. Zum Testen habe ich mir die folgende Regel mit einem Testskript angelegt:

Code: Alles auswählen

BUS=="usb", KERNEL=="sd*", SYSFS{manufacturer}=="Sony", SYSFS{serial}=="05061127 00455", NAME="truecrypt", RUN+="/home/tom/test.sh"

Code: Alles auswählen

#!/bin/sh
/bin/cat /usr/share/sounds/KDE_Beep_Ahem.wav > /dev/dsp

if [ `/bin/pidof kwin` ]; then
        /bin/cat /usr/share/sounds/KDE_Beep_Yo.wav > /dev/dsp
else
        /bin/cat /usr/share/sounds/KDE_Beep_Pop.wav > /dev/dsp
fi
Wenn ich jetzt den USB Stick einstecke, dann werden die Stücke doppelt abgespielt. Es scheint als wird die Regel zweimal ausgeführt.

2. Um das Passwort für die TrueCrypt Partition anzugeben, wollte ich kdialog bemühen. Also das Skript test.sh wie folgt umgeschrieben:

Code: Alles auswählen

#!/bin/sh

if [ `/bin/pidof kwin` ]; then
     PASSWD=$(su tom -c "(kdialog --title Passwort --password 'Truecrypt Container')")
     su tom -c "(kdialog --msgbox $PASSWD)"
fi
Wenn ich jetzt den Stick einstecke werden keine Dialoge angezeigt. Führe ich das Skript direkt als root aus, dann funktioniert es.

eagle
"I love deadlines. I love the whooshing sound they make as they fly by." -- Douglas Adams

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 03.02.2007 18:16:55

Beim zweiten Beispiel geht mir die DISPLAY Environmentvariable ab. XAUTHORITY wird auch nicht gesetzt, also müßtest du als Inhaber des Displays einmal "xhost +localhost" ausführen. Versuche das Script einmal in einem VT aufzurufen

Gruß
gms

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 03.02.2007 18:43:41

Hi,...

...ich hab auch schon mal ein aehnliches Dingens mit Problemen aufgsetzt, bin aber nicht wirklich klargekommen.

Loesungsansatz heute:

Prozess-ID von X holen
Xauth-Datei suchen
User Xauth (muesste bei udev doch root sein, oder?) aktualisieren
DISPLAY-Variable setzen
ab gehts

Problem ist Xauth-Datei zu filtern, sonst in kuerze:

Code: Alles auswählen

PID=$(pidof X | cut -d ' ' -f 1)
AUTH=$(cat /proc/$PID/environ | grep or sed oder sonstwas )<- da steht bei mir zumindest mitunter /var/lib/gdm/:0.Xauth
xauth merge $AUTH
DISPLAY=:0 (default)
client starten
Problematisch wird es wohl wenn mehrere Server laufen...wie den aktiven finden!?

hope it hilft

cheers
chab
Watt about the non-digital!?

Benutzeravatar
eagle
Beiträge: 2282
Registriert: 05.11.2002 11:20:53
Wohnort: Berlin

Beitrag von eagle » 03.02.2007 20:02:41

Das mit der XAUTHORITY sollte eigentlich nicht das Problem sein. su $user -c sorgt m.A. dafür das der nachfolgende Befehl als Benutzer $user ausgeführt wird.

Das Skript funktioniert in einem X Terminal unter root (su) wie erwartet. Lasse ich su $user -c weg bekomme ich beim Ausführen die Fehlermeldung
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

kdialog: cannot connect to X server :0.0
Ich habe habe z.B. auf die oben beschrieben Weise das acpi Skript /usr/share/acpi-support/screenblank angepasst, dass das Sperren des Displays auch unter KDE funktioniert.

Code: Alles auswählen

# Anpassung fuer den KDE
if [ `pidof kwin` ]; then
        su $user -c "dcop kdesktop KScreensaverIface lock"
fi
Ich habe mein Testskript um die getXuser aus der Datei /usr/share/acpi-support/power-func erweitert der mir den aktuellen X Benutzer liefert. Leider hilft das auch nicht weiter :(.

Code: Alles auswählen

#!/bin/sh

getXuser() {
        user=`finger| grep -m1 ":$displaynum " | awk '{print $1}'`
        if [ x"$user" = x"" ]; then
                user=`finger| grep -m1 ":$displaynum" | awk '{print $1}'`
        fi
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
}

getXuser

echo Benutzer: $user Home: $userhome Xauth: $XAUTHORITY > /tmp/user

if [ `/bin/pidof kwin` ]; then
     PASSWD=$(su $user -c "(kdialog --title Passwort --password 'Truecrypt Container')")
     su tom -c "(kdialog --msgbox $PASSWD)"
fi
Blöderweise liefert udev keine Fehlermeldungen. Ich bin da schon in zwei Fallen getappt.

eagle
"I love deadlines. I love the whooshing sound they make as they fly by." -- Douglas Adams

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 03.02.2007 20:37:21

mit ein paar leichten Modifikationen funktioniert das Script bei mir

Code: Alles auswählen


# DISPLAY muß gesetzt werden
export DISPLAY=:0.0
# displaynum wird von getXuser verwendet, ohne dem liefert getXUser zufällige Werte (user)
displaynum=0

getXuser() {
        user=`finger| grep -m1 ":$displaynum " | awk '{print $1}'`
        if [ x"$user" = x"" ]; then
                user=`finger| grep -m1 ":$displaynum" | awk '{print $1}'`
        fi
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
}

getXuser

echo Benutzer: $user Home: $userhome Xauth: $XAUTHORITY > /tmp/user

if [ `/bin/pidof opera` ]; then
     PASSWD=$(su $user -c "(kdialog --title Passwort --password 'Truecrypt Container')")
# hier sollte auch $user verwendet werden:
     su $user -c "(kdialog --msgbox $PASSWD)"
fi

[edit]
habe vergessen oben das "/bin/pidof opera" auszubessern, bei mir läuft kein kwin :)
[/edit]


Gruß
gms

Benutzeravatar
eagle
Beiträge: 2282
Registriert: 05.11.2002 11:20:53
Wohnort: Berlin

Beitrag von eagle » 04.02.2007 10:49:56

Vielen Dank für deine Hilfe, die nicht initialisierte Variable habe ich übersehen. Bei den ACPI Skripten wird natürlich die displaynum und DISPLAY Variable gesetzt (/etc/acpi/lid.sh):

Code: Alles auswählen

..
    for x in /tmp/.X11-unix/*; do
        displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
        getXuser;
        if [ x"$XAUTHORITY" != x"" ]; then
            export DISPLAY=":$displaynum"
            . /usr/share/acpi-support/screenblank
        fi
    done
...
eagle
"I love deadlines. I love the whooshing sound they make as they fly by." -- Douglas Adams

Benutzeravatar
eagle
Beiträge: 2282
Registriert: 05.11.2002 11:20:53
Wohnort: Berlin

Beitrag von eagle » 04.02.2007 11:54:51

Jetzt bleibt leider das eingangs erwähnte Problem 1 zu lösen. Wenn ich den Stick einstecke, dann werde ich zweimal hintereinander nach dem Passwort gefragt. Aus irgend einem Grund wird die Regel doppelt ausgeführt.

Hat jedmand eine Idee?

eagle
"I love deadlines. I love the whooshing sound they make as they fly by." -- Douglas Adams

Benutzeravatar
eagle
Beiträge: 2282
Registriert: 05.11.2002 11:20:53
Wohnort: Berlin

Beitrag von eagle » 25.02.2007 19:36:30

Die Lösung des Problems ist KERNEL=="sd*" in der udev Regel. Das es eine Partition sda1 auf dem Stick gibt trifft die Regel auf sda und sda1 zu 8).

Also lautet die richtige Regel:

Code: Alles auswählen

KERNEL=="sd*[0-9]", SYSFS{manufacturer}=="Sony", SYSFS{serial}=="0506112700455", NAME="truecrypt", RUN+="/home/tom/test.sh"
eagle
"I love deadlines. I love the whooshing sound they make as they fly by." -- Douglas Adams

Antworten