2b46376399dec4843493b2579a8e0c0ec0528e80
[project/luci.git] / applications / luci-app-mwan3 / luasrc / model / cbi / mwan / interfaceconfig.lua
1 -- ------ extra functions ------ --
2
3 function interfaceCheck()
4 metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".metric"))
5 if metricValue == "" then -- no metric
6 errorNoMetric = 1
7 else -- if metric exists create list of interface metrics to compare against for duplicates
8 uci.cursor():foreach("mwan3", "interface",
9 function (section)
10 local metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. section[".name"] .. ".metric"))
11 metricList = metricList .. section[".name"] .. " " .. metricValue .. "\n"
12 end
13 )
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
19 end
20 if sys.exec("echo '" .. errorDuplicateMetricList .. "' | grep -w " .. arg[1]) ~= "" then
21 errorDuplicateMetric = 1
22 end
23 end
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
29 errorReliability = 1
30 end
31 end
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
36 errorNetConfig = 1
37 errorRoute = 1
38 else
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
41 errorRoute = 1
42 end
43 end
44 else
45 errorNetConfig = 1
46 errorRoute = 1
47 end
48 end
49
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 />"
55 end
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 />"
59 end
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 />"
63 end
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>"
68 end
69 return warns
70 end
71
72 -- ------ interface configuration ------ --
73
74 dsp = require "luci.dispatcher"
75 sys = require "luci.sys"
76 ut = require "luci.util"
77 arg[1] = arg[1] or ""
78
79 metricValue = ""
80 metricList = ""
81 errorDuplicateMetricList = ""
82 errorNoMetric = 0
83 errorDuplicateMetric = 0
84 errorRoute = 0
85 errorNetConfig = 0
86 errorReliability = 0
87 interfaceCheck()
88
89
90 m5 = Map("mwan3", translatef("MWAN Interface Configuration - %s", arg[1]),
91 interfaceWarnings())
92 m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "interface")
93
94
95 mwan_interface = m5:section(NamedSection, arg[1], "interface", "")
96 mwan_interface.addremove = false
97 mwan_interface.dynamic = false
98
99
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"))
104
105 family = mwan_interface:option(ListValue, "family", translate("Internet Protocol"))
106 family.default = "ipv4"
107 family:value("ipv4", translate("IPv4"))
108 family:value("ipv6", translate("IPv6"))
109
110 track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking hostname or IP address"),
111 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"))
112 track_ip.datatype = "host"
113
114 reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
115 translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
116 reliability.datatype = "range(1, 100)"
117 reliability.default = "1"
118
119 count = mwan_interface:option(ListValue, "count", translate("Ping count"))
120 count.default = "1"
121 count:value("1")
122 count:value("2")
123 count:value("3")
124 count:value("4")
125 count:value("5")
126
127 size = mwan_interface:option(Value, "size", translate("Ping size"))
128 size.default = "56"
129 size:value("8")
130 size:value("24")
131 size:value("56")
132 size:value("120")
133 size:value("248")
134 size:value("504")
135 size:value("1016")
136 size:value("1472")
137 size:value("2040")
138 size.datatype = "range(1, 65507)"
139 size.rmempty = false
140 size.optional = false
141
142 timeout = mwan_interface:option(ListValue, "timeout", translate("Ping timeout"))
143 timeout.default = "2"
144 timeout:value("1", translatef("%d second", 1))
145 timeout:value("2", translatef("%d seconds", 2))
146 timeout:value("3", translatef("%d seconds", 3))
147 timeout:value("4", translatef("%d seconds", 4))
148 timeout:value("5", translatef("%d seconds", 5))
149 timeout:value("6", translatef("%d seconds", 6))
150 timeout:value("7", translatef("%d seconds", 7))
151 timeout:value("8", translatef("%d seconds", 8))
152 timeout:value("9", translatef("%d seconds", 9))
153 timeout:value("10", translatef("%d seconds", 10))
154
155 interval = mwan_interface:option(ListValue, "interval", translate("Ping interval"))
156 interval.default = "5"
157 interval:value("1", translatef("%d second", 1))
158 interval:value("3", translatef("%d seconds", 3))
159 interval:value("5", translatef("%d seconds", 5))
160 interval:value("10", translatef("%d seconds", 10))
161 interval:value("20", translatef("%d seconds", 20))
162 interval:value("30", translatef("%d seconds", 30))
163 interval:value("60", translatef("%d minute", 1))
164 interval:value("300", translatef("%d minutes", 5))
165 interval:value("600", translatef("%d minutes", 10))
166 interval:value("900", translatef("%d minutes", 15))
167 interval:value("1800", translatef("%d minutes", 30))
168 interval:value("3600", translatef("%d hour", 1))
169
170 failure = mwan_interface:option(Value, "failure_interval", translate("Failure interval"),
171 translate("Ping interval during failure detection"))
172 failure.default = "5"
173 failure:value("1", translatef("%d second", 1))
174 failure:value("3", translatef("%d seconds", 3))
175 failure:value("5", translatef("%d seconds", 5))
176 failure:value("10", translatef("%d seconds", 10))
177 failure:value("20", translatef("%d seconds", 20))
178 failure:value("30", translatef("%d seconds", 30))
179 failure:value("60", translatef("%d minute", 1))
180 failure:value("300", translatef("%d minutes", 5))
181 failure:value("600", translatef("%d minutes", 10))
182 failure:value("900", translatef("%d minutes", 15))
183 failure:value("1800", translatef("%d minutes", 30))
184 failure:value("3600", translatef("%d hour", 1))
185
186 recovery = mwan_interface:option(Value, "recovery_interval", translate("Recovery interval"),
187 translate("Ping interval during failure recovering"))
188 recovery.default = "5"
189 recovery:value("1", translatef("%d second", 1))
190 recovery:value("3", translatef("%d seconds", 3))
191 recovery:value("5", translatef("%d seconds", 5))
192 recovery:value("10", translatef("%d seconds", 10))
193 recovery:value("20", translatef("%d seconds", 20))
194 recovery:value("30", translatef("%d seconds", 30))
195 recovery:value("60", translatef("%d minute", 1))
196 recovery:value("300", translatef("%d minutes", 5))
197 recovery:value("600", translatef("%d minutes", 10))
198 recovery:value("900", translatef("%d minutes", 15))
199 recovery:value("1800", translatef("%d minutes", 30))
200 recovery:value("3600", translatef("%d hour", 1))
201
202 down = mwan_interface:option(ListValue, "down", translate("Interface down"),
203 translate("Interface will be deemed down after this many failed ping tests"))
204 down.default = "3"
205 down:value("1")
206 down:value("2")
207 down:value("3")
208 down:value("4")
209 down:value("5")
210 down:value("6")
211 down:value("7")
212 down:value("8")
213 down:value("9")
214 down:value("10")
215
216 up = mwan_interface:option(ListValue, "up", translate("Interface up"),
217 translate("Downed interface will be deemed up after this many successful ping tests"))
218 up.default = "3"
219 up:value("1")
220 up:value("2")
221 up:value("3")
222 up:value("4")
223 up:value("5")
224 up:value("6")
225 up:value("7")
226 up:value("8")
227 up:value("9")
228 up:value("10")
229
230 flush = mwan_interface:option(ListValue, "flush_conntrack", translate("Flush conntrack table"),
231 translate("Flush global firewall conntrack table on interface events"))
232 flush.default = "never"
233 flush:value("ifup", translate("ifup"))
234 flush:value("ifdown", translate("ifdown"))
235 flush:value("never", translate("never"))
236 flush:value("always", translate("always"))
237
238 metric = mwan_interface:option(DummyValue, "metric", translate("Metric"),
239 translate("This displays the metric assigned to this interface in /etc/config/network"))
240 metric.rawhtml = true
241 function metric.cfgvalue(self, s)
242 if errorNoMetric == 0 then
243 return metricValue
244 else
245 return "&#8212;"
246 end
247 end
248
249
250 return m5