Por que minha regra do udev não funciona

3

Eu verifiquei o fórum e o google, mas não encontrei a resposta. Eu tento adicionar a regra do udev para desativar o touchpad quando o mouse está conectado. Primeiro eu escrevi regra geral para verificar se funciona, mas não. Esta é a regra:

ACTION=="add", SUBSYSTEM=="input", RUN+="/usr/local/bin/touchpadtoggle.sh"
ACTION=="remove", SUBSYSTEM=="input", RUN+="/usr/local/bin/touchpadtoggle.sh"

esta regra é colocada em /etc/udev/rules.d/00-touchpad.rules

e este é o script bash do teste:

#!/bin/bash
notify-send "Test"

Roteiro Bash funciona bem. Se eu digitar "/usr/local/bin/touchpadtoggle.sh" na linha de comando, a notificação será mostrada.

    
por qiqqq 08.09.2016 / 11:36

2 respostas

0

O problema é que o udev é executado como root e, portanto, executa seu script como root, não como você. Você vai querer isso para o seu script real, mas é por isso que notify-send não está enviando você a notificação quando executado pelo udev. Além disso, a variável de ambiente DISPLAY precisará ser configurada manualmente, pois o udev é executado em um ambiente mínimo.

Altere seu script para o seguinte, substituindo $USER pelo seu nome de usuário:

#!/bin/bash
sudo -u $USER DISPLAY=:0 notify-send "Test"

Além disso, para garantir que as novas regras sejam (re) lidas antes, execute:

sudo udevadm control -R
    
por Martin Thornton 08.09.2016 / 14:19
0

As regras yr udev podem (i) falhar na identificação de yr mouse como um dispositivo usb ou (ii) incluir algum tipo de notificação no display (stdout) que não é entendida pelo ambiente udev mínimo no qual ano regras operam. (Um exemplo disso é que, por padrão, eles não sabem que existe uma exibição de um ano.)

Para dissipar a última dúvida, mostre o conteúdo de /usr/local/bin/touchpadtoggle.sh ).

Para o primeiro, abra o terminal e com as janelas focadas, desconecte o mouse e faça o seguinte no terminal:

 $ lsusb
 $ udevadm monitor --property

Em seguida, conecte yr mouse e imediatamente depois feche o cmd no terminal com 'CTRL-C'. Faça isso rapidamente, sem tocar no próprio mouse. Não é prejudicial, mas confuso e você vai ter um monte de saída na tela do ano, se você não fizer as coisas corretamente. Você reconhecerá as seguintes saídas (aqui para meu próprio mouse):

 $ lsusb
 Bus 002 Device 004: ID 192f:0916 Avago Technologies, Pte.

Meu mouse está no Barramento 002. O que segue é o ID do fornecedor, 192f, e o ID do modelo, 0916. Quando disponíveis e conhecidos, os IDs de produtos e fornecedores são dois atributos que podem ser usados para identificar um dispositivo específico sem ambiguidade em um regra udev . Eu os favoreceria sobre o teste excessivamente simples SUBSYSTEM=="input" que eu acho que não discrimina entre dispositivos. Confirme e refine isso com a saída do segundo cmd:

$ udevadm monitor --property
[.......]
UDEV  [25696.403834] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/event4 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-192f_USB_Optical_Mouse-event-mouse /dev/input/by-path/pci-0000:00:1d.7-usb-0:3.4:1.0-event-mouse
DEVNAME=/dev/input/event4
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/event4
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Optical_Mouse
ID_MODEL_ENC=USB\x20Optical\x20Mouse
ID_MODEL_ID=0916
ID_PATH=pci-0000:00:1d.7-usb-0:3.4:1.0
ID_PATH_TAG=pci-0000_00_1d_7-usb-0_3_4_1_0
ID_REVISION=0200
ID_SERIAL=192f_USB_Optical_Mouse
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=192f
ID_VENDOR_ENC=192f
ID_VENDOR_ID=192f
MAJOR=13
MINOR=68
SEQNUM=2567
SUBSYSTEM=input
USEC_INITIALIZED=5875811

UDEV  [25696.407470] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/mouse0 (input)
ACTION=add
DEVLINKS=/dev/input/by-id/usb-192f_USB_Optical_Mouse-mouse /dev/input/by-path/pci-0000:00:1d.7-usb-0:3.4:1.0-mouse
DEVNAME=/dev/input/mouse0
       *^^^ that's my device name ! ^^^*
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/mouse0  
*^^^ that's my device path ! ^^^*
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Optical_Mouse
ID_MODEL_ENC=USB\x20Optical\x20Mouse
ID_MODEL_ID=0916
^^^^^^^^^^^^^^^^
ID_PATH=pci-0000:00:1d.7-usb-0:3.4:1.0
ID_PATH_TAG=pci-0000_00_1d_7-usb-0_3_4_1_0
ID_REVISION=0200
ID_SERIAL=192f_USB_Optical_Mouse
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=192f
ID_VENDOR_ENC=192f
ID_VENDOR_ID=192f
^^^^^^^^^^^^^^^^^
MAJOR=13
MINOR=32
SEQNUM=2566
SUBSYSTEM=input
USEC_INITIALIZED=5875565

[parei de monitorar aqui com CTRL-C]

Com o acima, você sabe que o kernel reconhece meu dispositivo de entrada como /dev/input/event4 ou /dev/input/mouse0 . Observe que você encontra novamente a confirmação: ID_MODEL_ID=0916 e ID_VENDOR_ID=192f . Com isso, posso escrever uma regra udev que deve reconhecer esse dispositivo específico. Apenas adicionar ID_MODEL_ID=="0916",ID_VENDOR_ID=="192f" a SUBSYSTEM=="input" nas regras udev acima deve ser suficiente para uma cura.

Existe outra maneira de fazer isso, o que eu prefiro. Desde que eu sei o nome do meu dispositivo (de cima), no terminal eu faço:

$ udevadm info -a -p $(udevadm info -q path -n /dev/input/mouse0)
                                                         ^^^^^^^
                                                   may be different for you
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22/mouse0':
    KERNEL=="mouse0"
    SUBSYSTEM=="input"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003/input/input22':
    KERNELS=="input22"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{name}=="USB Optical Mouse"
    ATTRS{phys}=="usb-0000:00:1d.7-3.4/input0"
    ATTRS{uniq}==""
    ATTRS{properties}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0003':
    KERNELS=="0003:192F:0916.0003"
    SUBSYSTEMS=="hid"
    DRIVERS=="hid-generic"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4/2-3.4:1.0':
    KERNELS=="2-3.4:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceSubClass}=="01"
    ATTRS{bInterfaceProtocol}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-3/2-3.4':
    KERNELS=="2-3.4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="3.4"
    ATTRS{idVendor}=="192f"
    ATTRS{speed}=="1.5"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="8"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="98mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0200"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="62095"
    ATTRS{ltm_capable}=="no"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0916"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="USB Optical Mouse"

Então, desde que eu não queira exibir nada na tela, a regra udev se torna:

ACTION=="add",SUBSYSTEMS=="usb",ATTRS{idVendor}=="192f",ATTRS{idProduct}=="0916",RUN+="/usr/local/bin/touchpadtoggle.sh"

Altere os valores "192f" e "0916" para se adequarem ao yr hw.
HTH. Feedback bem-vindo.

    
por Cbhihe 08.09.2016 / 16:13