m5 = Map("mwan3", translate("MWAN - Interfaces"),
interfaceWarnings(configCheck()))
-
mwan_interface = m5:section(TypedSection, "interface", nil,
translate("MWAN supports up to 250 physical and/or logical interfaces<br />" ..
"MWAN requires that all interfaces have a unique metric configured in /etc/config/network<br />" ..
"Names must match the interface name found in /etc/config/network (see advanced tab)<br />" ..
"Names may contain characters A-Z, a-z, 0-9, _ and no spaces<br />" ..
"Interfaces may not share the same name as configured members, policies or rules"))
- mwan_interface.addremove = true
- mwan_interface.dynamic = false
- mwan_interface.sectionhead = translate("Interface")
- mwan_interface.sortable = false
- mwan_interface.template = "cbi/tblsection"
- mwan_interface.extedit = dsp.build_url("admin", "network", "mwan", "interface", "%s")
- function mwan_interface.create(self, section)
- TypedSection.create(self, section)
- m5.uci:save("mwan3")
- luci.http.redirect(dsp.build_url("admin", "network", "mwan", "interface", section))
- end
-
+mwan_interface.addremove = true
+mwan_interface.dynamic = false
+mwan_interface.sectionhead = translate("Interface")
+mwan_interface.sortable = false
+mwan_interface.template = "cbi/tblsection"
+mwan_interface.extedit = dsp.build_url("admin", "network", "mwan", "interface", "%s")
+function mwan_interface.create(self, section)
+ TypedSection.create(self, section)
+ m5.uci:save("mwan3")
+ luci.http.redirect(dsp.build_url("admin", "network", "mwan", "interface", section))
+end
enabled = mwan_interface:option(DummyValue, "enabled", translate("Enabled"))
- enabled.rawhtml = true
- function enabled.cfgvalue(self, s)
- if self.map:get(s, "enabled") == "1" then
- return translate("Yes")
- else
- return translate("No")
- end
+enabled.rawhtml = true
+function enabled.cfgvalue(self, s)
+ if self.map:get(s, "enabled") == "1" then
+ return translate("Yes")
+ else
+ return translate("No")
end
+end
track_method = mwan_interface:option(DummyValue, "track_method", translate("Tracking method"))
- track_method.rawhtml = true
- function track_method.cfgvalue(self, s)
- local tracked = self.map:get(s, "track_ip")
- if tracked then
- return self.map:get(s, "track_method") or "—"
- else
- return "—"
- end
+track_method.rawhtml = true
+function track_method.cfgvalue(self, s)
+ local tracked = self.map:get(s, "track_ip")
+ if tracked then
+ return self.map:get(s, "track_method") or "—"
+ else
+ return "—"
end
+end
reliability = mwan_interface:option(DummyValue, "reliability", translate("Tracking reliability"))
- reliability.rawhtml = true
- function reliability.cfgvalue(self, s)
- local tracked = self.map:get(s, "track_ip")
- if tracked then
- return self.map:get(s, "reliability") or "—"
- else
- return "—"
- end
+reliability.rawhtml = true
+function reliability.cfgvalue(self, s)
+ local tracked = self.map:get(s, "track_ip")
+ if tracked then
+ return self.map:get(s, "reliability") or "—"
+ else
+ return "—"
end
+end
interval = mwan_interface:option(DummyValue, "interval", translate("Ping interval"))
- interval.rawhtml = true
- function interval.cfgvalue(self, s)
- local tracked = self.map:get(s, "track_ip")
- if tracked then
- local intervalValue = self.map:get(s, "interval")
- if intervalValue then
- return intervalValue .. "s"
- else
- return "—"
- end
+interval.rawhtml = true
+function interval.cfgvalue(self, s)
+ local tracked = self.map:get(s, "track_ip")
+ if tracked then
+ local intervalValue = self.map:get(s, "interval")
+ if intervalValue then
+ return intervalValue .. "s"
else
return "—"
end
+ else
+ return "—"
end
+end
down = mwan_interface:option(DummyValue, "down", translate("Interface down"))
- down.rawhtml = true
- function down.cfgvalue(self, s)
- local tracked = self.map:get(s, "track_ip")
- if tracked then
- return self.map:get(s, "down") or "—"
- else
- return "—"
- end
+down.rawhtml = true
+function down.cfgvalue(self, s)
+ local tracked = self.map:get(s, "track_ip")
+ if tracked then
+ return self.map:get(s, "down") or "—"
+ else
+ return "—"
end
+end
up = mwan_interface:option(DummyValue, "up", translate("Interface up"))
- up.rawhtml = true
- function up.cfgvalue(self, s)
- local tracked = self.map:get(s, "track_ip")
- if tracked then
- return self.map:get(s, "up") or "—"
- else
- return "—"
- end
+up.rawhtml = true
+function up.cfgvalue(self, s)
+ local tracked = self.map:get(s, "track_ip")
+ if tracked then
+ return self.map:get(s, "up") or "—"
+ else
+ return "—"
end
+end
metric = mwan_interface:option(DummyValue, "metric", translate("Metric"))
- metric.rawhtml = true
- function metric.cfgvalue(self, s)
- local uci = uci.cursor(nil, "/var/state")
- local metric = uci:get("network", s, "metric")
- if metric then
- return metric
- else
- return "—"
- end
+metric.rawhtml = true
+function metric.cfgvalue(self, s)
+ local uci = uci.cursor(nil, "/var/state")
+ local metric = uci:get("network", s, "metric")
+ if metric then
+ return metric
+ else
+ return "—"
end
+end
return m5
m5 = Map("mwan3", translatef("MWAN Interface Configuration - %s", arg[1]))
m5.redirect = dsp.build_url("admin", "network", "mwan", "interface")
-
mwan_interface = m5:section(NamedSection, arg[1], "interface", "")
- mwan_interface.addremove = false
- mwan_interface.dynamic = false
-
+mwan_interface.addremove = false
+mwan_interface.dynamic = false
enabled = mwan_interface:option(ListValue, "enabled", translate("Enabled"))
- enabled.default = "1"
- enabled:value("1", translate("Yes"))
- enabled:value("0", translate("No"))
+enabled.default = "1"
+enabled:value("1", translate("Yes"))
+enabled:value("0", translate("No"))
initial_state = mwan_interface:option(ListValue, "initial_state", translate("Initial state"),
translate("Expect interface state on up event"))
- initial_state.default = "online"
- initial_state:value("online", translate("Online"))
- initial_state:value("offline", translate("Offline"))
+initial_state.default = "online"
+initial_state:value("online", translate("Online"))
+initial_state:value("offline", translate("Offline"))
family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
- family.default = "ipv4"
- family:value("ipv4", translate("IPv4"))
- family:value("ipv6", translate("IPv6"))
+family.default = "ipv4"
+family:value("ipv4", translate("IPv4"))
+family:value("ipv6", translate("IPv6"))
track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking hostname or IP address"),
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"))
- track_ip.datatype = "host"
+track_ip.datatype = "host"
track_method = mwan_interface:option(ListValue, "track_method", translate("Tracking method"))
- track_method.default = "ping"
- track_method:value("ping")
- track_method:value("arping")
- track_method:value("httping")
+track_method.default = "ping"
+track_method:value("ping")
+track_method:value("arping")
+track_method:value("httping")
reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
- reliability.datatype = "range(1, 100)"
- reliability.default = "1"
+reliability.datatype = "range(1, 100)"
+reliability.default = "1"
count = mwan_interface:option(ListValue, "count", translate("Ping count"))
- count.default = "1"
- count:value("1")
- count:value("2")
- count:value("3")
- count:value("4")
- count:value("5")
+count.default = "1"
+count:value("1")
+count:value("2")
+count:value("3")
+count:value("4")
+count:value("5")
size = mwan_interface:option(Value, "size", translate("Ping size"))
- size.default = "56"
- size:value("8")
- size:value("24")
- size:value("56")
- size:value("120")
- size:value("248")
- size:value("504")
- size:value("1016")
- size:value("1472")
- size:value("2040")
- size.datatype = "range(1, 65507)"
- size.rmempty = false
- size.optional = false
+size.default = "56"
+size:value("8")
+size:value("24")
+size:value("56")
+size:value("120")
+size:value("248")
+size:value("504")
+size:value("1016")
+size:value("1472")
+size:value("2040")
+size.datatype = "range(1, 65507)"
+size.rmempty = false
+size.optional = false
timeout = mwan_interface:option(ListValue, "timeout", translate("Ping timeout"))
- timeout.default = "2"
- timeout:value("1", translatef("%d second", 1))
- timeout:value("2", translatef("%d seconds", 2))
- timeout:value("3", translatef("%d seconds", 3))
- timeout:value("4", translatef("%d seconds", 4))
- timeout:value("5", translatef("%d seconds", 5))
- timeout:value("6", translatef("%d seconds", 6))
- timeout:value("7", translatef("%d seconds", 7))
- timeout:value("8", translatef("%d seconds", 8))
- timeout:value("9", translatef("%d seconds", 9))
- timeout:value("10", translatef("%d seconds", 10))
+timeout.default = "2"
+timeout:value("1", translatef("%d second", 1))
+timeout:value("2", translatef("%d seconds", 2))
+timeout:value("3", translatef("%d seconds", 3))
+timeout:value("4", translatef("%d seconds", 4))
+timeout:value("5", translatef("%d seconds", 5))
+timeout:value("6", translatef("%d seconds", 6))
+timeout:value("7", translatef("%d seconds", 7))
+timeout:value("8", translatef("%d seconds", 8))
+timeout:value("9", translatef("%d seconds", 9))
+timeout:value("10", translatef("%d seconds", 10))
interval = mwan_interface:option(ListValue, "interval", translate("Ping interval"))
- interval.default = "5"
- interval:value("1", translatef("%d second", 1))
- interval:value("3", translatef("%d seconds", 3))
- interval:value("5", translatef("%d seconds", 5))
- interval:value("10", translatef("%d seconds", 10))
- interval:value("20", translatef("%d seconds", 20))
- interval:value("30", translatef("%d seconds", 30))
- interval:value("60", translatef("%d minute", 1))
- interval:value("300", translatef("%d minutes", 5))
- interval:value("600", translatef("%d minutes", 10))
- interval:value("900", translatef("%d minutes", 15))
- interval:value("1800", translatef("%d minutes", 30))
- interval:value("3600", translatef("%d hour", 1))
+interval.default = "5"
+interval:value("1", translatef("%d second", 1))
+interval:value("3", translatef("%d seconds", 3))
+interval:value("5", translatef("%d seconds", 5))
+interval:value("10", translatef("%d seconds", 10))
+interval:value("20", translatef("%d seconds", 20))
+interval:value("30", translatef("%d seconds", 30))
+interval:value("60", translatef("%d minute", 1))
+interval:value("300", translatef("%d minutes", 5))
+interval:value("600", translatef("%d minutes", 10))
+interval:value("900", translatef("%d minutes", 15))
+interval:value("1800", translatef("%d minutes", 30))
+interval:value("3600", translatef("%d hour", 1))
failure = mwan_interface:option(Value, "failure_interval", translate("Failure interval"),
translate("Ping interval during failure detection"))
- failure.default = "5"
- failure:value("1", translatef("%d second", 1))
- failure:value("3", translatef("%d seconds", 3))
- failure:value("5", translatef("%d seconds", 5))
- failure:value("10", translatef("%d seconds", 10))
- failure:value("20", translatef("%d seconds", 20))
- failure:value("30", translatef("%d seconds", 30))
- failure:value("60", translatef("%d minute", 1))
- failure:value("300", translatef("%d minutes", 5))
- failure:value("600", translatef("%d minutes", 10))
- failure:value("900", translatef("%d minutes", 15))
- failure:value("1800", translatef("%d minutes", 30))
- failure:value("3600", translatef("%d hour", 1))
+failure.default = "5"
+failure:value("1", translatef("%d second", 1))
+failure:value("3", translatef("%d seconds", 3))
+failure:value("5", translatef("%d seconds", 5))
+failure:value("10", translatef("%d seconds", 10))
+failure:value("20", translatef("%d seconds", 20))
+failure:value("30", translatef("%d seconds", 30))
+failure:value("60", translatef("%d minute", 1))
+failure:value("300", translatef("%d minutes", 5))
+failure:value("600", translatef("%d minutes", 10))
+failure:value("900", translatef("%d minutes", 15))
+failure:value("1800", translatef("%d minutes", 30))
+failure:value("3600", translatef("%d hour", 1))
keep_failure = mwan_interface:option(Flag, "keep_failure_interval", translate("Keep failure interval"),
translate("Keep ping failure interval during failure state"))
- keep_failure.default = keep_failure.disabled
+keep_failure.default = keep_failure.disabled
recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
translate("Ping interval during failure recovering"))
- recovery.default = "5"
- recovery:value("1", translatef("%d second", 1))
- recovery:value("3", translatef("%d seconds", 3))
- recovery:value("5", translatef("%d seconds", 5))
- recovery:value("10", translatef("%d seconds", 10))
- recovery:value("20", translatef("%d seconds", 20))
- recovery:value("30", translatef("%d seconds", 30))
- recovery:value("60", translatef("%d minute", 1))
- recovery:value("300", translatef("%d minutes", 5))
- recovery:value("600", translatef("%d minutes", 10))
- recovery:value("900", translatef("%d minutes", 15))
- recovery:value("1800", translatef("%d minutes", 30))
- recovery:value("3600", translatef("%d hour", 1))
+recovery.default = "5"
+recovery:value("1", translatef("%d second", 1))
+recovery:value("3", translatef("%d seconds", 3))
+recovery:value("5", translatef("%d seconds", 5))
+recovery:value("10", translatef("%d seconds", 10))
+recovery:value("20", translatef("%d seconds", 20))
+recovery:value("30", translatef("%d seconds", 30))
+recovery:value("60", translatef("%d minute", 1))
+recovery:value("300", translatef("%d minutes", 5))
+recovery:value("600", translatef("%d minutes", 10))
+recovery:value("900", translatef("%d minutes", 15))
+recovery:value("1800", translatef("%d minutes", 30))
+recovery:value("3600", translatef("%d hour", 1))
down = mwan_interface:option(ListValue, "down", translate("Interface down"),
translate("Interface will be deemed down after this many failed ping tests"))
- down.default = "3"
- down:value("1")
- down:value("2")
- down:value("3")
- down:value("4")
- down:value("5")
- down:value("6")
- down:value("7")
- down:value("8")
- down:value("9")
- down:value("10")
+down.default = "3"
+down:value("1")
+down:value("2")
+down:value("3")
+down:value("4")
+down:value("5")
+down:value("6")
+down:value("7")
+down:value("8")
+down:value("9")
+down:value("10")
up = mwan_interface:option(ListValue, "up", translate("Interface up"),
translate("Downed interface will be deemed up after this many successful ping tests"))
- up.default = "3"
- up:value("1")
- up:value("2")
- up:value("3")
- up:value("4")
- up:value("5")
- up:value("6")
- up:value("7")
- up:value("8")
- up:value("9")
- up:value("10")
+up.default = "3"
+up:value("1")
+up:value("2")
+up:value("3")
+up:value("4")
+up:value("5")
+up:value("6")
+up:value("7")
+up:value("8")
+up:value("9")
+up:value("10")
flush = mwan_interface:option(ListValue, "flush_conntrack", translate("Flush conntrack table"),
translate("Flush global firewall conntrack table on interface events"))
- flush.default = "never"
- flush:value("ifup", translate("ifup"))
- flush:value("ifdown", translate("ifdown"))
- flush:value("never", translate("never"))
- flush:value("always", translate("always"))
+flush.default = "never"
+flush:value("ifup", translate("ifup"))
+flush:value("ifdown", translate("ifdown"))
+flush:value("never", translate("never"))
+flush:value("always", translate("always"))
metric = mwan_interface:option(DummyValue, "metric", translate("Metric"),
translate("This displays the metric assigned to this interface in /etc/config/network"))
- metric.rawhtml = true
- function metric.cfgvalue(self, s)
- local uci = uci.cursor(nil, "/var/state")
- local metric = uci:get("network", arg[1], "metric")
- if metric then
- return metric
- else
- return "—"
- end
+metric.rawhtml = true
+function metric.cfgvalue(self, s)
+ local uci = uci.cursor(nil, "/var/state")
+ local metric = uci:get("network", arg[1], "metric")
+ if metric then
+ return metric
+ else
+ return "—"
end
+end
return m5
translate("Members are profiles attaching a metric and weight to an MWAN interface<br />" ..
"Names may contain characters A-Z, a-z, 0-9, _ and no spaces<br />" ..
"Members may not share the same name as configured interfaces, policies or rules"))
- mwan_member.addremove = true
- mwan_member.dynamic = false
- mwan_member.sectionhead = translate("Member")
- mwan_member.sortable = true
- mwan_member.template = "cbi/tblsection"
- mwan_member.extedit = dsp.build_url("admin", "network", "mwan", "member", "%s")
- function mwan_member.create(self, section)
- TypedSection.create(self, section)
- m5.uci:save("mwan3")
- luci.http.redirect(dsp.build_url("admin", "network", "mwan", "member", section))
- end
+mwan_member.addremove = true
+mwan_member.dynamic = false
+mwan_member.sectionhead = translate("Member")
+mwan_member.sortable = true
+mwan_member.template = "cbi/tblsection"
+mwan_member.extedit = dsp.build_url("admin", "network", "mwan", "member", "%s")
+function mwan_member.create(self, section)
+ TypedSection.create(self, section)
+ m5.uci:save("mwan3")
+ luci.http.redirect(dsp.build_url("admin", "network", "mwan", "member", section))
+end
interface = mwan_member:option(DummyValue, "interface", translate("Interface"))
- interface.rawhtml = true
- function interface.cfgvalue(self, s)
- return self.map:get(s, "interface") or "—"
- end
+interface.rawhtml = true
+function interface.cfgvalue(self, s)
+ return self.map:get(s, "interface") or "—"
+end
metric = mwan_member:option(DummyValue, "metric", translate("Metric"))
- metric.rawhtml = true
- function metric.cfgvalue(self, s)
- return self.map:get(s, "metric") or "1"
- end
+metric.rawhtml = true
+function metric.cfgvalue(self, s)
+ return self.map:get(s, "metric") or "1"
+end
weight = mwan_member:option(DummyValue, "weight", translate("Weight"))
- weight.rawhtml = true
- function weight.cfgvalue(self, s)
- return self.map:get(s, "weight") or "1"
- end
+weight.rawhtml = true
+function weight.cfgvalue(self, s)
+ return self.map:get(s, "weight") or "1"
+end
return m5
m5.redirect = dsp.build_url("admin", "network", "mwan", "member")
mwan_member = m5:section(NamedSection, arg[1], "member", "")
- mwan_member.addremove = false
- mwan_member.dynamic = false
+mwan_member.addremove = false
+mwan_member.dynamic = false
interface = mwan_member:option(Value, "interface", translate("Interface"))
m5.uci:foreach("mwan3", "interface",
metric = mwan_member:option(Value, "metric", translate("Metric"),
translate("Acceptable values: 1-256. Defaults to 1 if not set"))
- metric.datatype = "range(1, 256)"
+metric.datatype = "range(1, 256)"
weight = mwan_member:option(Value, "weight", translate("Weight"),
translate("Acceptable values: 1-1000. Defaults to 1 if not set"))
- weight.datatype = "range(1, 1000)"
+weight.datatype = "range(1, 1000)"
return m5
m5 = Map("mwan3", translate("MWAN - Policies"),
policyError(policyCheck()))
-
mwan_policy = m5:section(TypedSection, "policy", nil,
translate("Policies are profiles grouping one or more members controlling how MWAN distributes traffic<br />" ..
"Member interfaces with lower metrics are used first. Interfaces with the same metric load-balance<br />" ..
"Load-balanced member interfaces distribute more traffic out those with higher weights<br />" ..
"Names may contain characters A-Z, a-z, 0-9, _ and no spaces. Names must be 15 characters or less<br />" ..
"Policies may not share the same name as configured interfaces, members or rules"))
- mwan_policy.addremove = true
- mwan_policy.dynamic = false
- mwan_policy.sectionhead = translate("Policy")
- mwan_policy.sortable = true
- mwan_policy.template = "cbi/tblsection"
- mwan_policy.extedit = dsp.build_url("admin", "network", "mwan", "policy", "%s")
- function mwan_policy.create(self, section)
- TypedSection.create(self, section)
- m5.uci:save("mwan3")
- luci.http.redirect(dsp.build_url("admin", "network", "mwan", "policy", section))
- end
-
+mwan_policy.addremove = true
+mwan_policy.dynamic = false
+mwan_policy.sectionhead = translate("Policy")
+mwan_policy.sortable = true
+mwan_policy.template = "cbi/tblsection"
+mwan_policy.extedit = dsp.build_url("admin", "network", "mwan", "policy", "%s")
+function mwan_policy.create(self, section)
+ TypedSection.create(self, section)
+ m5.uci:save("mwan3")
+ luci.http.redirect(dsp.build_url("admin", "network", "mwan", "policy", section))
+end
use_member = mwan_policy:option(DummyValue, "use_member", translate("Members assigned"))
- use_member.rawhtml = true
- function use_member.cfgvalue(self, s)
- local memberConfig, memberList = self.map:get(s, "use_member"), ""
- if memberConfig then
- for k,v in pairs(memberConfig) do
- memberList = memberList .. v .. "<br />"
- end
- return memberList
- else
- return "—"
+use_member.rawhtml = true
+function use_member.cfgvalue(self, s)
+ local memberConfig, memberList = self.map:get(s, "use_member"), ""
+ if memberConfig then
+ for k,v in pairs(memberConfig) do
+ memberList = memberList .. v .. "<br />"
end
+ return memberList
+ else
+ return "—"
end
+end
last_resort = mwan_policy:option(DummyValue, "last_resort", translate("Last resort"))
- last_resort.rawhtml = true
- function last_resort.cfgvalue(self, s)
- local action = self.map:get(s, "last_resort")
- if action == "blackhole" then
- return translate("blackhole (drop)")
- elseif action == "default" then
- return translate("default (use main routing table)")
- else
- return translate("unreachable (reject)")
- end
+last_resort.rawhtml = true
+function last_resort.cfgvalue(self, s)
+ local action = self.map:get(s, "last_resort")
+ if action == "blackhole" then
+ return translate("blackhole (drop)")
+ elseif action == "default" then
+ return translate("default (use main routing table)")
+ else
+ return translate("unreachable (reject)")
end
+end
return m5
m5.redirect = dsp.build_url("admin", "network", "mwan", "policy")
mwan_policy = m5:section(NamedSection, arg[1], "policy", "")
- mwan_policy.addremove = false
- mwan_policy.dynamic = false
+mwan_policy.addremove = false
+mwan_policy.dynamic = false
member = mwan_policy:option(DynamicList, "use_member", translate("Member used"))
m5.uci:foreach("mwan3", "member",
last_resort = mwan_policy:option(ListValue, "last_resort", translate("Last resort"),
translate("When all policy members are offline use this behavior for matched traffic"))
- last_resort.default = "unreachable"
- last_resort:value("unreachable", translate("unreachable (reject)"))
- last_resort:value("blackhole", translate("blackhole (drop)"))
- last_resort:value("default", translate("default (use main routing table)"))
+last_resort.default = "unreachable"
+last_resort:value("unreachable", translate("unreachable (reject)"))
+last_resort:value("blackhole", translate("blackhole (drop)"))
+last_resort:value("default", translate("default (use main routing table)"))
return m5
"Traffic matching a rule, but all WAN interfaces for that policy are down will be blackholed<br />" ..
"Names may contain characters A-Z, a-z, 0-9, _ and no spaces<br />" ..
"Rules may not share the same name as configured interfaces, members or policies"))
- mwan_rule.addremove = true
- mwan_rule.anonymous = false
- mwan_rule.dynamic = false
- mwan_rule.sectionhead = translate("Rule")
- mwan_rule.sortable = true
- mwan_rule.template = "cbi/tblsection"
- mwan_rule.extedit = dsp.build_url("admin", "network", "mwan", "rule", "%s")
- function mwan_rule.create(self, section)
- TypedSection.create(self, section)
- m5.uci:save("mwan3")
- luci.http.redirect(dsp.build_url("admin", "network", "mwan", "rule", section))
- end
-
+mwan_rule.addremove = true
+mwan_rule.anonymous = false
+mwan_rule.dynamic = false
+mwan_rule.sectionhead = translate("Rule")
+mwan_rule.sortable = true
+mwan_rule.template = "cbi/tblsection"
+mwan_rule.extedit = dsp.build_url("admin", "network", "mwan", "rule", "%s")
+function mwan_rule.create(self, section)
+ TypedSection.create(self, section)
+ m5.uci:save("mwan3")
+ luci.http.redirect(dsp.build_url("admin", "network", "mwan", "rule", section))
+end
src_ip = mwan_rule:option(DummyValue, "src_ip", translate("Source address"))
- src_ip.rawhtml = true
- function src_ip.cfgvalue(self, s)
- return self.map:get(s, "src_ip") or "—"
- end
+src_ip.rawhtml = true
+function src_ip.cfgvalue(self, s)
+ return self.map:get(s, "src_ip") or "—"
+end
src_port = mwan_rule:option(DummyValue, "src_port", translate("Source port"))
- src_port.rawhtml = true
- function src_port.cfgvalue(self, s)
- return self.map:get(s, "src_port") or "—"
- end
+src_port.rawhtml = true
+function src_port.cfgvalue(self, s)
+ return self.map:get(s, "src_port") or "—"
+end
dest_ip = mwan_rule:option(DummyValue, "dest_ip", translate("Destination address"))
- dest_ip.rawhtml = true
- function dest_ip.cfgvalue(self, s)
- return self.map:get(s, "dest_ip") or "—"
- end
+dest_ip.rawhtml = true
+function dest_ip.cfgvalue(self, s)
+ return self.map:get(s, "dest_ip") or "—"
+end
dest_port = mwan_rule:option(DummyValue, "dest_port", translate("Destination port"))
- dest_port.rawhtml = true
- function dest_port.cfgvalue(self, s)
- return self.map:get(s, "dest_port") or "—"
- end
+dest_port.rawhtml = true
+function dest_port.cfgvalue(self, s)
+ return self.map:get(s, "dest_port") or "—"
+end
proto = mwan_rule:option(DummyValue, "proto", translate("Protocol"))
- proto.rawhtml = true
- function proto.cfgvalue(self, s)
- return self.map:get(s, "proto") or "all"
- end
+proto.rawhtml = true
+function proto.cfgvalue(self, s)
+ return self.map:get(s, "proto") or "all"
+end
use_policy = mwan_rule:option(DummyValue, "use_policy", translate("Policy assigned"))
- use_policy.rawhtml = true
- function use_policy.cfgvalue(self, s)
- return self.map:get(s, "use_policy") or "—"
- end
+use_policy.rawhtml = true
+function use_policy.cfgvalue(self, s)
+ return self.map:get(s, "use_policy") or "—"
+end
return m5
m5.redirect = dsp.build_url("admin", "network", "mwan", "rule")
mwan_rule = m5:section(NamedSection, arg[1], "rule", "")
- mwan_rule.addremove = false
- mwan_rule.dynamic = false
-
+mwan_rule.addremove = false
+mwan_rule.dynamic = false
src_ip = mwan_rule:option(Value, "src_ip", translate("Source address"),
translate("Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"))
- src_ip.datatype = ipaddr
+src_ip.datatype = ipaddr
src_port = mwan_rule:option(Value, "src_port", translate("Source port"),
translate("May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or as a portrange (eg \"1024:2048\") without quotes"))
dest_ip = mwan_rule:option(Value, "dest_ip", translate("Destination address"),
translate("Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"))
- dest_ip.datatype = ipaddr
+dest_ip.datatype = ipaddr
dest_port = mwan_rule:option(Value, "dest_port", translate("Destination port"),
translate("May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or as a portrange (eg \"1024:2048\") without quotes"))
proto = mwan_rule:option(Value, "proto", translate("Protocol"),
translate("View the content of /etc/protocols for protocol description"))
- proto.default = "all"
- proto.rmempty = false
- proto:value("all")
- proto:value("tcp")
- proto:value("udp")
- proto:value("icmp")
- proto:value("esp")
+proto.default = "all"
+proto.rmempty = false
+proto:value("all")
+proto:value("tcp")
+proto:value("udp")
+proto:value("icmp")
+proto:value("esp")
sticky = mwan_rule:option(ListValue, "sticky", translate("Sticky"),
translate("Traffic from the same source IP address that previously matched this rule within the sticky timeout period will use the same WAN interface"))
- sticky.default = "0"
- sticky:value("1", translate("Yes"))
- sticky:value("0", translate("No"))
+sticky.default = "0"
+sticky:value("1", translate("Yes"))
+sticky:value("0", translate("No"))
timeout = mwan_rule:option(Value, "timeout", translate("Sticky timeout"),
translate("Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"))
- timeout.datatype = "range(1, 1000000)"
+timeout.datatype = "range(1, 1000000)"
ipset = mwan_rule:option(Value, "ipset", translate("IPset"),
translate("Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/youtube.com/youtube\")"))