четверг, 23 января 2014 г.

Решаем проблему подвисания модема E353 в Linux RH Enterprise

   Данный модем был подключен к серверу с ОС Oracle Linux Server release 6.2 с целью рассылки SMS оповещений от системы мониторинга Zabbix через SMS Server Tools. К сожалению, это решение из-за частых отказов USB модема Huawei Technologies E353 не может пока претендовать на роль гарантированного оповещателя, но тем не менее можно постараться приладить костыли из самого Zabbix и делать реинициализацию им.


   Примерно, механизм ставящий в ступор устройство одинаков и для Siemens M35i - это происходит при получении серии входящих SMS сообщений, но если для Siemens достаточно зайти на него терминалом и почистить, то для Huawei приходится вынимать его из порта USB, что является затратным по времени, особенно если серверная находится далеко.
   Для решения данной проблемы было принято посылать адресный сигнал RESET по USB шине к устройству, что равнозначно его физическом удалению и повторной установке в тот же самый USB порт.
   Но одной переиницализации по USB недостаточно, необходимо провести выгрузку из памяти SMS Server Tools, затем выгрузить драйвер модема из kernel окружения, загрузить обратно и запустить сервер SMS.
   Приведу скрипт для автоматизированной перезагрузки USB модема:


#!/bin/bash
 
idVendor="12d1"
idProduct="1506"
resetusb=/root/usb_reset/usbreset
 
if [ x`/usr/sbin/lsusb | /bin/grep ${idVendor}:${idProduct}` = x ]
   then
   echo "WARNING!"
   echo "Not found a Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard"
   exit 0
fi
 
USBAddress=`/usr/sbin/lsusb | /bin/grep ${idVendor}:${idProduct} | 
            /bin/awk '{print "/dev/bus/usb/"$2"/"$4}' | /usr/bin/tr -d [=:=]`
echo "Send RESET to USBDEVFS ${USBAddress} for ID ${idVendor}:${idProduct} Huawei Technologies Co., Ltd. E398"
${resetusb} ${USBAddress}
sleep 3
echo "Stoping SMS3 daemon ..."
/etc/init.d/sms3 stop
sleep 5
echo "Show kernel modules in memory:"
/sbin/lsmod | /bin/grep option
sleep 5
echo "Unload USB E353 modem driver.."
echo "   unload option driver"
/sbin/rmmod -v option
sleep 3
echo "   unload usbserial module"
/sbin/rmmod -v usbserial
sleep 3
echo "Load module option (auto loaded usbserial module)"
/sbin/modprobe -v option
sleep 3
echo "Show kernel modules in memory:"
/sbin/lsmod | /bin/grep option
sleep 5
echo "Write magic idVendor:idProduct to driver setting"
echo "${idVendor} ${idProduct}" > /sys/bus/usb-serial/drivers/option1/new_id
/usr/sbin/lsusb | /bin/grep ${idVendor}:${idProduct}
echo
echo "Restarting SMS-tools daemon:"
sleep 3
echo "Starting SMS3 daemon ..."
/etc/init.d/sms3 start
sleep 2
echo
echo "Send SMS with sendsms command and check result."
echo

   Краткие комментарии к скрипту:
  • Для начала, надо в выводе /usr/sbin/lsusb определить ID установленного модема, точнее пару IdVendor и IdProduct.
    Bus 002 Device 003: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/NetworkcardЭти значения прописать вместо текущих 12d1:1506 в данном скрипте. 
  • Собрать программу usbreset, код приведен будет в конце данной статьи, оригинал откуда она была взята тут.
   Как можно автоматизировать запуск скрипта. Пока я предполагаю, что посредством Zabbix или через cron следить за /var/spool/sms/checked и /var/spool/sms/fail и если в директории checked долго, положим минут пять, не уходит очередь или происходит накопление сообщений в директории fail, то считать такое состояние проблемой и выполнить переинициализацию устройства. При этом не отправленные файлы можно по-новой переместить в директорию /var/spool/sms/outgoing для повторной отправки.

Как и обещал - привожу код программы usbreset:


Сборка стандартно, командой:
gcc usbreset.c -o usbreset
chmod +x usbreset

./usbreset /dev/bus/usb/${Bus}/${Device}

Например:
sudo ./usbreset /dev/bus/usb/002/003

Мои настройки smsd.conf:




Комментариев нет: