From c9525b9b2261a9e9b5c15525b1f3b485ec72a943 Mon Sep 17 00:00:00 2001 From: Manuel Munz Date: Sat, 19 Jan 2013 20:32:06 +0000 Subject: [PATCH] contrib/freifunk-gwcheck: check which interface is wan when we get the upstream dns servers, add priorities to logger calls, check for dyngw_plain plugin before checking if script already runs, add license/copyright --- .../files/usr/sbin/ff_olsr_test_gw.sh | 64 ++++++++----------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh b/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh index f53dd02d77..a85ead3ce6 100755 --- a/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh +++ b/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh @@ -1,28 +1,28 @@ #!/bin/sh +# Copyright 2013 Manuel Munz +# 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 -- 2.30.2