Сторожевой таймер для 4G-модема.
Это небольшое дополнение к моей статье на Habrahabr.
- переписал скрип, добавив возможность читать параметры из конфигурационного файла,
- добавил возможность записи в лог событий, о перезагрузке модема,
- добавил сервис и таймер для systemd.
Создадим скрипт
vi /usr/local/bin/lte_watchdog.sh
#!/bin/bash
#
export PATH="$PATH:/usr/sbin:/usr/bin"
SN="$(basename "$0")"
#
function print_help() {
printf "\n"
printf "Использование: %s options...\n" "$SN"
printf "Параметры:\n"
printf " -c Конфигурационный файл.\n"
printf " -l Лог файл.\n"
printf " -h Справка.\n"
printf "\n"
}
# Если скрипт запущен без аргументов, открываем справку.
if [[ $# = 0 ]]; then
print_help && exit 1
fi
while getopts ":c:l:h" opt ;
do
case $opt in
c) CONF=$OPTARG;
;;
l) LOG=$OPTARG;
;;
h) print_help
exit 1
;;
*) printf "Неправильный параметр\n";
printf "Для вызова справки запустите %s -h\n" "$SN";
exit 1
;;
esac
done
if [[ "$CONF" == "" ]] || [[ "$LOG" == "" ]] ; then
printf "\n"
printf "Одна или несколько опций не указаны.\n"
printf "Для справки наберите: %s -h\n" "$SN"
printf "\n"
exit 1
fi
source "$CONF"
M="$(lsusb | grep -w "$MM")" #строка модема из lsusb
if [[ "$M" != "" ]]; then #если модем выбран, можно проверять пинги
if grep -w -q "$IF" /proc/net/dev; then #проверяем наличие сетевого интерфейса
printf "\n"
printf "Проверка доступности %s через интерфейс %s\n" "$SITE" "$IF"
printf "\n"
if [[ "$EP" -ge 6 ]]; then
printf "Число ошибочных пингов должно быть меньше или равно 5\n"
exit 1
else
printf "Делаем пинги...\n"
flag="0"
for i in {1..5}; do #делаем 5 пингов до сервера
timeout -k 2 -s TERM 16 ping -w 14 -s 8 -c 1 -I "$IF" "$SITE" || flag=$((flag+1)) && printf "пинг:%s/5 (ошибок:%s)\n" "$i" "$flag" #пинг не прошел - инкрементируем счетчик
if (("$flag" >= "$EP")); then
break
else
read -r -t 1 > /dev/null
fi
done
printf "потерь пакетов: %s из %s\n" "$flag" "$i"
printf "\n"
if (("$flag" >= "$EP")); then #если потерь пакетов больше 2х
M="$(lsusb | grep "$MM")" #на всякий случай снова глянем - вдруг модем выдернули
printf "Будет сброшен модем:\n"
printf "%s\n" "$M" | cut -c 34-
printf "%s %s: потерь пакетов: %s из %s, модем %s %s будет перезагружен.\n" "$(date +"%b %d %T")" "$SN" "$flag" "$i" "$MM" "$(printf "$M" | cut -c -32)" >> "$LOG"
if ! [[ -d /sys/bus/usb/drivers/usb/"$DEV" ]]; then
printf "Неверно указаны Bus и Port модема.\n"
exit 1
else
ifdown "$IF" #деактивируем интерфейс
printf "%s" "$DEV" > "/sys/bus/usb/drivers/usb/unbind" && #деактивируем модем
read -r -t 1 > /dev/null #ждем секунду
printf "%s" "$DEV" > "/sys/bus/usb/drivers/usb/bind" #активируем модем
ifup "$IF" #активируем интерфейс
fi
fi
fi
else
printf "\n"
printf "Интерфейс %s не существует\n" "$IF"
printf "\n"
exit 1
fi
else
printf "Модем %s не найден.\n" "$MM"
fi
chmod +x /usr/local/bin/lte_watchdog.sh
Создадим конфигурационный файл
vi /etc/lte_watchdog.conf
# Ресурс, в сети интернет, доступность которого будем проверять.
SITE=ya.ru
# Интерфейс модема.
IF=wwp6s0u2i1
# Шина и порт, на котором определился USB модем (lsusb -t).
DEV=1-1
# Количество неудачных попыток, после которых перезагружаем модем.
EP=3
# Уникальный идентификатор модема.
MM=Huawei
Создадим systemd сервис и таймер для скрипта.
vi /etc/systemd/system/lte_watchdog.service
[Unit]
Description=LTE USB modem watchdog service
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/lte_watchdog.sh -c /etc/lte_watchdog.conf -l /var/log/lte_watchdog.log
vi /etc/systemd/system/lte_watchdog.timer
[Unit]
Description=LTE USB modem watchdog timer
[Timer]
OnCalendar=*-*-* *:05:00
Persistent=true
[Install]
WantedBy=timers.target
Активируем таймер
systemctl enable lte_watchdog.timer
systemctl enable lte_watchdog.timer