2 # Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
3 # Licensed under the GNU General Public License (GPL) v3
4 # This script monitors the local internet gateway
6 . /lib/functions/network.sh
8 # exit if dyngw_plain is not installed or enabled
9 dgwlib=`uci show olsrd |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
10 if [ -n "$dgwlib" ]; then
11 if [ "$(uci -q get $dgwlib.ignore)" == 1 ]; then
18 #Exit if this script is already running
19 pid="$(pidof ff_olsr_test_gw.sh)"
20 if [ ${#pid} -gt 5 ]; then
21 logger -p debug -t gwcheck "Gateway check script is already running, exit now"
25 # exit if there is no defaultroute with metric=0 in main or gw-check table.
26 defroutemain="$(ip r s |grep default |grep -v metric)"
27 defroutegwcheck="$(ip r s t gw-check |grep default |grep -v metric)"
28 if [ -z "$defroutegwcheck" -a -z "$defroutemain" ]; then
32 # get and shuffle list of testservers
33 testserver="$(uci -q get freifunk-gwcheck.hosts.host)"
34 [ -z "$testserver" ] && echo "No testservers found, exit" && exit
36 testserver="$(for t in $testserver; do echo $t; done | awk 'BEGIN {
44 for (i = 1; i <= NR; i++) {
45 n = int(rand() * (NR - i + 1)) + i;
52 for t in $testserver; do
54 test=$(wget -q http://$t/conntest.html -O -| grep "Internet_works")
55 if [ "$test" == "Internet_works" ]; then
59 logger -p debug -t gw-check "Could not fetch http://$t/conntest.html"
65 echo "$(nslookup $1 2>/dev/null |grep 'Address' |grep -v '127.0.0.1' |awk '{ print $3 }')"
69 # this gets all dns servers for the interface which has the default route
72 if [ ! -x /bin/ubus ]; then
73 # ubus not present (versions before Attitude): fallback to get these from /var/state/network.
74 # We always assume that wan is the default route interface here
75 dns="$(grep network.wan.resolv_dns /var/state/network | cut -d "=" -f 2)"
78 network_get_dnsserver dns $wan
84 if [ "$iw" == 0 ]; then
85 # Internet available again, restore default route and remove ip rules
86 if [ -n "$defroutegwcheck" ]; then
87 ip r a $defroutegwcheck
88 ip r d $defroutegwcheck t gw-check
89 for host in $testserver; do
90 ips="$(resolve $host)"
92 [ -n "$(ip ru s | grep "to $ip lookup gw-check")" ] && ip rule del to $ip table gw-check
97 [ -n "$(ip ru s | grep "to $d lookup gw-check")" ] && ip rule del to $d table gw-check
99 logger -p err -t gw-check "Internet is available again, default route restored ( $defroutegwcheck)"
103 # Check failed. Move default route to table gw-check and setup ip rules.
104 if [ -z "$(ip ru s | grep gw-check)" -a -n "$defroutemain" ]; then
105 ip r a $defroutemain table gw-check
107 logger -p err -t gw-check "Internet is not available, default route deactivated ( $defroutemain)"
109 for host in $testserver; do
110 ips="$(resolve $host)"
112 [ -z "$(ip ru s | grep "to $ip lookup gw-check")" ] && ip rule add to $ip table gw-check
117 [ -z "$(ip ru s | grep "to $d lookup gw-check")" ] && ip rule add to $d table gw-check
119 logger -p err -t gw-check "Check your internet connection!"