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
Tenga en cuenta que el script debe ejecutarse como root.
Escribí este script de Python después de descubrir accidentalmente una solución alternativa, utilizando Hub-Ctrl Fork de Yi Yu, para hacer que el puerto Ethernet en mi Razer Core X Chroma se pueda usar en una computadora portátil que ejecuta Arch Linux. La solución fue para apagar los puertos, a los que el controlador Ethernet está (internamente) conectado y luego encenderlos nuevamente. Quería hacer esto sin codificar el bus/dispositivo HUB, lo que no es posible con hub-ctrl , por lo que recurrí a usar PyusB para encontrar dispositivos por proveedor y ID de producto, y portaba el usb_control_msg() de hub-ctrl a la ofensiva/en los dispositivos descubiertos. También noté que el ciclo de potencia del adaptador Ethernet crea una nueva interfaz de red llamada eth0 , dejando al viejo previsiblemente llamado One Hanging Dead. Una solución que ayuda es descargar el módulo de núcleo ax88179_178a antes del ciclo de alimentación y luego volver a cargarlo. Por lo tanto, agregué una opción para hacer esto con el mismo script también. Ahora solo corro
python power.py cycle 0b95:1790 -m ax88179_178a
en el arranque del sistema, y Ethernet finalmente funciona.
El script tiene las siguientes dependencias:
libusb-1.0-0libusb-0.1-4pyusb > = 1.1.0 Utiliza los backends de libusb1 y libusb0 por dos razones:
libusb0 no implementa el método get_parent que se utiliza para encontrar el concentrador, al que se conecta un dispositivo allibusb-0.1-4 para ejecutar los mensajes de control de apagado/encendido produjeron los resultados deseados. Ni libusb1 ni Libusb-Compat hicieron el truco. libusb-1.0-0 y pyusb :
sudo pacman -Sy libusb python-pyusb
libusb-0.1-4 debe instalarse a través de AUR, https://aur.archlinux.org/packages/libusb0, por ejemplo, con yay :
yay -Sy libusb0
Las distribuciones de Ubuntu más nuevas (al menos, a partir de 22.04) tienen pyusb==1.2.1 en los repositorios oficiales [universe] , por lo que todas las dependencias se pueden instalar con apt :
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-usb
Si está ejecutando una distribución de Ubuntu más antigua, por ejemplo, 20.04 tiene pyusb==1.0.2 , puede instalar pyusb desde pypi:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-pip
sudo python3 -m pip install pyusb