1 -- ------ extra functions ------ --
3 function interfaceCheck()
4 metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".metric"))
5 if metricValue == "" then -- no metric
7 else -- if metric exists create list of interface metrics to compare against for duplicates
8 uci.cursor():foreach("mwan3", "interface",
10 local metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. section[".name"] .. ".metric"))
11 metricList = metricList .. section[".name"] .. " " .. metricValue .. "\n"
14 -- compare metric against list
15 local metricDuplicateNumbers, metricDuplicates = sys.exec("echo '" .. metricList .. "' | awk '{print $2}' | uniq -d"), ""
16 for line in metricDuplicateNumbers:gmatch("[^\r\n]+") do
17 metricDuplicates = sys.exec("echo '" .. metricList .. "' | grep '" .. line .. "' | awk '{print $1}'")
18 errorDuplicateMetricList = errorDuplicateMetricList .. metricDuplicates
20 if sys.exec("echo '" .. errorDuplicateMetricList .. "' | grep -w " .. arg[1]) ~= "" then
21 errorDuplicateMetric = 1
24 -- check if this interface has a higher reliability requirement than track IPs configured
25 local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci -p /var/state get mwan3." .. arg[1] .. ".track_ip) | wc -w")))
26 if trackingNumber > 0 then
27 local reliabilityNumber = tonumber(ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".reliability")))
28 if reliabilityNumber and reliabilityNumber > trackingNumber then
32 -- check if any interfaces are not properly configured in /etc/config/network or have no default route in main routing table
33 if ut.trim(sys.exec("uci -p /var/state get network." .. arg[1])) == "interface" then
34 local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".ifname"))
35 if interfaceDevice == "uci: Entry not found" or interfaceDevice == "" then
39 local routeCheck = ut.trim(sys.exec("route -n | awk '{if ($8 == \"" .. interfaceDevice .. "\" && $1 == \"0.0.0.0\" && $3 == \"0.0.0.0\") print $1}'"))
40 if routeCheck == "" then
50 function interfaceWarnings() -- display warning messages at the top of the page
51 local warns, lineBreak = "", ""
52 if errorReliability == 1 then
53 warns = "<font color=\"ff0000\"><strong>" .. translate("WARNING: this interface has a higher reliability requirement than there are tracking IP addresses!") .. "</strong></font>"
54 lineBreak = "<br /><br />"
56 if errorRoute == 1 then
57 warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>" .. translate("WARNING: this interface has no default route in the main routing table!") .. "</strong></font>"
58 lineBreak = "<br /><br />"
60 if errorNetConfig == 1 then
61 warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>" .. translate("WARNING: this interface is configured incorrectly or not at all in /etc/config/network!") .. "</strong></font>"
62 lineBreak = "<br /><br />"
64 if errorNoMetric == 1 then
65 warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>" .. translate("WARNING: this interface has no metric configured in /etc/config/network!") .. "</strong></font>"
66 elseif errorDuplicateMetric == 1 then
67 warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>" .. translate("WARNING: this and other interfaces have duplicate metrics configured in /etc/config/network!") .. "</strong></font>"
72 -- ------ interface configuration ------ --
74 dsp = require "luci.dispatcher"
75 sys = require "luci.sys"
76 ut = require "luci.util"
81 errorDuplicateMetricList = ""
83 errorDuplicateMetric = 0
90 m5 = Map("mwan3", translatef("MWAN Interface Configuration - %s", arg[1]),
92 m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "interface")
95 mwan_interface = m5:section(NamedSection, arg[1], "interface", "")
96 mwan_interface.addremove = false
97 mwan_interface.dynamic = false
100 enabled = mwan_interface:option(ListValue, "enabled", translate("Enabled"))
101 enabled.default = "1"
102 enabled:value("1", translate("Yes"))
103 enabled:value("0", translate("No"))
105 initial_state = mwan_interface:option(ListValue, "initial_state", translate("Initial state"),
106 translate("Expect interface state on up event"))
107 initial_state.default = "online"
108 initial_state:value("online", translate("Online"))
109 initial_state:value("offline", translate("Offline"))
111 family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
112 family.default = "ipv4"
113 family:value("ipv4", translate("IPv4"))
114 family:value("ipv6", translate("IPv6"))
116 track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking hostname or IP address"),
117 translate("This hostname or IP address will be pinged to determine if the link is up or down. Leave blank to assume interface is always online"))
118 track_ip.datatype = "host"
120 reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
121 translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
122 reliability.datatype = "range(1, 100)"
123 reliability.default = "1"
125 count = mwan_interface:option(ListValue, "count", translate("Ping count"))
133 size = mwan_interface:option(Value, "size", translate("Ping size"))
144 size.datatype = "range(1, 65507)"
146 size.optional = false
148 timeout = mwan_interface:option(ListValue, "timeout", translate("Ping timeout"))
149 timeout.default = "2"
150 timeout:value("1", translatef("%d second", 1))
151 timeout:value("2", translatef("%d seconds", 2))
152 timeout:value("3", translatef("%d seconds", 3))
153 timeout:value("4", translatef("%d seconds", 4))
154 timeout:value("5", translatef("%d seconds", 5))
155 timeout:value("6", translatef("%d seconds", 6))
156 timeout:value("7", translatef("%d seconds", 7))
157 timeout:value("8", translatef("%d seconds", 8))
158 timeout:value("9", translatef("%d seconds", 9))
159 timeout:value("10", translatef("%d seconds", 10))
161 interval = mwan_interface:option(ListValue, "interval", translate("Ping interval"))
162 interval.default = "5"
163 interval:value("1", translatef("%d second", 1))
164 interval:value("3", translatef("%d seconds", 3))
165 interval:value("5", translatef("%d seconds", 5))
166 interval:value("10", translatef("%d seconds", 10))
167 interval:value("20", translatef("%d seconds", 20))
168 interval:value("30", translatef("%d seconds", 30))
169 interval:value("60", translatef("%d minute", 1))
170 interval:value("300", translatef("%d minutes", 5))
171 interval:value("600", translatef("%d minutes", 10))
172 interval:value("900", translatef("%d minutes", 15))
173 interval:value("1800", translatef("%d minutes", 30))
174 interval:value("3600", translatef("%d hour", 1))
176 failure = mwan_interface:option(Value, "failure_interval", translate("Failure interval"),
177 translate("Ping interval during failure detection"))
178 failure.default = "5"
179 failure:value("1", translatef("%d second", 1))
180 failure:value("3", translatef("%d seconds", 3))
181 failure:value("5", translatef("%d seconds", 5))
182 failure:value("10", translatef("%d seconds", 10))
183 failure:value("20", translatef("%d seconds", 20))
184 failure:value("30", translatef("%d seconds", 30))
185 failure:value("60", translatef("%d minute", 1))
186 failure:value("300", translatef("%d minutes", 5))
187 failure:value("600", translatef("%d minutes", 10))
188 failure:value("900", translatef("%d minutes", 15))
189 failure:value("1800", translatef("%d minutes", 30))
190 failure:value("3600", translatef("%d hour", 1))
192 keep_failure = mwan_interface:option(Flag, "keep_failure_interval", translate("Keep failure interval"),
193 translate("Keep ping failure interval during failure state"))
194 keep_failure.default = keep_failure.disabled
196 recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
197 translate("Ping interval during failure recovering"))
198 recovery.default = "5"
199 recovery:value("1", translatef("%d second", 1))
200 recovery:value("3", translatef("%d seconds", 3))
201 recovery:value("5", translatef("%d seconds", 5))
202 recovery:value("10", translatef("%d seconds", 10))
203 recovery:value("20", translatef("%d seconds", 20))
204 recovery:value("30", translatef("%d seconds", 30))
205 recovery:value("60", translatef("%d minute", 1))
206 recovery:value("300", translatef("%d minutes", 5))
207 recovery:value("600", translatef("%d minutes", 10))
208 recovery:value("900", translatef("%d minutes", 15))
209 recovery:value("1800", translatef("%d minutes", 30))
210 recovery:value("3600", translatef("%d hour", 1))
212 down = mwan_interface:option(ListValue, "down", translate("Interface down"),
213 translate("Interface will be deemed down after this many failed ping tests"))
226 up = mwan_interface:option(ListValue, "up", translate("Interface up"),
227 translate("Downed interface will be deemed up after this many successful ping tests"))
240 flush = mwan_interface:option(ListValue, "flush_conntrack", translate("Flush conntrack table"),
241 translate("Flush global firewall conntrack table on interface events"))
242 flush.default = "never"
243 flush:value("ifup", translate("ifup"))
244 flush:value("ifdown", translate("ifdown"))
245 flush:value("never", translate("never"))
246 flush:value("always", translate("always"))
248 metric = mwan_interface:option(DummyValue, "metric", translate("Metric"),
249 translate("This displays the metric assigned to this interface in /etc/config/network"))
250 metric.rawhtml = true
251 function metric.cfgvalue(self, s)
252 if errorNoMetric == 0 then