Ufff, ależ się napracowałem. Skrypt testowałem na:
- SimCOM 7600E-H [ wwan0 -> usbX oraz /dev/cdc-wdm0 -> /dev/modem-usbX ]
- Huawei E3372 HiLink [ eth2 -> usbX ]
- Ericsson F5521GW 2XGNJ (nie udało mi się go znowu połączyć z ISP, działa losowo jak chce)
Plik: /etc/hotplug.d/usb/99-modem_detect.sh
#!/bin/sh
CONFIGS=" \
usb0;1-1 \
usb1;1-1.1 \
usb2;1-1.2 \
usb3;1-1.3 \
usb4;1-1.4 \
"
#echo "" >> /tmp/_modem_detect.txt
#env >> /tmp/_modem_detect.txt
#if ( [ "$ACTION" == "add" ] || [ "$ACTION" == "bind" ] ) && [ "$DEVTYPE" == "usb_interface" ] && [ "$DRIVER" == "cdc_ether" ]; then
if ( ( [ "$ACTION" == "add" ] || [ "$ACTION" == "bind" ] ) && [ "$DEVTYPE" == "usb_interface" ] && ( [ "$DRIVER" == "cdc_ether" ] || [ "$DRIVER" == "qmi_wwan" ] ) ) || ( [ "$ACTION" == "remove" ] ); then
PORT=$( echo $DEVICENAME | cut -d ":" -f1 )
URL_INTERFACE=$( /bin/ls -ld /sys"$DEVPATH"/../*/net | /usr/bin/head -n 1 | /usr/bin/awk '{print $9}' )
INTERFACE=$( /bin/ls -l $URL_INTERFACE | /usr/bin/head -n 1 | /usr/bin/awk '{print $9}' )
URL_USB=$( /bin/ls -ld /sys"$DEVPATH"/../*/usbmisc | /usr/bin/head -n 1 | /usr/bin/awk '{print $9}' )
USB=$( /bin/ls -l $URL_USB | /usr/bin/head -n 1 | /usr/bin/awk '{print $9}' )
if ( [ "$ACTION" == "add" ] || [ "$ACTION" == "bind" ] ) && [ "$DEVTYPE" == "usb_interface" ] && ( [ "$DRIVER" == "cdc_ether" ] || [ "$DRIVER" == "qmi_wwan" ] ); then
if [ "$DRIVER" == "cdc_ether" ]; then
/usr/bin/logger -t modem_detect ""
/usr/bin/logger -t modem_detect "Detected modem HiLink on usb port $PORT and assigned to interface $INTERFACE"
elif [ "$DRIVER" == "qmi_wwan" ]; then
/usr/bin/logger -t modem_detect ""
/usr/bin/logger -t modem_detect "Detected modem QMI on usb port $PORT and assigned to interface $INTERFACE and /dev/$USB"
fi
fi
for CONFIG in $CONFIGS
do
CONFIG_INTERFACE=$( echo $CONFIG | cut -d ';' -f1 )
CONFIG_DEVICENAME=$( echo $CONFIG | cut -d ';' -f2 )
if ( [ "$ACTION" == "add" ] || [ "$ACTION" == "bind" ] ) && [ "$DEVTYPE" == "usb_interface" ] && ( [ "$DRIVER" == "cdc_ether" ] || [ "$DRIVER" == "qmi_wwan" ] ); then
if [ ! -d "/sys/class/net/$CONFIG_INTERFACE" ] && [ "$CONFIG_DEVICENAME" == "$PORT" ]; then
if [ "$DRIVER" == "cdc_ether" ]; then
echo "" >> /tmp/_modem_detect.txt
echo "Detect modem HiLink!" >> /tmp/_modem_detect.txt
echo " PORT: "$PORT >> /tmp/_modem_detect.txt
echo "INTERFACE: "$INTERFACE >> /tmp/_modem_detect.txt
/usr/bin/logger -t modem_detect "Changing the interface name from $INTERFACE to $CONFIG_INTERFACE"
/sbin/ip link set $INTERFACE down
/sbin/ip link set $INTERFACE name $CONFIG_INTERFACE
/sbin/ip link set $CONFIG_INTERFACE up
/etc/init.d/network restart
/etc/init.d/openvpn restart
fi
if [ "$DRIVER" == "qmi_wwan" ]; then
echo "" >> /tmp/_modem_detect.txt
echo "Detect modem QMI!" >> /tmp/_modem_detect.txt
echo " PORT: "$PORT >> /tmp/_modem_detect.txt
echo "INTERFACE: "$INTERFACE >> /tmp/_modem_detect.txt
echo " USB: "$USB >> /tmp/_modem_detect.txt
/usr/bin/logger -t modem_detect "Changing the interface name from $INTERFACE to $CONFIG_INTERFACE"
/usr/bin/logger -t modem_detect "Symlink has been created for the USB device '/dev/$USB' to '/dev/modem-$CONFIG_INTERFACE'"
/sbin/ip link set $INTERFACE down
/sbin/ip link set $INTERFACE name $CONFIG_INTERFACE
/sbin/ip link set $CONFIG_INTERFACE up
/bin/rm /dev/modem-$CONFIG_INTERFACE
/bin/ln -s /dev/$USB /dev/modem-$CONFIG_INTERFACE
/usr/bin/killall uqmi
/etc/init.d/network restart
/etc/init.d/openvpn restart
/bin/sleep 5
INTERFACE_LOGICAL=$( /sbin/uci show network | /bin/grep "/dev/modem-$CONFIG_INTERFACE" | /usr/bin/head -n 1 | /usr/bin/cut -d "." -f2 )
/usr/bin/killall uqmi
/sbin/ifup $INTERFACE_LOGICAL
fi
fi
fi
if [ "$ACTION" == "remove" ]; then
if [ -L "/dev/modem-$CONFIG_INTERFACE" ] && [ "$CONFIG_DEVICENAME" == "$PORT" ]; then
echo "" >> /tmp/_modem_detect.txt
echo "Remove modem QMI!" >> /tmp/_modem_detect.txt
echo " PORT: "$PORT >> /tmp/_modem_detect.txt
/bin/rm "/dev/modem-$CONFIG_INTERFACE"
fi
fi
done
fi
W czasie tworzenia skryptu stwierdziłem, że dobrze by było, gdyby był on bardziej uniwersalny dla różnych modemów.
Będzie mi miło, jeśli przetestujesz i powiesz czy u Ciebie coś nie działa...
1. Sprawdzanie jak widoczny jest modem w systemie
logread | grep "modem_detect"
2. Konfiguracja
CONFIGS=" \
nazwa_interfejsu_1;numer_portu_1 \
nazwa_interfejsu_2;numer_portu_2 \
nazwa_interfejsu_3;numer_portu_3 \
"
3. Interface fizyczny
4. Symlink
1. Zastanawiam się, że skrypt może niepożądanie zadziałać na modemach QMI z kilkoma interfejsami blokowymi (/dev/*)
2. Zauważyłem, że podczas restartu routera "sleep" w skrypcie działa dobrze, jeśli jest ustawiony w:
- MR3420v2 na 5 sekund
- u7621-06 na 5 sekund
- u7628-01 na 20-60 sekund
Co może być przyczyną? Może mogę jakimś działaniem policzyć wartość X sekund?