usage: power.py [-h] [-m [MOD ...]] {cycle,off,on} id
Powers off/on usb devices by id
positional arguments:
{cycle,off,on} action to perform: power-cycle, off or on
id usb device id in the form 'idVendor:idProduct', each id is a hex number from 0 to ffff, e.g., '123:abcd'
options:
-h, --help show this help message and exit
-m [MOD ...], --mod [MOD ...]
kernel module(s) to unload before the action, and to load back after the action
Remarque Le script doit être exécuté comme root.
J'ai écrit ce script Python après avoir découvert accidentellement une solution de contournement, en utilisant Hub-Ctrl Fork by Yi Yu, pour faire du port Ethernet sur mon Razer Core X Chromable utilisable sur un ordinateur portable exécutant Arch Linux. Le correctif consistait à éteindre les ports, auxquels le contrôleur Ethernet est (en interne) connecté, puis à les alimenter à nouveau. Je voulais le faire sans codage en dur le Hub Bus / Device, ce qui n'est pas possible avec hub-ctrl , alors je me suis tourné vers l'utilisation de PyusB pour trouver des appareils par fournisseur et ID de produit, et j'ai porté le usb_control_msg() à partir de hub-ctrl à la mise hors tension / sur les appareils découverts. J'ai également remarqué que le cycle de puissance de l'adaptateur Ethernet crée une nouvelle interface de réseau appelée eth0 , laissant l'ancien nom de Hanging Dead. Une solution de contournement qui aide est de décharger le module du noyau ax88179_178a avant le cyclisme de puissance, puis de le charger à nouveau. Par conséquent, j'ai également ajouté une option pour le faire avec le même script. Maintenant je cours juste
python power.py cycle 0b95:1790 -m ax88179_178a
Sur le démarrage du système, et Ethernet fonctionne enfin.
Le script a les dépendances suivantes:
libusb-1.0-0libusb-0.1-4pyusb > = 1.1.0 Il utilise les backends libusb1 et libusb0 pour deux raisons:
libusb0 n'implémente pas la méthode get_parent utilisée pour trouver le hub, auquel un périphérique est connecté àlibusb-0.1-4 pour exécuter les messages de puissance OFF / On Control a donné les résultats souhaités. Ni libusb1 , ni Libusb-Compat n'ont fait l'affaire. libusb-1.0-0 et pyusb :
sudo pacman -Sy libusb python-pyusb
libusb-0.1-4 doit être installé via AUR, https://aur.archlinux.org/packages/libusb0, par exemple, avec yay :
yay -Sy libusb0
De nouvelles distros Ubuntu (au moins, à partir de 22.04) ont pyusb==1.2.1 dans les référentiels officiels [universe] , et donc toutes les dépendances peuvent être installées avec apt :
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-usb
Si vous exécutez une ancienne distribution Ubuntu, par exemple, 20.04 a pyusb==1.0.2 , vous pouvez installer pyusb à partir de PYPI:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-pip
sudo python3 -m pip install pyusb