contrib/freifunk-gwcheck: check which interface is wan when we get the upstream dns...
authorManuel Munz <freifunk@somakoma.de>
Sat, 19 Jan 2013 20:32:06 +0000 (20:32 +0000)
committerManuel Munz <freifunk@somakoma.de>
Sat, 19 Jan 2013 20:32:06 +0000 (20:32 +0000)
contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh

index f53dd02d776eb3c7bbb71ac1127e0b84afefd279..a85ead3ce6aa0daae14fc577cfbb8102aaa13105 100755 (executable)
@@ -1,28 +1,28 @@
 #!/bin/sh
+# Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
+# Licensed under the GNU General Public License (GPL) v3
+# This script monitors the local internet gateway
 
 . /lib/functions/network.sh
 
-#Exit if this script is already running
-pid="$(pidof ff_olsr_test_gw.sh)"
-if [ ${#pid} -gt 5 ]; then
-       logger -t gwcheck "Gateway check script is already running, exit now"
-       exit 1
-fi
-
-#check if dyngw_plain is installed and enabled, else exit
-dyngwplainlib=`uci show olsrd |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
-if [ -n "$dyngwplainlib" ]; then
-       if [ "$(uci -q get $dyngwplainlib.ignore)" == 1 ]; then
+# exit if dyngw_plain is not installed or enabled
+dgwlib=`uci show olsrd |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
+if [ -n "$dgwlib" ]; then
+       if [ "$(uci -q get $dgwlib.ignore)" == 1 ]; then
                exit 1
        fi
 else
-       echo "dyngw_plain not found in olsrd config, exit"
        exit 1
 fi
 
+#Exit if this script is already running
+pid="$(pidof ff_olsr_test_gw.sh)"
+if [ ${#pid} -gt 5 ]; then
+       logger -p debug -t gwcheck "Gateway check script is already running, exit now"
+       exit 1
+fi
 
-# check if we have a defaultroute with metric=0 in one of these tables: main table and gw-check table.
-# If not exit here.
+# exit if there is no defaultroute with metric=0 in main or gw-check table.
 defroutemain="$(ip r s |grep default |grep -v metric)"
 defroutegwcheck="$(ip r s t gw-check |grep default |grep -v metric)"
 if [ -z "$defroutegwcheck" -a -z "$defroutemain" ]; then
@@ -56,7 +56,7 @@ check_internet() {
                        echo 0
                        break
                else
-                       logger -t gw-check "Could not get test file from http://$t/conntest.html"
+                       logger -p debug -t gw-check "Could not fetch http://$t/conntest.html"
                fi
        done
 }
@@ -66,54 +66,45 @@ resolve() {
 }
 
 get_dnsservers() {
-       # this gets all dns servers for the wan interface. If ubus is not present (like on older
-       # openwrt versions before Attitude fallback to get these from /var/state/network.
+       # this gets all dns servers for the interface which has the default route
 
        dns=""
-       if [ -x /bin/ubus ]; then
-               network_get_dnsserver dns wan
-       else
+       if [ -x /bin/ubus ]; then
+               # ubus not present (versions before Attitude): fallback to get these from /var/state/network.
+               # We always assume that wan is the default route interface here
                dns="$(grep network.wan.resolv_dns /var/state/network | cut -d "=" -f 2)"
+       else
+               network_find_wan wan
+               network_get_dnsserver dns $wan
        fi
 }
 
 iw=$(check_internet)
 
-
 if [ "$iw" == 0 ]; then
-       # check if we have a seperate routing table for our tests.
-       # If yes, move defaultroute to normal table and delete table gw-check
-       # Also delete ip rules to use table gw-check for our testhosts and wan dns servers
-       
+       # Internet available again, restore default route and remove ip rules
        if [ -n "$defroutegwcheck" ]; then
                ip r a $defroutegwcheck
                ip r d $defroutegwcheck t gw-check
-               ip ru del fwmark 0x2 lookup gw-check
                for host in $testserver; do
                        ips="$(resolve $host)"
                        for ip in $ips; do
                                [ -n "$(ip ru s | grep "to $ip lookup gw-check")" ] && ip rule del to $ip table gw-check
                        done
                done
-
                get_dnsservers
                for d in $dns; do
                        [ -n "$(ip ru s | grep "to $d lookup gw-check")" ] && ip rule del to $d table gw-check
                done
-
-               #ip r d default via 127.0.0.1 metric 100000
-               logger -t gw-check "Internet is available again, restoring default route ( $defroutegwcheck)"
+               logger -p err -t gw-check "Internet is available again, default route restored ( $defroutegwcheck)"
        fi
 
 else
-       # Check failed. If we have a defaultroute with metric=0 and it is already in table gw-check then do nothing.
-       # If there is a defaultroute with metric=0 then remove it from the main routing table and add to table gw-check.
-       # Also setup ip rules to use table gw-check for our testhosts and wan dns servers
-
+       # Check failed. Move default route to table gw-check and setup ip rules.
        if [ -z "$(ip ru s | grep gw-check)" -a -n "$defroutemain" ]; then
-               ip rule add fwmark 0x2 lookup gw-check
                ip r a $defroutemain table gw-check
                ip r d $defroutemain
+               logger -p err -t gw-check "Internet is not available, default route deactivated ( $defroutemain)"
        fi
        for host in $testserver; do
                ips="$(resolve $host)"
@@ -125,6 +116,5 @@ else
        for d in $dns; do
                [ -z "$(ip ru s | grep "to $d lookup gw-check")" ] && ip rule add to $d table gw-check
        done
-       #ip r a default via 127.0.0.1 metric 100000
-       logger -t gw-check "Internet is not available, deactivating the default route ( $defroutemain)"
+       logger -p err -t gw-check "Check your internet connection!"
 fi