usbreset + smsd_monitoring huawei 1550 + smstools

script usbreset

usbreset -- send a USB port reset to a USB device
 *
 * Compile using: gcc -o usbreset usbreset.c
 *
 *
 * */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
	const char *filename;
	int fd;
	int rc;

	if (argc != 2) {
		fprintf(stderr, "Usage: usbreset device-filename\n");
		return 1;
	}
	filename = argv[1];

	fd = open(filename, O_WRONLY);
	if (fd < 0) {
		perror("Error opening output file");
		return 1;
	}

	printf("Resetting USB device %s\n", filename);
	rc = ioctl(fd, USBDEVFS_RESET, 0);
	if (rc < 0) {
		perror("Error in ioctl");
		return 1;
	}
	printf("Reset successful\n");

	close(fd);
	return 0;
}

 

Компилируем файл с помощью любого компилятора C (cc/gcc) командой вида gcc usbreset.c -o usbreset (установить компилятор можно командой apt-get install gcc) , получаем исполняемый файл usbreset.
Даём ему права на выполнение chmod +x usbreset.
Программа usbreset оперирует не с сетевыми интерфейсами, а с устройствами, поэтому с помощью lsusb узнаём необходимые параметры нашего модема.
Выдача lsusb содержит строки вида:
Код: [Выделить]
Bus 004 Device 002: ID 04e8:60a6 Huawey e1550
Конкретно для этого девайса запуск usbreset будет таким:
Код: [Выделить]
./usbreset /dev/bus/usb/004/002
Если есть трудности с определением устройства можно выполнить lsusb -v, которая даёт более развёрнутый ответ и посмотреть там.

И, наконец, добавим в /etc/crontab мониторинг подключения и reset модема при обрыве связи:
Спойлер: моя запись в /etc/crontab (кликните для показа/скрытия)
* * * * * root ping -c 1 8.8.8.8 || ping -c 1 213.87.1.1 || ping -c 1 212. || ./home/leo/bin/usbreset /dev/bus/usb/001/002
т.е. если не проходит пинг ни до одного из указанных ip-адресов — сбросить устройство при помощи программы usbreset.
Внимание! В /etc/network/interfaces для интерфейса модема обязательно должно быть прописано allow-hotplug eth1 (у меня он называется eth1), иначе он не будет автоматически подниматься после сброса.

если случается так что самопроизвольно меняется путь модема (например был /dev/bus/usb/001/002, а стал /dev/bus/usb/001/004), то можно сделать следующее: создать bash-скрипт, с предложенным ниже содержанием и вместо предложенной выше строчки в crontab поместить его.
Код: [Выделить]
#!/bin/bash
d1=`lsusb | grep «1076:8002» | awk ‘{print $2}’`
d2=`lsusb | grep «1076:8002» | awk ‘{print $4}’ | sed ‘s/:/\ /g’`
/bin/ping -c 1 8.8.8.8 || /bin/ping -c 1 8.8.4.4 || /var/script/usbreset /dev/bus/usb/$d1/$d2
Здесь «1076:8002» — ven dev модема, для вашего модема значение будет другим.
Естественно всё что используется в скрипте должно быть установлено. 🙂

usbreset.tar.gz

script smsd_monitoring

cat /etc/smsd_monitoring
#!/bin/bash
rm /root/buffer_sms_file
date=`date`
tail -n5 /var/log/smstools/smsd.log > /root/buffer_sms_file
cat /root/buffer_sms_file | grep "Error: Modem is not registered to the network"
if [ $? -eq 0 ]; then
        /root/usbreset /dev/bus/usb/004/$(lsusb | grep Huawei | cut -d ' ' -f 4 | tr ':' ' '| sed -e '/^$/d' | head -c 3)
#       /root/reboot_modem_soft
        /etc/init.d/smstools restart
#        tar cvfz /var/log/smstools/smsd.log /var/log/smstools/sms_erlog_$date.log
#        shutdown -rf now
        fi

cat /root/buffer_sms_file | grep "Error: registration is denied"
if [ $? -eq 0 ]; then
        /root/usbreset /dev/bus/usb/004/$(lsusb | grep Huawei | cut -d ' ' -f 4 | tr ':' ' '| sed -e '/^$/d' | head -c 3)
#       /root/reboot_modem_soft
        /etc/init.d/smstools restart
#        tar cvfz /var/log/smstools/smsd.log /var/log/smstools/sms_erlog_$date.log
#        shutdown -rf now
        fi

cat /root/buffer_sms_file | grep "Modem handler 0 terminated abnormally"
if [ $? -eq 0 ]; then
        /root/usbreset /dev/bus/usb/004/$(lsusb | grep Huawei | cut -d ' ' -f 4 | tr ':' ' '| sed -e '/^$/d' | head -c 3)
#       /root/reboot_modem_soft
        /etc/init.d/smstools restart
#        tar cvfz /var/log/smstools/smsd.log /var/log/smstools/sms_erlog_$date.log
#        shutdown -rf now
        fi

cat /root/buffer_sms_file | grep "write_to_modem: error 5: Input/output error"
if [ $? -eq 0 ]; then
        /root/usbreset /dev/bus/usb/004/$(lsusb | grep Huawei | cut -d ' ' -f 4 | tr ':' ' '| sed -e '/^$/d' | head -c 3)
#       /root/reboot_modem_soft
        /etc/init.d/smstools restart
#        tar cvfz /var/log/smstools/smsd.log /var/log/smstools/sms_erlog_$date.log
#        shutdown -rf now
        fi

cat /root/buffer_sms_file | grep "Couldn't open serial port"
if [ $? -eq 0 ]; then
        /root/usbreset /dev/bus/usb/004/$(lsusb | grep Huawei | cut -d ' ' -f 4 | tr ':' ' '| sed -e '/^$/d' | head -c 3)
#       /root/reboot_modem_soft
        /etc/init.d/smstools restart
#        tar cvfz /var/log/smstools/smsd.log /var/log/smstools/sms_erlog_$date.log
#        shutdown -rf now
        fi

 

Спасибо 1
Спасибо2

  1. Пока комментариев нет.

  1. Пока что обратных ссылок нет.