PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : udev-Regeln und das RUN-Kommando



floschuh
21.07.06, 11:46
Hallo zusammen,

ich würde gerne meinem Laptop beibringen, das Touchpad automatisch zu deaktivieren, wenn die Maus eingesteckt wird, da ich das Touchpad beim tippen sehr sehr nervig finde.
Dazu habe ich in der /etc/udev/10-udev.rules gemäß dieses Howots [1] folgende Zeile angelegt:


bus="usb", SYSFS{manufacturer}=="Microsoft", NAME="mouse_micrososft", RUN+="/daten/linux/deactivate_synaptics"


deactivate_synaptics ist ausfürhrbar und beeinhatet folgenden Code


#!/bin/bash
syndaemon -i 2 -d

Wenn ich das script manuell ausführe geht auch alles... Mein Problem besteht jetzt darin, dass udev aus irgendwelchen Gründen das RUN-Kommando ignoriert!? Muss ich das irgendwie anders in die 10-udev.rules eintragen, oder liegt der Fehler ganz wo anders??
Hat vielleicht jemand einen Tipp für mich??


Vielen Dank schonmal...

Gruß

Flo
[1] http://www.reactivated.net/writing_udev_rules.html

mianos
21.07.06, 12:56
also ich hab ne pcmcia karte die als usbgeräte-bridge erkannt wird. egal, aufjedenfall hab ich das so gemacht und neugestartet.

Ich habe diese datei angelegt:

/etc/udev/rules.d/60_umts_karte.rules

---
kernel=="ttyUSB[0-9]*", RUN+="/usr/bin/setpin" SYMLINK="modem"
---

das Symlink kannst du dir natürlich sparen.

probiers doch mal so.

flo

BedriddenTech
21.07.06, 13:01
Hast du mal via "udevmonitor" nachgesehen, was passiert, wenn du die Maus ansteckst? Vielleicht trifft ja eine Regelbedingung nicht.

floschuh
21.07.06, 13:50
Hast du mal via "udevmonitor" nachgesehen, was passiert, wenn du die Maus ansteckst? Vielleicht trifft ja eine Regelbedingung nicht.
Danke für die schnelle Antwort, aber die Regel funktioniert... Das Gerät /dev/mouse_micrososft wird nämlich erstellt.

@mianos
Ebenfalls Danke für die schnelle Antowrt. Ich werd mal eben testen, ob ich das auf mein Problem anwenden kann...

Gruß
Flo

floschuh
21.07.06, 14:08
So. Hab den Eintrag in der 10-udev.rules geändert in:

bus="usb", SYSFS{manufacturer}=="Microsoft", RUN+="/usr/bin/deactivate_synaptics", SYMLINK="mouse_micrososft"

Leider funktioniert es immer noch nicht.
Vielleicht hilft euch ja die Ausgabe von udevmonitor, wenn ich die Maus einstecke:


udevmonitor prints the received event from the kernel [UEVENT]
and the event which udev sends out after rule processing [UDEV]

UEVENT[1153486676.152477] add@/devices/pci0000:00/0000:00:1d.0/usb2/2-1
UEVENT[1153486676.155341] add@/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0
UDEV [1153486676.170893] add@/devices/pci0000:00/0000:00:1d.0/usb2/2-1
UEVENT[1153486676.183673] add@/class/input/input7
UEVENT[1153486676.183697] add@/class/input/input7/mouse1
UEVENT[1153486676.183705] add@/class/input/input7/event2
UEVENT[1153486676.183712] add@/class/usb_device/usbdev2.7
UDEV [1153486676.395388] add@/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0
UDEV [1153486676.414416] add@/class/input/input7
UDEV [1153486676.430214] add@/class/usb_device/usbdev2.7
UDEV [1153486676.451730] add@/class/input/input7/mouse1
UDEV [1153486676.473188] add@/class/input/input7/event2


Das Device mouse_microsoft wird erstellt und gibt bei einem "echo mouse_microsoft" auch werte aus, wenn ich die Maus bewege...

PS: Ich hab da grad noch ein tool gefunden. udevtest /class/input/mouse1/ hat folgende Ausgabe für mich/euch.


