#!/bin/sh
#
# Watchdog: keep the Internet up and running.
#
# Phil Chadwick. 2015-11-18.
#
# $Revision: 1.15 $
# For use in root's crontab like this:
# */10 * * * * /etc/firewall/internet_watchdog
PATH="/bin:/usr/bin:/sbin:/usr/sbin"
export PATH
INTERNET_NIC=tun0 # The Internet link interface (e.g. ppp0)
MINUPSECS=1800 # Don't reboot unless uptime > MINUPSECS
REDIALWAIT=240 # Allow this many seconds to re-make the connection
SHUTMESSAGE="Rebooting to restart Internet"
# Ping targets (несвязанный список общедоступных хостов, которые отвечают на ping)
PT1=192.231.203.132 # resolv.internode.on.net
PT2=195.122.30.54 # google.com.au
PT3=104.25.239.31 # www.ozspeedtest.com
PT4=204.79.197.219 # bing.com.au
PING_TARGETS="$PT1 $PT2 $PT3 $PT4"
# Syslog configuration
LOGTAG=$(basename $0)
LOGPRI='local0.notice'
# See if we can ping anything on the Internet...
pingtest()
{
for host in $PING_TARGETS
do
#debian#ping -q -n -c 1 -w10 $host >/dev/null 2>&1 && return 0
#freebsd#ping -q -n -c 1 -t10 $host >/dev/null 2>&1 && return 0
ping -q -n -c 1 -t10 $host >/dev/null 2>&1 && return 0
done
return 1
}
# Return uptime in seconds. Tested on FreeBSD 13.0 only. YMMV.
getuptime()
{
uptime=${1:-$(uptime)}
days=0
hours=0
minutes=0
seconds=0
echo "$uptime" | grep -q " day" &&
days=$(echo "$uptime" | sed -e 's/.*up \([1-9][0-9]*\) day.*/\1/')
if echo "$uptime" | grep -q "up.* [0-9][0-9]*:[0-9][0-9]*,"
then
hours=$(echo "$uptime" | sed -e 's/.*up.* \([0-9][0-9]*\):.*/\1/')
minutes=$(echo "$uptime" | sed -e 's/.*up.*:\([0-9][0-9]*\),.*/\1/')
seconds=0
else
echo "$uptime" | grep -q " hrs*" &&
hours=$(echo "$uptime" | sed -e 's/.*up.* \([0-9]*\) hr.*/\1/')
echo "$uptime" | grep -q " mins*" &&
minutes=$(echo "$uptime" | sed -e 's/.*up.* \([0-9]*\) min.*/\1/')
echo "$uptime" | grep -q " secs*" &&
seconds=$(echo "$uptime" | sed -e 's/.*up.* \([0-9]*\) sec.*/\1/')
fi
upseconds=$(((((((($days*24)+$hours)*60)+$minutes)*60)+$seconds)))
echo $upseconds
}
# # pppd иногда выполняет атомарный повторный набор после того, как получает сообщение о зависании.
# Итак, если кажется, что ссылка недоступна, мы должны дать ей время вернуться.
n=0
while [ $n -lt $REDIALWAIT ]
do
ifconfig $INTERNET_NIC 2>/dev/null | grep -q "UP[ ,].*RUNNING"
[ $? -eq 0 ] && pingtest && exit 0
sleep 1
n=$((n+1))
done
# Похоже, интернет-соединение действительно не работает...
# Ниже приведен ряд сложных вопросов, связанных со сроками, которые необходимо решить.
# # Возможно, ваш интернет-провайдер вешает трубку каждый раз, когда мы звоним, из-за превышения квоты.
# # Итак, проверьте время безотказной работы и ничего не делайте, пока не истечет несколько минут.
# Кроме того, запуск и остановка ppp асинхронны, поэтому pppd умирает целую вечность,
# и вы должны дождаться, пока он погаснет, прежде чем перезапускать его; кроме того, мы не хотим
# перейдите в (быстрый) непрерывный цикл перезагрузки (следовательно, 15-минутное ожидание).
# Установите минимальную задержку перезагрузки, чтобы остановить цикл быстрой перезагрузки
#debian#upseconds=$(cut -d. -f1 </proc/uptime)
#freebsd#upseconds=$(getuptime)
upseconds=$(getuptime)
[ "$upseconds" -gt $MINUPSECS ] || exit 0
# Выход из системы, если мы уже запустили последовательность завершения работы.
if [ -f /run/systemd/shutdown/scheduled ]
then
cat /run/systemd/shutdown/scheduled
else
#debian#ps -lef | grep shutdown
#freebsd#ps auxw | grep shutdown
ps auxw | grep shutdown
fi | grep -q "$SHUTMESSAGE" && exit 0
# We are now committed to a reboot (unless somebody intervenes manually).
logger -p "$LOGPRI" -t "$LOGTAG" "Internet not running"
service internet stop >/dev/null 2>&1
logger -p "$LOGPRI" -t "$LOGTAG" "Cowardly rebooting to re-start Internet"
shutdown -r +15 "$SHUTMESSAGE"
👀 12