Como posso alterar as permissões em / sys para alterar o estado de um LED / luz usando `udev`?

11

Eu tenho um Thinkpad e gostaria de usar o ThinkLight (a luz branca do flash acima da tela projetada para iluminar o teclado) para notificações sobre mensagens Jabber recebidas.

É fácil perceber que é necessário mudar apenas /sys/class/leds/tpacpi::thinklight/brightnesspara 255. Farei isso com um script Bash simples, que permitirá que a luz pisque por três vezes.

Mas para poder fazer isso, preciso alterar as permissões, para que não apenas o root possa alterar esse arquivo.
E eu não quero sudo chmod o+w /sys/class/leds/tpacpi::thinklight/brightnessdepois de cada inicialização.

Eu acho que a melhor solução está usando udevpara isso. No entanto, nunca usei udevantes e estou bastante confuso com os tutoriais que encontrei online.

Eu tentei esta udevregra:

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

assim como

KERNEL="thinklight", MODE="0666"

Mas não funciona. Embora eu não esteja recebendo erros durante a execuçãoudevadm test /class/leds

Obrigado por qualquer ajuda e hits. Ou talvez outras soluções.

Torbjörn
fonte
boa idéia com a notificação, tem que fazer isso também :) graças
K1773R

Respostas:

7

Estou usando duas regras do udev, a seguir, para fornecer aos membros do grupo ledsacesso a todos os LEDs:

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"

Observe que a ACTION=="change"regra é necessária para manipular atributos criados dinamicamente. Por exemplo, se o gatilho da LED é definido como "timer" ( echo timer > trigger), então atributos extras delay_one delay_offsão criados. A changeação é especificada para que esses novos atributos tenham seus grupos e permissões definidos.

Percebi que um changeevento é gerado toda vez que o LED é desligado, escrevendo 0para /sys/class/leds/.../brightness. Parece que isso ocorre devido à liberação do código do driver do LED do Linux sempre que o brilho é definido 0. É por isso que a segunda regra tem a ENV{TRIGGER}!="none"condição, para impedir que a regra seja acionada toda vez que um LED é desligado.

Craig McQueen
fonte
1

Eu acho que você tem a configuração 'KERNEL' errada. Neste documento impressionante para escrever e depurar regras do udev:

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

Eu acho que você precisa de KERNEL = brilho, e talvez um SUBSISTEMA = leds

Então, caso sua distribuição não tenha suporte para notificar. Verifique se suas alterações estão sendo vistas pelo udevd:

# udevcontrol reload_rules
polinomial
fonte