Merge pull request #1290 from aparcar/uhttpd-mod-ubus
[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 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"))
110
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"))
115
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"
119
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"
124
125 count = mwan_interface:option(ListValue, "count", translate("Ping count"))
126         count.default = "1"
127         count:value("1")
128         count:value("2")
129         count:value("3")
130         count:value("4")
131         count:value("5")
132
133 size = mwan_interface:option(Value, "size", translate("Ping size"))
134         size.default = "56"
135         size:value("8")
136         size:value("24")
137         size:value("56")
138         size:value("120")
139         size:value("248")
140         size:value("504")
141         size:value("1016")
142         size:value("1472")
143         size:value("2040")
144         size.datatype = "range(1, 65507)"
145         size.rmempty = false
146         size.optional = false
147
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))
160
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))
175
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))
191
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
195
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))
211
212 down = mwan_interface:option(ListValue, "down", translate("Interface down"),
213         translate("Interface will be deemed down after this many failed ping tests"))
214         down.default = "3"
215         down:value("1")
216         down:value("2")
217         down:value("3")
218         down:value("4")
219         down:value("5")
220         down:value("6")
221         down:value("7")
222         down:value("8")
223         down:value("9")
224         down:value("10")
225
226 up = mwan_interface:option(ListValue, "up", translate("Interface up"),
227         translate("Downed interface will be deemed up after this many successful ping tests"))
228         up.default = "3"
229         up:value("1")
230         up:value("2")
231         up:value("3")
232         up:value("4")
233         up:value("5")
234         up:value("6")
235         up:value("7")
236         up:value("8")
237         up:value("9")
238         up:value("10")
239
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"))
247
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
253                         return metricValue
254                 else
255                         return "&#8212;"
256                 end
257         end
258
259
260 return m5