summaryrefslogtreecommitdiffstats
path: root/modules/freifunk/root/usr/sbin/ff_olsr_test_gw
blob: 5c47b498dbd47165373e264c1779200968c14966 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/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 ucisec = "ff_olsr_test_gw"
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", ucisec, "noinet_count"))
		if not THRESHOLD or (count and count >= THRESHOLD) then
			sys.call(ROUTECMD % droute.gateway:string())
		else
			if not count then
				uci:set("olsrd", ucisec, "state")
			end
			uci:set("olsrd", ucisec, "noinet_count", (count or 0) + 1)
			uci:save("olsrd")
		end
	else
		uci:revert("olsrd", ucisec)
	end
end