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
16 m = Map("mwan3", translatef("MWAN Interface Configuration - %s", arg[1]))
17 m.redirect = dsp.build_url("admin", "network", "mwan", "interface")
19 mwan_interface = m:section(NamedSection, arg[1], "interface", "")
20 mwan_interface.addremove = false
21 mwan_interface.dynamic = false
23 enabled = mwan_interface:option(Flag, "enabled", translate("Enabled"))
24 enabled.default = false
26 initial_state = mwan_interface:option(ListValue, "initial_state", translate("Initial state"),
27 translate("Expect interface state on up event"))
28 initial_state.default = "online"
29 initial_state:value("online", translate("Online"))
30 initial_state:value("offline", translate("Offline"))
32 family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
33 family.default = "ipv4"
34 family:value("ipv4", translate("IPv4"))
35 family:value("ipv6", translate("IPv6"))
37 track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking hostname or IP address"),
38 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"))
39 track_ip.datatype = "host"
41 track_method = mwan_interface:option(ListValue, "track_method", translate("Tracking method"))
42 track_method.default = "ping"
43 track_method:value("ping")
44 if os.execute("which nping 1>/dev/null") == 0 then
45 track_method:value("nping-tcp")
46 track_method:value("nping-udp")
47 track_method:value("nping-icmp")
48 track_method:value("nping-arp")
51 if os.execute("which arping 1>/dev/null") == 0 then
52 track_method:value("arping")
55 if os.execute("which httping 1>/dev/null") == 0 then
56 track_method:value("httping")
59 httping_ssl = mwan_interface:option(Flag, "httping_ssl", translate("Enable ssl tracking"),
60 translate("Enables https tracking on ssl port 443"))
61 httping_ssl:depends("track_method", "httping")
62 httping_ssl.default = httping_ssl.enabled
64 reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
65 translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
66 reliability.datatype = "range(1, 100)"
67 reliability.default = "1"
69 count = mwan_interface:option(ListValue, "count", translate("Ping count"))
77 size = mwan_interface:option(Value, "size", translate("Ping size"))
79 size:depends("track_method", "ping")
89 size.datatype = "range(1, 65507)"
93 max_ttl = mwan_interface:option(Value, "max_ttl", translate("Max TTL"))
94 max_ttl.default = "60"
95 max_ttl:depends("track_method", "ping")
103 max_ttl.datatype = "range(1, 255)"
105 check_quality = mwan_interface:option(Flag, "check_quality", translate("Check link quality"))
106 check_quality:depends("track_method", "ping")
107 check_quality.default = false
109 failure_latency = mwan_interface:option(Value, "failure_latency", translate("Max packet latency [ms]"))
110 failure_latency:depends("check_quality", 1)
111 failure_latency.default = "1000"
112 failure_latency:value("25")
113 failure_latency:value("50")
114 failure_latency:value("75")
115 failure_latency:value("100")
116 failure_latency:value("150")
117 failure_latency:value("200")
118 failure_latency:value("250")
119 failure_latency:value("300")
121 failure_loss = mwan_interface:option(Value, "failure_loss", translate("Max packet loss [%]"))
122 failure_loss:depends("check_quality", 1)
123 failure_loss.default = "20"
124 failure_loss:value("2")
125 failure_loss:value("5")
126 failure_loss:value("10")
127 failure_loss:value("20")
128 failure_loss:value("25")
130 recovery_latency = mwan_interface:option(Value, "recovery_latency", translate("Min packet latency [ms]"))
131 recovery_latency:depends("check_quality", 1)
132 recovery_latency.default = "500"
133 recovery_latency:value("25")
134 recovery_latency:value("50")
135 recovery_latency:value("75")
136 recovery_latency:value("100")
137 recovery_latency:value("150")
138 recovery_latency:value("200")
139 recovery_latency:value("250")
140 recovery_latency:value("300")
142 recovery_loss = mwan_interface:option(Value, "recovery_loss", translate("Min packet loss [%]"))
143 recovery_loss:depends("check_quality", 1)
144 recovery_loss.default = "5"
145 recovery_loss:value("2")
146 recovery_loss:value("5")
147 recovery_loss:value("10")
148 recovery_loss:value("20")
149 recovery_loss:value("25")
151 timeout = mwan_interface:option(ListValue, "timeout", translate("Ping timeout"))
152 timeout.default = "2"
153 timeout:value("1", translatef("%d second", 1))
154 timeout:value("2", translatef("%d seconds", 2))
155 timeout:value("3", translatef("%d seconds", 3))
156 timeout:value("4", translatef("%d seconds", 4))
157 timeout:value("5", translatef("%d seconds", 5))
158 timeout:value("6", translatef("%d seconds", 6))
159 timeout:value("7", translatef("%d seconds", 7))
160 timeout:value("8", translatef("%d seconds", 8))
161 timeout:value("9", translatef("%d seconds", 9))
162 timeout:value("10", translatef("%d seconds", 10))
164 interval = mwan_interface:option(ListValue, "interval", translate("Ping interval"))
165 interval.default = "5"
166 interval:value("1", translatef("%d second", 1))
167 interval:value("3", translatef("%d seconds", 3))
168 interval:value("5", translatef("%d seconds", 5))
169 interval:value("10", translatef("%d seconds", 10))
170 interval:value("20", translatef("%d seconds", 20))
171 interval:value("30", translatef("%d seconds", 30))
172 interval:value("60", translatef("%d minute", 1))
173 interval:value("300", translatef("%d minutes", 5))
174 interval:value("600", translatef("%d minutes", 10))
175 interval:value("900", translatef("%d minutes", 15))
176 interval:value("1800", translatef("%d minutes", 30))
177 interval:value("3600", translatef("%d hour", 1))
179 failure = mwan_interface:option(Value, "failure_interval", translate("Failure interval"),
180 translate("Ping interval during failure detection"))
181 failure.default = "5"
182 failure:value("1", translatef("%d second", 1))
183 failure:value("3", translatef("%d seconds", 3))
184 failure:value("5", translatef("%d seconds", 5))
185 failure:value("10", translatef("%d seconds", 10))
186 failure:value("20", translatef("%d seconds", 20))
187 failure:value("30", translatef("%d seconds", 30))
188 failure:value("60", translatef("%d minute", 1))
189 failure:value("300", translatef("%d minutes", 5))
190 failure:value("600", translatef("%d minutes", 10))
191 failure:value("900", translatef("%d minutes", 15))
192 failure:value("1800", translatef("%d minutes", 30))
193 failure:value("3600", translatef("%d hour", 1))
195 keep_failure = mwan_interface:option(Flag, "keep_failure_interval", translate("Keep failure interval"),
196 translate("Keep ping failure interval during failure state"))
197 keep_failure.default = keep_failure.disabled
199 recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
200 translate("Ping interval during failure recovering"))
201 recovery.default = "5"
202 recovery:value("1", translatef("%d second", 1))
203 recovery:value("3", translatef("%d seconds", 3))
204 recovery:value("5", translatef("%d seconds", 5))
205 recovery:value("10", translatef("%d seconds", 10))
206 recovery:value("20", translatef("%d seconds", 20))
207 recovery:value("30", translatef("%d seconds", 30))
208 recovery:value("60", translatef("%d minute", 1))
209 recovery:value("300", translatef("%d minutes", 5))
210 recovery:value("600", translatef("%d minutes", 10))
211 recovery:value("900", translatef("%d minutes", 15))
212 recovery:value("1800", translatef("%d minutes", 30))
213 recovery:value("3600", translatef("%d hour", 1))
215 down = mwan_interface:option(ListValue, "down", translate("Interface down"),
216 translate("Interface will be deemed down after this many failed ping tests"))
229 up = mwan_interface:option(ListValue, "up", translate("Interface up"),
230 translate("Downed interface will be deemed up after this many successful ping tests"))
243 flush = mwan_interface:option(StaticList, "flush_conntrack", translate("Flush conntrack table"),
244 translate("Flush global firewall conntrack table on interface events"))
245 flush:value("ifup", translate("ifup (netifd)"))
246 flush:value("ifdown", translate("ifdown (netifd)"))
247 flush:value("connected", translate("connected (mwan3)"))
248 flush:value("disconnected", translate("disconnected (mwan3)"))
250 metric = mwan_interface:option(DummyValue, "metric", translate("Metric"),
251 translate("This displays the metric assigned to this interface in /etc/config/network"))
252 metric.rawhtml = true
253 function metric.cfgvalue(self, s)
254 local uci = require "luci.model.uci".cursor(nil, "/var/state")
255 local metric = uci:get("network", arg[1], "metric")