Passer un paramètre dans une règle udev

Salut,
J’ai un problème lors de l’exécution de la règle /lib/udev/rules.d/90-alsa-restore.rules

ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="/usr/sbin", TEST=="/usr/share/alsa", GOTO="alsa_restore_go"
GOTO="alsa_restore_end"

LABEL="alsa_restore_go"
TEST!="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/run/alsa restore $attr{device/number}"
TEST=="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/run/alsa nrestore $attr{device/number}"

LABEL="alsa_restore_end"

A l’exécution je retrouve l’erreur suivante

journalctl -a | grep alsa

août 17 21:07:25 debian systemd-udevd[263]: Process '/usr/sbin/alsactl -E HOME=/run/alsa restore 1' failed with exit code 19.
août 17 21:08:36 debian pulseaudio[1371]: [pulseaudio] module-alsa-card.c: Card '1' doesn't exist: Aucun fichier ou dossier de ce type
août 17 21:08:36 debian pulseaudio[1371]: [pulseaudio] module.c: Failed to load module "module-alsa-card" (argument: "device_id="1" name="pci-0000_02_00.1" card_name="alsa_card.pci-0000_02_00.1" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1""): initialization failed.

le problème vient du fait que le parametre passé à alsactl vaut 1 alors que je n’ai que la carte 0.

voici ce qu’indique les paramètres udev

 udevadm info -a -p /sys/class/sound/controlC0

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:14.2/sound/card0/controlC0':
    KERNEL=="controlC0"
    SUBSYSTEM=="sound"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:14.2/sound/card0':
    KERNELS=="card0"
    SUBSYSTEMS=="sound"
    DRIVERS==""
    ATTRS{id}=="SB"
    ATTRS{number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.2':
    KERNELS=="0000:00:14.2"
    SUBSYSTEMS=="pci"
    DRIVERS=="snd_hda_intel"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x040300"
    ATTRS{consistent_dma_mask_bits}=="40"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{device}=="0x4383"
    ATTRS{dma_mask_bits}=="40"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="16"
    ATTRS{local_cpulist}=="0-1"
    ATTRS{local_cpus}=="3"
    ATTRS{msi_bus}=="1"
    ATTRS{numa_node}=="0"
    ATTRS{subsystem_device}=="0x1443"
    ATTRS{subsystem_vendor}=="0x103c"
    ATTRS{vendor}=="0x1002"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

j’ai bien la carte 0: ATTRS{number}=="0"
Pourquoi passe t on 1, est ce que c’est le resultat d’un test qui vaudrait “true”?

Si j’écris en dur la valeur 0 dans la règle

TEST!="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/var/lib/alsa restore 0"

je n’ai plus d’erreur.
Où est le problème de syntaxe?

si je mets pas du tout de paramètre

cat  /lib/udev/rules.d/90-alsa-restore.rules
ACTION=="add", SUBSYSTEM=="sound", KERNEL=="controlC*", KERNELS!="card*", TEST=="/usr/sbin", TEST=="/usr/share/alsa", GOTO="alsa_restore_go"
GOTO="alsa_restore_end"

LABEL="alsa_restore_go"
TEST!="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/var/lib/alsa restore"
TEST=="/etc/alsa/state-daemon.conf", TEST=="/usr/sbin/alsactl", RUN+="/usr/sbin/alsactl -E HOME=/var/lib/alsa nrestore"

LABEL="alsa_restore_end"

alsactl s’en sort puis qu’il n’y a qu’une carte son mais pulseaudio veut toujours gérer la carte 1

 journalctl -a | grep alsa
août 18 12:36:34 debian pulseaudio[1354]: [pulseaudio] module-alsa-card.c: Card '1' doesn't exist: Aucun fichier ou dossier de ce type
août 18 12:36:34 debian pulseaudio[1354]: [pulseaudio] module.c: Failed to load module "module-alsa-card" (argument: "device_id="1" name="pci-0000_02_00.1" card_name="alsa_card.pci-0000_02_00.1" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1""): initialization failed.

Pas terrible la gestion :neutral_face:

Abandonné

voir