contrib/freifunk-gwcheck: check which interface is wan when we get the upstream dns...
[project/luci.git] / contrib / package / freifunk-gwcheck / files / usr / sbin / ff_olsr_test_gw.sh
1 #!/bin/sh
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
5
6 . /lib/functions/network.sh
7
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
12                 exit 1
13         fi
14 else
15         exit 1
16 fi
17
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"
22         exit 1
23 fi
24
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
29         exit 1
30 fi
31
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
35
36 testserver="$(for t in $testserver; do echo $t; done | awk 'BEGIN {
37         srand();
38 }
39 {
40         l[NR] = $0;
41 }
42
43 END {
44         for (i = 1; i <= NR; i++) {
45                 n = int(rand() * (NR - i + 1)) + i;
46                 print l[n];
47                 l[n] = l[i];
48         }
49 }')"
50
51 check_internet() {
52         for t in $testserver; do
53                 local test
54                 test=$(wget -q http://$t/conntest.html -O -| grep "Internet_works")
55                 if [ "$test" == "Internet_works" ]; then
56                         echo 0
57                         break
58                 else
59                         logger -p debug -t gw-check "Could not fetch http://$t/conntest.html"
60                 fi
61         done
62 }
63
64 resolve() {
65         echo "$(nslookup $1 2>/dev/null |grep 'Address' |grep -v '127.0.0.1' |awk '{ print $3 }')"
66 }
67
68 get_dnsservers() {
69         # this gets all dns servers for the interface which has the default route
70
71         dns=""
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)"
76         else
77                 network_find_wan wan
78                 network_get_dnsserver dns $wan
79         fi
80 }
81
82 iw=$(check_internet)
83
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)"
91                         for ip in $ips; do
92                                 [ -n "$(ip ru s | grep "to $ip lookup gw-check")" ] && ip rule del to $ip table gw-check
93                         done
94                 done
95                 get_dnsservers
96                 for d in $dns; do
97                         [ -n "$(ip ru s | grep "to $d lookup gw-check")" ] && ip rule del to $d table gw-check
98                 done
99                 logger -p err -t gw-check "Internet is available again, default route restored ( $defroutegwcheck)"
100         fi
101
102 else
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
106                 ip r d $defroutemain
107                 logger -p err -t gw-check "Internet is not available, default route deactivated ( $defroutemain)"
108         fi
109         for host in $testserver; do
110                 ips="$(resolve $host)"
111                 for ip in $ips; do
112                         [ -z "$(ip ru s | grep "to $ip lookup gw-check")" ] && ip rule add to $ip table gw-check
113                 done
114         done
115         get_dnsservers
116         for d in $dns; do
117                 [ -z "$(ip ru s | grep "to $d lookup gw-check")" ] && ip rule add to $d table gw-check
118         done
119         logger -p err -t gw-check "Check your internet connection!"
120 fi