#!/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