1 -- Copyright 2014 Aedan Renner <chipdankly@gmail.com>
2 -- Copyright 2018 Florian Eckert <fe@dev.tdt.de>
3 -- Licensed to the public under the GNU General Public License v2.
5 local dsp = require "luci.dispatcher"
7 local m, mwan_interface, enabled, initial_state, family, track_ip
8 local track_method, reliability, count, size, max_ttl
9 local check_quality, failure_latency, failure_loss, recovery_latency
10 local recovery_loss, timeout, interval, failure
11 local keep_failure, recovery, down, up, flush, metric
15 m = Map("mwan3", translatef("MWAN Interface Configuration - %s", arg[1]))
16 m.redirect = dsp.build_url("admin", "network", "mwan", "interface")
18 mwan_interface = m:section(NamedSection, arg[1], "interface", "")
19 mwan_interface.addremove = false
20 mwan_interface.dynamic = false
22 enabled = mwan_interface:option(Flag, "enabled", translate("Enabled"))
23 enabled.default = false
25 initial_state = mwan_interface:option(ListValue, "initial_state", translate("Initial state"),
26 translate("Expect interface state on up event"))
27 initial_state.default = "online"
28 initial_state:value("online", translate("Online"))
29 initial_state:value("offline", translate("Offline"))
31 family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
32 family.default = "ipv4"
33 family:value("ipv4", translate("IPv4"))
34 family:value("ipv6", translate("IPv6"))
36 track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking hostname or IP address"),
37 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"))
38 track_ip.datatype = "host"
40 track_method = mwan_interface:option(ListValue, "track_method", translate("Tracking method"))
41 track_method.default = "ping"
42 track_method:value("ping")
43 if os.execute("which nping 1>/dev/null") == 0 then
44 track_method:value("nping-tcp")
45 track_method:value("nping-udp")
46 track_method:value("nping-icmp")
47 track_method:value("nping-arp")
50 if os.execute("which arping 1>/dev/null") == 0 then
51 track_method:value("arping")
54 if os.execute("which httping 1>/dev/null") == 0 then
55 track_method:value("httping")
58 reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
59 translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
60 reliability.datatype = "range(1, 100)"
61 reliability.default = "1"
63 count = mwan_interface:option(ListValue, "count", translate("Ping count"))
71 size = mwan_interface:option(Value, "size", translate("Ping size"))
73 size:depends("track_method", "ping")
83 size.datatype = "range(1, 65507)"
87 max_ttl = mwan_interface:option(Value, "max_ttl", translate("Max TTL"))
88 max_ttl.default = "60"
89 max_ttl:depends("track_method", "ping")
97 max_ttl.datatype = "range(1, 255)"
99 check_quality = mwan_interface:option(Flag, "check_quality", translate("Check link quality"))
100 check_quality:depends("track_method", "ping")
101 check_quality.default = false
103 failure_latency = mwan_interface:option(Value, "failure_latency", translate("Max packet latency [ms]"))
104 failure_latency:depends("check_quality", 1)
105 failure_latency.default = "1000"
106 failure_latency:value("25")
107 failure_latency:value("50")
108 failure_latency:value("75")
109 failure_latency:value("100")
110 failure_latency:value("150")
111 failure_latency:value("200")
112 failure_latency:value("250")
113 failure_latency:value("300")
115 failure_loss = mwan_interface:option(Value, "failure_loss", translate("Max packet loss [%]"))
116 failure_loss:depends("check_quality", 1)
117 failure_loss.default = "20"
118 failure_loss:value("2")
119 failure_loss:value("5")
120 failure_loss:value("10")
121 failure_loss:value("20")
122 failure_loss:value("25")
124 recovery_latency = mwan_interface:option(Value, "recovery_latency", translate("Min packet latency [ms]"))
125 recovery_latency:depends("check_quality", 1)
126 recovery_latency.default = "500"
127 recovery_latency:value("25")
128 recovery_latency:value("50")
129 recovery_latency:value("75")
130 recovery_latency:value("100")
131 recovery_latency:value("150")
132 recovery_latency:value("200")
133 recovery_latency:value("250")
134 recovery_latency:value("300")
136 recovery_loss = mwan_interface:option(Value, "recovery_loss", translate("Min packet loss [%]"))
137 recovery_loss:depends("check_quality", 1)
138 recovery_loss.default = "5"
139 recovery_loss:value("2")
140 recovery_loss:value("5")
141 recovery_loss:value("10")
142 recovery_loss:value("20")
143 recovery_loss:value("25")
145 timeout = mwan_interface:option(ListValue, "timeout", translate("Ping timeout"))
146 timeout.default = "2"
147 timeout:value("1", translatef("%d second", 1))
148 timeout:value("2", translatef("%d seconds", 2))
149 timeout:value("3", translatef("%d seconds", 3))
150 timeout:value("4", translatef("%d seconds", 4))
151 timeout:value("5", translatef("%d seconds", 5))
152 timeout:value("6", translatef("%d seconds", 6))
153 timeout:value("7", translatef("%d seconds", 7))
154 timeout:value("8", translatef("%d seconds", 8))
155 timeout:value("9", translatef("%d seconds", 9))
156 timeout:value("10", translatef("%d seconds", 10))
158 interval = mwan_interface:option(ListValue, "interval", translate("Ping interval"))
159 interval.default = "5"
160 interval:value("1", translatef("%d second", 1))
161 interval:value("3", translatef("%d seconds", 3))
162 interval:value("5", translatef("%d seconds", 5))
163 interval:value("10", translatef("%d seconds", 10))
164 interval:value("20", translatef("%d seconds", 20))
165 interval:value("30", translatef("%d seconds", 30))
166 interval:value("60", translatef("%d minute", 1))
167 interval:value("300", translatef("%d minutes", 5))
168 interval:value("600", translatef("%d minutes", 10))
169 interval:value("900", translatef("%d minutes", 15))
170 interval:value("1800", translatef("%d minutes", 30))
171 interval:value("3600", translatef("%d hour", 1))
173 failure = mwan_interface:option(Value, "failure_interval", translate("Failure interval"),
174 translate("Ping interval during failure detection"))
175 failure.default = "5"
176 failure:value("1", translatef("%d second", 1))
177 failure:value("3", translatef("%d seconds", 3))
178 failure:value("5", translatef("%d seconds", 5))
179 failure:value("10", translatef("%d seconds", 10))
180 failure:value("20", translatef("%d seconds", 20))
181 failure:value("30", translatef("%d seconds", 30))
182 failure:value("60", translatef("%d minute", 1))
183 failure:value("300", translatef("%d minutes", 5))
184 failure:value("600", translatef("%d minutes", 10))
185 failure:value("900", translatef("%d minutes", 15))
186 failure:value("1800", translatef("%d minutes", 30))
187 failure:value("3600", translatef("%d hour", 1))
189 keep_failure = mwan_interface:option(Flag, "keep_failure_interval", translate("Keep failure interval"),
190 translate("Keep ping failure interval during failure state"))
191 keep_failure.default = keep_failure.disabled
193 recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
194 translate("Ping interval during failure recovering"))
195 recovery.default = "5"
196 recovery:value("1", translatef("%d second", 1))
197 recovery:value("3", translatef("%d seconds", 3))
198 recovery:value("5", translatef("%d seconds", 5))
199 recovery:value("10", translatef("%d seconds", 10))
200 recovery:value("20", translatef("%d seconds", 20))
201 recovery:value("30", translatef("%d seconds", 30))
202 recovery:value("60", translatef("%d minute", 1))
203 recovery:value("300", translatef("%d minutes", 5))
204 recovery:value("600", translatef("%d minutes", 10))
205 recovery:value("900", translatef("%d minutes", 15))
206 recovery:value("1800", translatef("%d minutes", 30))
207 recovery:value("3600", translatef("%d hour", 1))
209 down = mwan_interface:option(ListValue, "down", translate("Interface down"),
210 translate("Interface will be deemed down after this many failed ping tests"))
223 up = mwan_interface:option(ListValue, "up", translate("Interface up"),
224 translate("Downed interface will be deemed up after this many successful ping tests"))
237 flush = mwan_interface:option(StaticList, "flush_conntrack", translate("Flush conntrack table"),
238 translate("Flush global firewall conntrack table on interface events"))
239 flush:value("ifup", translate("ifup (netifd)"))
240 flush:value("ifdown", translate("ifdown (netifd)"))
241 flush:value("connected", translate("connected (mwan3)"))
242 flush:value("disconnected", translate("disconnected (mwan3)"))
244 metric = mwan_interface:option(DummyValue, "metric", translate("Metric"),
245 translate("This displays the metric assigned to this interface in /etc/config/network"))
246 metric.rawhtml = true
247 function metric.cfgvalue(self, s)
248 local uci = require "luci.model.uci".cursor(nil, "/var/state")
249 local metric = uci:get("network", arg[1], "metric")