Автоматическая перезагрузка OpenWRT роутера при отсутствии интернета N секунд
У меня дома подключен интернет от Beeline, но периодически с ним возникают проблемы. Что тому виной - не могу понять. Периодически коннект разрывается, роутеру выдаётся по DHCP новый IP адрес, l2tp отрабатывает, получает свой адрес, но до шлюза через l2tp интерфейс пакеты идут только в одну сторону. Обратно приходит порядка 60 байт чего-то (не успел поймать), затем тишина. Решил написать небольшой простой скрипт, который будет проверять интернет и если его нет более 5ти минут, будет перезагружать роутер.
Скрипт я положил в /opt/inenchecker и выдал права на исполнение (chmod +x /opt/inetchecker):
#!/bin/sh
# Rebooting router if internet connection disappeared %limit% seconds ago
limit=300
checkcount=2
checkaddress='8.8.8.8'
d='/tmp/disconnected'
if ! ping -c "$checkcount" "$checkaddress"; then
if [ -f "$d" ]; then
dtime=`cat "$d"`
diff=$(( `date +%s` - $dtime ))
if [ "$diff" -gt "$limit" ]; then
echo "Last internet connection: $(date -d @"$dtime" "+%F %T"), $diff second ago, rebooting..."
reboot
fi
else
echo "Internet connection failed, saving timestamp"
date +%s > "$d"
fi
else
if [ -f "$d" ]; then
rm $d
fi
fi
В данном скрипте limit - это ограничение в секундах, т.е. в данном случае 5 минут, checkaddress - адрес, на который будет уходить пинг, а checkcount - количество icmp пакетов пинга. В случае, если пинг не прошел, в /tmp создаётся файл с таймстемпом. Если при повторном запуске выяснилось, что соединение восстановилось и пинг проходит, а текущий таймстемп отличается менее, чем на limit, файл с таймстемпом удаляется. Если таймстемп был позднее, чем limit секунд назад, роутер будет перезагружен. Скрипт прописан в кроне (crontab -e):
* * * * * /opt/inetchecker
Быстро, просто, работает.
Теги: shell, networking, openwrt