main: looking at device '/class/input/input7/mouse1' from subsystem 'input'
udev_rules_get_name: reset symlink list
udev_rules_get_name: add symlink 'mouse_micrososft'
udev_rules_get_name: rule applied, 'mouse1' becomes 'input/mouse1'
create_node: creating device node '/dev/input/mouse1', major = '13', minor = '33', mode = '0644', uid = '0', gid = '0'
create_node: creating symlink '/dev/mouse_micrososft' to 'input/mouse1'
main: run: '/usr/bin/deactivate_synaptics'
main: run: '/sbin/udev_run_devd input'
main: run: 'socket:/org/kernel/udev/monitor'

Scheinbar wird das Programm gestartet, aber funktionieren tuts nicht!!


root@flo /daten/linux>> ls -la /daten/linux/deactivate_synaptics
-rwxr-xr-x 1 root root 30 21. Jul 12:34 /daten/linux/deactivate_synaptics
root@flo /daten/linux>>



root@flo /daten/linux>> cat /daten/linux/deactivate_synaptics
#!/bin/bash
syndaemon -i 2 -d



root@flo /daten/linux>> ls -la /usr/bin/deactivate_synaptics
lrwxrwxrwx 1 root root 33 21. Jul 14:52 /usr/bin/deactivate_synaptics -> /daten/linux/deactivate_synaptics

Hoffentlich hilft euch das!?!?
Gruß
Flo

BedriddenTech
21.07.06, 14:27
Kopier doch mal die Datei, statt einen Symlink zu benutzen. Rechte für 'deactivate_synaptics' stimmen? (chmod +x)

floschuh
21.07.06, 16:19
Kopier doch mal die Datei, statt einen Symlink zu benutzen. Rechte für 'deactivate_synaptics' stimmen? (chmod +x)
Also die Recht stimmen... Siehe oben.. Wär ja sonst auch zu einfach!! *GG*
Ob das wirklich daran liegt, dass es ein SymLink ist wage ich zu bezweifeln, aber ich werde es mal testen...

Gruß
Flo

BedriddenTech
21.07.06, 16:30
Also die Recht stimmen... Siehe oben.. Wär ja sonst auch zu einfach!! *GG* Lesen müßt man können. *doing* :rolleyes:

Ach, noch was: Gib mal den absoluten Pfad zum syndaemon im Script an.

floschuh
21.07.06, 16:58
Hurra,

habs hinbekommen...


bus="usb", SYSFS{manufacturer}=="Microsoft", RUN="/usr/bin/synclient TouchpadOff=1"

muss in der 10-udev.rules stehen...

Leider ist jetzt ein neues Problem aufgetaucht... Wenn ich nämlich meine Maus aus dem USB-Port ziehe geht das Touchpad logischerweise nicht. Weiß jemand, wie ich in der 10-udev.rules dann den Befehl


/usr/bin/synclient TouchpadOff=0

reinschreiben muss, wenn die Maus nicht mehr verbunden ist?

Gruß
Flo

BedriddenTech
21.07.06, 17:26
Was du brauchst, ist das Stichwort "ACTION". :) man udev

floschuh
21.07.06, 17:26
Jetzt hab ichs aber...
Der eifer hat mich grad gepackt, deshalb hab ich mir jetzt ein Script geschreiben...

Die Datei 10-udev.rules sieht jetzt folgendermaßen aus:


bus="usb", SYSFS{manufacturer}=="Microsoft", RUN="/daten/projekte/programmieren/bash/touchpad_status", SYMLINK="mouse_microsoft"

Der SYMLINK-Eintrag ist deshalb wichtig, weil das script touchpad_status, welches gestartet wird, überprüft, ob das Gerät /dev/mouse_microsoft existiert.

Das Script sieht folgendermaßen aus:


#!/bin/bash
DEVICE=/dev/mouse_microsoft

/usr/bin/synclient TouchpadOff=1

while [ 1 ]; do
TEST=`ls $DEVICE`
if [ $TEST = "$DEVICE" ]; then
#echo 1
else
#echo 0
/usr/bin/synclient TouchpadOff=0
break
fi
sleep 1
done

