Merge pull request #1188 from dibdot/master
[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