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