Add OLSR dyn_gw_plain gateway test
authorSteven Barth <steven@midlink.org>
Fri, 30 Jan 2009 16:00:09 +0000 (16:00 +0000)
committerSteven Barth <steven@midlink.org>
Fri, 30 Jan 2009 16:00:09 +0000 (16:00 +0000)
modules/freifunk/root/usr/sbin/ff_olsr_test_gw [new file with mode: 0755]

diff --git a/modules/freifunk/root/usr/sbin/ff_olsr_test_gw b/modules/freifunk/root/usr/sbin/ff_olsr_test_gw
new file mode 100755 (executable)
index 0000000..dda6a5e
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/lua                      
+local STRICT = true -- Only delete metric 0 routes
+local PINGCMD = "ping -q -I%s -c3 -w3 '%s' >/dev/null 2>&1"
+local PINGTRG = {"google.de", "www.de.debian.org", "eu.kernel.org", "freifunk.net"}
+local ROUTECMD = "route del default gw '%s' >/dev/null 2>&1"                       
+local THRESHOLD = 3 -- Maximum number of failed tests before dropping the route    
+local sys = require "luci.sys"
+local uci = require "luci.model.uci".cursor_state()
+local section = nil                                
+uci:foreach("olsrd", "LoadPlugin", function(s)
+        if s.library == "olsrd_dyn_gw_plain.so.0.4" and s.ignore ~= "1" then
+                section = s[".name"]
+        end
+end)
+local droute = sys.net.defaultroute()
+if section and droute then      -- dyn_gw is enabled and we have a defaultroute, test it
+        local state = false
+        for _, host in ipairs(PINGTRG) do
+                state = state or (sys.call(PINGCMD % {droute.device, host}) == 0)
+        end
+        if not state and (not STRICT or tonumber(droute.metric) == 0) then
+                local count = tonumber(uci:get("olsrd", section, "noinet_count"))
+                if not THRESHOLD or (count and count > THRESHOLD) then
+                        sys.call(ROUTECMD % droute.gateway:string())
+                else
+                        uci:set("olsrd", section, "noinet_count", (count or 0) + 1)
+                end
+        else
+                uci:set("olsrd", section, "noinet_count", "0")
+        end
+        uci:save("olsrd")
+end
\ No newline at end of file