3 votes

Les règles Udev ne parviennent pas à passer des paramètres

Je suis un débutant Linux sur Gentoo. J'essaie d'écrire une règle udev qui exécuterait un script Python et transmettrait certaines informations chaque fois qu'un périphérique usb (spécifiquement un modem usb) est inséré. J'ai :

SUBSYSTEM == "usb", ACTION == "add", $ATTRS{vendor} = "?*", RUN += "/home/.../notify.py %k '$attr{vendor}'"

comme point de départ.

Pour l'instant, notify.py est un exécutable qui essaie de m'aider à déboguer et qui ressemble à ceci :

#!/usr/bin/python
import sys
log = open("log.txt", 'a')
for a in sys.argv:
    log.write(a + "\n")
fi.close()

Je n'arrive pas à trouver comment faire passer "$attr{vendor}" ; pour l'instant, seul %k (le noyau du périphérique) est passé et imprimé, ainsi que tous les autres arguments de chaîne que j'ai envie d'ajouter. J'ai fait le tour d'internet, j'ai essayé "$attr{vendor}" (ne donne rien), "$attrs{vendor}" (donne "s{vendor}"), et "%s{vendor}" (ne donne rien). J'ai essayé de changer la priorité de cette règle, au cas où les variables ne seraient pas encore définies ou autre. J'ai examiné d'autres fichiers de règles, et aucun d'entre eux ne fait tout à fait ce que je fais, mais ils parviennent à utiliser "$attr{[quelque chose]}".

Ce qui est encore plus déroutant, c'est que si j'écris quelque chose comme

GOTO+="$attr{vendor}"

vi le met en évidence comme une chaîne de caractères, mais

RUN+="$attr{vendor}"

et vi fait ressortir tout différemment. J'ai l'impression que le bogue a quelque chose à voir avec la façon dont RUN fonctionne, ou avec mon utilisation incorrecte de "$attr", mais je suis totalement perdu.

Ces postes semblent faire quelque chose de similaire à ce que j'essaie de faire. J'apprécierais toute aide ou contribution sur ce problème.

3voto

jordan Points 136

C'est un peu compliqué, car les règles sont évaluées pour chaque nœud de l'arbre des dispositifs et parce que certaines informations sont disponibles dans certaines parties de l'arbre mais ne peuvent être référencées à partir d'une autre partie de l'arbre.

Le plus souvent, vous devez combiner au moins deux règles (cela peut être étendu à davantage de règles si vous souhaitez filtrer sur plus d'un ancêtre).

  1. Spécifiez (comme vous l'avez correctement écrit) un appareil parent qui possède les informations nécessaires que vous voulez utiliser (comme un nom ou un vendorId/productId qui est spécifique à votre appareil), stockez toutes les informations nécessaires dans des variables d'environnement et levez un drapeau pour que la deuxième règle ne puisse être exécutée que sur les ascendants de cet appareil.
  2. Filtrer sur le drapeau précédent (et tout autre attribut nécessaire) et utiliser les variables d'environnement configurées précédemment (ces valeurs ne seront normalement pas disponibles pour ce script à ce stade).

Maquette de code, mais montre le concept :

ACTION == "add", SUBSYSTEM == "usb", ATTRS{idProduct}=="0123", ATTRS{idVendor}=="4567" ENV{SEARCHED_DEVICE}="YES", ENV{VENDORID}="$attr{idVendor}", ENV{PRODUCTID}="$attr{idProduct}",
ACTION == "add", ENV{SEARCHED_DEVICE}=="YES", RUN+="/path/to/script.sh '$env{VENDORID}' '$env{PRODUCTID}'"
  • ENV{SEARCHED_DEVICE} est le drapeau utilisé pour indiquer l'appareil apparié
  • ENV{VENDORID} y ENV{PRODUCTID} contiennent les données qui doivent être sauvegardées dans la deuxième règle.
  • '$env{VENDORID}' '$env{PRODUCTID}' est la référence à ces valeurs.

Faites attention aux signes égaux simples (affectation) et doubles (valeur de test).

2voto

Ivoirians Points 151

Au cas où cela aiderait quelqu'un un jour, j'ai trouvé deux étapes qui m'ont aidé à résoudre le problème.

La première était de s'assurer que la règle avait sélectionné un dispositif parent pour en tirer des informations sur les attributs, j'ai donc ajouté une balise

ATTRS{bDeviceClass} == "02"

pour que la règle soit liée au périphérique réseau souhaité.

La deuxième étape, qui aurait pu être inutile après la première étape, consistait à définir une variable d'environnement et à l'appeler comme telle :

ENV{var} = ATTRS{bDeviceClass}, RUN+="/home/.../notify.py '$env{var}'"

La variable a été transmise avec succès. Au final, il semble que $attr et %s ne fonctionnent toujours pas. J'étais bloqué sur cette question depuis si longtemps que je n'ai pas la motivation nécessaire pour jouer avec les choses.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X