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
Observe que o script precisa ser executado como root.
Eu escrevi este script Python depois que acidentalmente descobri uma solução alternativa, usando o hub-ctrl Fork por Yi Yu, para fazer a porta Ethernet no meu Razer Core X Chroma utilizável em um laptop que executa o Arch Linux. A correção era desligar as portas, às quais o controlador Ethernet está (internamente) conectado e ligá -las novamente. Eu queria fazer isso sem codificar o barramento/dispositivo de hub, o que não é possível com hub-ctrl , então procurei o uso do PYUSB para encontrar dispositivos por fornecedor e ID do produto, e portei o usb_control_msg() do hub-ctrl para desligar/desligar os dispositivos descobertos. Percebi também que o Adaptador Ethernet cria uma nova interface de rede chamada eth0 , deixando o velho previsivelmente chamado One Hanging Dead. Uma solução alternativa que ajuda é descarregar o módulo do kernel ax88179_178a antes do ciclismo de potência e depois carregá-lo novamente. Por isso, adicionei uma opção para fazer isso com o mesmo script também. Agora eu apenas corro
python power.py cycle 0b95:1790 -m ax88179_178a
na inicialização do sistema, e Ethernet finalmente funciona.
O script tem as seguintes dependências:
libusb-1.0-0libusb-0.1-4pyusb > = 1.1.0 Ele usa backends libusb1 e libusb0 por dois motivos:
libusb0 não implementa o método get_parent usado para encontrar o hub, ao qual um dispositivo está conectado alibusb-0.1-4 para executar mensagens de desligamento de energia/em controle produziu os resultados desejados. Nem libusb1 , nem Libusb-Compat fizeram o truque. libusb-1.0-0 e pyusb :
sudo pacman -Sy libusb python-pyusb
libusb-0.1-4 deve ser instalado via AUR, https://aur.archlinex.org/packages/libusb0, por exemplo, com yay :
yay -Sy libusb0
Distros do Ubuntu mais recentes (pelo menos, a partir de 22.04) têm pyusb==1.2.1 nos repositórios oficiais [universe] , e, portanto, todas as dependências podem ser instaladas com apt :
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-usb
Se você estiver executando uma distribuição mais antiga do Ubuntu, por exemplo, 20,04 possui pyusb==1.0.2 , você pode instalar pyusb do Pypi:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-pip
sudo python3 -m pip install pyusb