diff options
author | Manuel Munz <freifunk@somakoma.de> | 2013-01-19 18:05:17 +0000 |
---|---|---|
committer | Manuel Munz <freifunk@somakoma.de> | 2013-01-19 18:05:17 +0000 |
commit | b59375ccc5e9a2d09e454d46a705dd30778eb882 (patch) | |
tree | b8cf86e8b8116ca7a8ddc9412c2d3c67e0833218 /contrib | |
parent | 4fec63df9e4a52ae8bb21b4cac87728ce073554f (diff) |
contrib/freifunk-gwcheck: Fix multiple problems with the gwcheck script: Exit when already running, fix problem not being able to connect when there is no default gateway left in the main table, also add custom ip rules for wan gateways
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/package/freifunk-gwcheck/Makefile | 2 | ||||
-rwxr-xr-x | contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh | 58 |
2 files changed, 54 insertions, 6 deletions
diff --git a/contrib/package/freifunk-gwcheck/Makefile b/contrib/package/freifunk-gwcheck/Makefile index 1563b0cb3..fe55e6963 100644 --- a/contrib/package/freifunk-gwcheck/Makefile +++ b/contrib/package/freifunk-gwcheck/Makefile @@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=freifunk-gwcheck -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 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 a622a4fc4..f53dd02d7 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,5 +1,14 @@ #!/bin/sh +. /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 @@ -52,31 +61,70 @@ check_internet() { done } +resolve() { + echo "$(nslookup $1 2>/dev/null |grep 'Address' |grep -v '127.0.0.1' |awk '{ print $3 }')" +} + +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. + + dns="" + if [ -x /bin/ubus ]; then + network_get_dnsserver dns wan + else + dns="$(grep network.wan.resolv_dns /var/state/network | cut -d "=" -f 2)" + 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 + 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 - iptables -t mangle -D OUTPUT -d $host -p tcp --dport 80 -j MARK --set-mark 0x2 + 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)" 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 + if [ -z "$(ip ru s | grep gw-check)" -a -n "$defroutemain" ]; then ip rule add fwmark 0x2 lookup gw-check - for host in $testserver; do - iptables -t mangle -I OUTPUT -d $host -p tcp --dport 80 -j MARK --set-mark 0x2 - done ip r a $defroutemain table gw-check ip r d $defroutemain - logger -t gw-check "Internet is not available, deactivating the default route ( $defroutemain)" fi + for host in $testserver; do + ips="$(resolve $host)" + for ip in $ips; do + [ -z "$(ip ru s | grep "to $ip lookup gw-check")" ] && ip rule add to $ip table gw-check + done + done + get_dnsservers + 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)" fi |