e7c16fdfdca7ce3f2011f57b92401d59a3cc7252
[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 IP"),
111         translate("This IP address will be pinged to dermine if the link is up or down. Leave blank to assume interface is always online"))
112         track_ip.datatype = "ipaddr"
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