Сторожевой пес Интернета

#!/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"

 

Довольны?
[Оценок: 0 средняя: 0]