Автоматическая перезагрузка OpenWRT роутера при отсутствии интернета N секунд

Зайчатки разума

Записная книжка айтишника

Автоматическая перезагрузка OpenWRT роутера при отсутствии интернета N секунд

2019-10-13 23:15:08 — Evgeniy Shumilov

  У меня дома подключен интернет от 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

comments powered by Disqus