Comment puis-je changer les autorisations dans / sys pour modifier l'état d'une LED / lumière en utilisant `udev`?

11

J'ai un Thinkpad et j'aimerais utiliser le ThinkLight (le flash blanc au-dessus de l'écran conçu pour éclairer le clavier) pour les notifications sur les messages Jabber entrants.

C'est facile à réaliser car il suffit de passer /sys/class/leds/tpacpi::thinklight/brightnessà 255. Je le ferai avec un simple script Bash, qui laissera la lumière clignoter trois fois.

Mais pour pouvoir le faire, je dois modifier les autorisations, non seulement root est capable de modifier ce fichier.
Et je ne veux pas sudo chmod o+w /sys/class/leds/tpacpi::thinklight/brightnessaprès chaque démarrage.

Je pense que la meilleure solution est d'utiliser udevpour cela. Cependant, je ne l'ai jamais utilisé udevauparavant et je suis assez confus par les tutoriels que j'ai trouvés en ligne.

J'ai essayé cette udevrègle:

KERNEL=="tpacpi::thinklight", MODE="0666"

aussi bien que

KERNEL="thinklight", MODE="0666"

Mais ça ne marche pas. Bien que je n'obtienne pas d'erreurs lors de l'exécutionudevadm test /class/leds

Merci pour toute aide et succès. Ou peut-être d'autres solutions.

Torbjörn
la source
bonne idée avec la notification, je dois faire ça aussi :) merci
K1773R

Réponses:

7

J'utilise deux règles udev comme suit, pour donner aux membres du groupe l' ledsaccès à toutes les LED:

SUBSYSTEM=="leds", ACTION=="add", RUN+="/bin/chgrp -R leds /sys%p", RUN+="/bin/chmod -R g=u /sys%p"
SUBSYSTEM=="leds", ACTION=="change", ENV{TRIGGER}!="none", RUN+="/bin/chgrp -R leds /sys%p", RUN+="/bin/chmod -R g=u /sys%p"

Notez que la ACTION=="change"règle est nécessaire pour gérer les attributs créés dynamiquement. Par exemple, si le déclencheur de la LED est réglé sur "timer" ( echo timer > trigger), alors des attributs supplémentaires delay_onet delay_offsont créés. L' changeaction est spécifiée de sorte que ces nouveaux attributs aient leur groupe et leurs autorisations définis.

J'ai remarqué qu'un changeévénement est généré chaque fois que la LED est éteinte en écrivant 0à /sys/class/leds/.../brightness. Cela semble être dû aux déclencheurs de suppression du code du pilote Linux LED chaque fois que la luminosité est définie sur 0. C'est pourquoi la deuxième règle a la ENV{TRIGGER}!="none"condition, pour empêcher le déclenchement de la règle à chaque fois qu'une LED est éteinte.

Craig McQueen
la source
1

Je pense que vous avez le mauvais réglage «KERNEL». De ce doc génial pour écrire et déboguer les règles udev:

http://www.reactivated.net/writing_udev_rules.html#basic

Je pense que vous avez besoin de KERNEL = luminosité et peut-être d'un SUBSYSTEM = leds

Ensuite, au cas où votre distribution manque de support inotify. Assurez-vous que vos modifications sont vues par udevd:

# udevcontrol reload_rules
polynôme
la source