Como faço para redefinir um dispositivo USB usando um script?

4

Eu tenho um modem GSM USB que nem sempre funciona (Huawei E367u-2) Às vezes, ele é redefinido (o dispositivo USB é desconectado / reconectado nos logs) e, quando volta a funcionar, tem números ttyUSB diferentes. Às vezes, no boot, usb_modeswitch parece não ser demitido. O computador é um Raspberry Pi rodando Raspbian.

Eu tenho uma solução simples para isso: a cada minuto cron executa o seguinte script (pseudo-código):

If WVDIAL is not running:
    Run WVDIAL

Eu quero mudar o script para ser isso:

If /dev/ttyUSB0 is not present:
    If DevicePresent(12d1:1446):
        ResetDevice(12d1:1446)
    ElseIf DevicePresent(12d1:1506)
        ResetUSB(12d1:1506)
If WVDIAL is not running:
    Run WVDIAL

Obviamente, este é pseudo-código, mas eu tenho as seguintes linhas que eu preciso amarrar juntos, mas não consigo descobrir como:

Isto carrega o wvdial se ele não estiver rodando:

#! /bin/sh 
# /etc/init.d/wvdial

### BEGIN INIT INFO
# Provides:          TheInternet
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Simple script to start a program at boot
# Description:       A simple script from www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting GPRS Internet"
    # run application you want to start
    /sbin/start-stop-daemon --start --background --quiet --exec /usr/bin/wvdial internet
    ;;
  stop)
    echo "Stopping GPRS Internet"
    # kill application you want to stop
    /sbin/start-stop-daemon --stop --exec /usr/bin/wvdial 
    ;;
  *)
    echo "Usage: /etc/init.d/noip {start|stop}"
    exit 1
    ;;
esac

exit 0

Isso me permite encontrar o caminho /sys para um determinado dispositivo:

for X in /sys/bus/usb/devices/*; do
    echo "$X"
    cat "$X/idVendor" 2>/dev/null
    cat "$X/idProduct" 2>/dev/null
    echo
done

E isso redefine um dispositivo USB se você souber o caminho correto / sys:

echo 0 > /sys/bus/usb/devices/1-1.2.1.1/authorized
echo 1 > /sys/bus/usb/devices/1-1.2.1.1/authorized

Então, eu preciso juntar as duas últimas seções e um teste para /dev/ttyUSB0 em uma seção que vai no comentário "Se você quiser que um comando seja sempre executado, coloque aqui".

  • Como posso fazer isso?
  • Existe uma maneira melhor de fazer isso?
por RoboJ1M 27.08.2013 / 02:01

1 resposta

0

Eu acho que você está basicamente lá:

#!/bin/sh

for X in /sys/bus/usb/devices/*
do
    if [ -e "$X/idVendor" ] && [ -e "$X/idProduct" ] \
           && [ 12d1 = $(cat "$X/idVendor") ] && [ 1446 = $(cat "$X/idProduct") ]
    then
        echo 0 >"$X/authorized"
        # might need a small sleep here
        echo 1 >"$X/authorized"
    fi
done

Isso faz um loop em todos os dispositivos (como você estava fazendo) e cada vez que encontrar uma correspondência para o fornecedor: ids de produto, aplica a redefinição que funciona para você.

Como um aparte, você pode querer olhar para o programa watchdog como uma alternativa para o seu trabalho cron .

    
por 23.08.2016 / 10:44