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
Обратите внимание, что сценарий должен работать как корень.
Я написал этот сценарий Python после того, как я случайно обнаружил обходной путь, используя Fork hub-Ctrl от Yi Yu, чтобы сделать порт Ethernet на моем Razer Core X Chroma, используемом на ноутбуке, под управлением Arch Linux. Исправление заключалось в том, чтобы выключить порты, к которым подключен контроллер Ethernet (внутренне), а затем снова включил их. Я хотел сделать это без жесткого кодирования шины/устройства Hub, что невозможно при hub-ctrl , поэтому я обратился к использованию pyusb, чтобы найти устройства поставщиком и идентификатором продукта, и перенес usb_control_msg() из hub-ctrl чтобы выключить/на обнаруженных устройствах. Я также заметил, что цикл электроэнергии Athernet Adapter создает новый сетевой интерфейс под названием eth0 , оставляя старый предсказуемо названный одним висящим мертвым. Обходной путь, который помогает,-это разгрузить модуль ядра ax88179_178a перед силовым циклом, а затем загрузить его обратно. Следовательно, я добавил опцию, чтобы сделать это с тем же сценарием. Теперь я просто бегаю
python power.py cycle 0b95:1790 -m ax88179_178a
На системной загрузке, и Ethernet наконец -то работает.
Сценарий имеет следующие зависимости:
libusb-1.0-0libusb-0.1-4pyusb > = 1.1.0 Он использует как libusb1 , так и libusb0 по двум причинам:
libusb0 не реализует метод get_parent , который используется для поиска концентратора, к которому подключено устройствоlibusb-0.1-4 для выполнения питания OFF/ON управляющие сообщения дал желаемые результаты. Ни libusb1 , ни Libusb-Compat не сделали трюк. libusb-1.0-0 и pyusb :
sudo pacman -Sy libusb python-pyusb
libusb-0.1-4 должен быть установлен через AUR, https://aur.archlinux.org/packages/libusb0, например, с yay :
yay -Sy libusb0
Более новые дистрибуты Ubuntu (по крайней мере, с 22.04) имеют pyusb==1.2.1 в официальных хранилищах [universe] , и поэтому все зависимости могут быть установлены с помощью apt :
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-usb
Если вы запускаете более старый дистрибут Ubuntu, например, 20.04 имеет pyusb==1.0.2 , вы можете установить pyusb из PYPI:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-pip
sudo python3 -m pip install pyusb