Die erste Zeile legt das Gerät fest... Dies muss mit dem Eintrag in der 10-udev.rules übereinstimmen. Dann wird das Touchpad deaktiviert. In einer Endlosschleife wird dann mittels ls (vielleicht kennt jemand einen besseren Weg) geprüft, ob das Gerät existiert.
wird die Maus entfernt, gibts das Gerät auch nicht mehr. dann wandern wir in die else-Anweisung und das Touchpad wird wieder eingeschalten...
Das ganze ist ein ziemlicher HACK. Wenn jemand interesse hat, kann er/sie es gerne verbessern.

Das ist es, was ich an Linux LIEBE!!!

Gruß
Flo

PS Danke für eure Unterstützung *g*

floschuh
21.07.06, 17:30
Was du brauchst, ist das Stichwort "ACTION". :) man udev
Danke für den tipp, aber ich verstehe nicht ganz, wie das funktionieren soll!?!?!
Was muss denn dann als ACTION da stehen??? ACTION=="plugged" ACTION=="unplugged"??

floschuh
22.07.06, 09:56
Ich habs jetzt mal so probiert:


bus="usb", ACTION=="add" SYSFS{manufacturer}=="Microsoft", RUN="/usr/bin/synclient TouchpadOff=1", SYMLINK="mouse_microsoft", ENV{mouse}="%p"
bus="usb", ACTION=="remove" ENV{mouse}=="%p", RUN="/usr/bin/synclient TouchpadOff=0"


Da man dazu eine Environment-Variable (ENV) benutzen kann, hab ichs mal damit probiert. Allerdings funktioniert die Zeile mit dem ACTION=="remove" nicht. Ich habs auch schonmal mit ACTION!="add" versucht, aber keine Besserung!!
udevtest /class/input/mouse1/ kann ich ja beim Entfernen nicht benutzen, da mouse1 gelöscht wird. und udevmonitor gibt mir nur:


root@flo /home/flo>> udevmonitor
udevmonitor prints the received event from the kernel [UEVENT]
and the event which udev sends out after rule processing [UDEV]
############austecken
UEVENT[1153558386.523946] remove@/class/input/input50/mouse1
UEVENT[1153558386.524002] remove@/class/input/input50/event2
UEVENT[1153558386.524011] remove@/class/input/input50
UEVENT[1153558386.524018] remove@/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0
UEVENT[1153558386.524025] remove@/class/usb_device/usbdev3.19
UEVENT[1153558386.524032] remove@/devices/pci0000:00/0000:00:1d.1/usb3/3-2
UDEV [1153558386.563705] remove@/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0
UDEV [1153558386.580336] remove@/devices/pci0000:00/0000:00:1d.1/usb3/3-2
UDEV [1153558386.597324] remove@/class/input/input50/event2
UDEV [1153558386.608509] remove@/class/usb_device/usbdev3.19
UDEV [1153558386.611492] remove@/class/input/input50/mouse1
UDEV [1153558386.628969] remove@/class/input/input50
############einstecken
UEVENT[1153558393.096979] add@/devices/pci0000:00/0000:00:1d.1/usb3/3-2
UEVENT[1153558393.097244] add@/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0
UDEV [1153558393.115286] add@/devices/pci0000:00/0000:00:1d.1/usb3/3-2
UEVENT[1153558393.116747] add@/class/input/input51
UEVENT[1153558393.116769] add@/class/input/input51/mouse1
UEVENT[1153558393.116777] add@/class/input/input51/event2
UEVENT[1153558393.116784] add@/class/usb_device/usbdev3.20
UDEV [1153558393.328336] add@/devices/pci0000:00/0000:00:1d.1/usb3/3-2/3-2:1.0
UDEV [1153558393.347297] add@/class/input/input51
UDEV [1153558393.361066] add@/class/usb_device/usbdev3.20
UDEV [1153558393.380242] add@/class/input/input51/mouse1
UDEV [1153558393.399997] add@/class/input/input51/event2

aus.

Danke für eure Hilfe

gruß
Flo