applications/luci-radvd: expose ignore option, assign column widths
[project/luci.git] / applications / luci-radvd / luasrc / model / cbi / radvd.lua
1 --[[
2 LuCI - Lua Configuration Interface
3
4 Copyright 2010 Jo-Philipp Wich <xm@subsignal.org>
5
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
9
10         http://www.apache.org/licenses/LICENSE-2.0
11
12 $Id$
13 ]]--
14
15 m = Map("radvd", translate("Radvd"),
16         translate("Radvd is a router advertisement daemon for IPv6. " ..
17                 "It listens to router solicitations and sends router advertisements " ..
18                 "as described in RFC 4861."))
19
20 local nm = require "luci.model.network".init(m.uci)
21
22
23 --
24 -- Interfaces
25 --
26
27 s = m:section(TypedSection, "interface", translate("Interfaces"))
28 s.template = "cbi/tblsection"
29 s.extedit  = luci.dispatcher.build_url("admin/network/radvd/interface/%s")
30 s.anonymous = true
31 s.addremove = true
32
33 function s.create(...)
34         local id = TypedSection.create(...)
35         luci.http.redirect(s.extedit % id)
36 end
37
38 function s.remove(self, section)
39         if m.uci:get("radvd", section) == "interface" then
40                 local iface = m.uci:get("radvd", section, "interface")
41                 if iface then
42                         m.uci:delete_all("radvd", "prefix",
43                                 function(s) return s.interface == iface end)
44
45                         m.uci:delete_all("radvd", "route",
46                                 function(s) return s.interface == iface end)
47
48                         m.uci:delete_all("radvd", "rdnss",
49                                 function(s) return s.interface == iface end)
50                 end
51         end
52
53         return TypedSection.remove(self, section)
54 end
55
56 o = s:option(Flag, "ignore", translate("Enable"))
57 o.rmempty = false
58 o.width   = "30px"
59 function o.cfgvalue(...)
60         local v = Flag.cfgvalue(...)
61         return v == "1" and "0" or "1"
62 end
63 function o.write(self, section, value)
64         Flag.write(self, section, value == "1" and "0" or "1")
65 end
66
67 o = s:option(DummyValue, "interface", translate("Interface"))
68 o.template = "cbi/network_netinfo"
69 o.width    = "10%"
70
71 o = s:option(DummyValue, "UnicastOnly", translate("Multicast"))
72 function o.cfgvalue(...)
73         local v = Value.cfgvalue(...)
74         return v == "1" and translate("no") or translate("yes")
75 end
76
77 o = s:option(DummyValue, "AdvSendAdvert", translate("Advertising"))
78 function o.cfgvalue(...)
79         local v = Value.cfgvalue(...)
80         return v == "1" and translate("yes") or translate("no")
81 end
82
83 o = s:option(DummyValue, "MaxRtrAdvInterval", translate("Max. interval"))
84 function o.cfgvalue(...)
85         local v = Value.cfgvalue(...) or "600"
86         return v .. "s"
87 end
88
89 o = s:option(DummyValue, "AdvHomeAgentFlag", translate("Mobile IPv6"))
90 function o.cfgvalue(...)
91         local v = Value.cfgvalue(...)
92         return v == "1" and translate("yes") or translate("no")
93 end
94
95 o = s:option(DummyValue, "AdvDefaultPreference", translate("Preference"))
96 function o.cfgvalue(...)
97         local v = Value.cfgvalue(...) or "medium"
98         return translate(v)
99 end
100
101
102 --
103 -- Prefixes
104 --
105
106 s2 = m:section(TypedSection, "prefix", translate("Prefixes"))
107 s2.template = "cbi/tblsection"
108 s2.extedit  = luci.dispatcher.build_url("admin/network/radvd/prefix/%s")
109 s2.addremove = true
110 s2.anonymous = true
111
112 function s2.create(...)
113         local id = TypedSection.create(...)
114         luci.http.redirect(s2.extedit % id)
115 end
116
117
118 o = s2:option(Flag, "ignore", translate("Enable"))
119 o.rmempty = false
120 o.width   = "30px"
121 function o.cfgvalue(...)
122         local v = Flag.cfgvalue(...)
123         return v == "1" and "0" or "1"
124 end
125 function o.write(self, section, value)
126         Flag.write(self, section, value == "1" and "0" or "1")
127 end
128
129 o = s2:option(DummyValue, "interface", translate("Interface"))
130 o.template = "cbi/network_netinfo"
131 o.width    = "10%"
132
133 o = s2:option(DummyValue, "prefix", translate("Prefix"))
134 o.width = "60%"
135 function o.cfgvalue(self, section)
136         local v = Value.cfgvalue(self, section)
137         if not v then
138                 local net = nm:get_network(m.uci:get("radvd", section, "interface"))
139                 if net then
140                         local ifc = nm:get_interface(net:ifname())
141                         if ifc then
142                                 local adr
143                                 local lla = luci.ip.IPv6("fe80::/10")
144                                 for _, adr in ipairs(ifc:ip6addrs()) do
145                                         if not lla:contains(adr) then
146                                                 v = adr:string()
147                                                 break
148                                         end
149                                 end
150                         end
151                 end
152         else
153                 v = luci.ip.IPv6(v)
154                 v = v and v:string()
155         end
156
157         return v or "?"
158 end
159
160 o = s2:option(DummyValue, "AdvAutonomous", translate("Autonomous"))
161 function o.cfgvalue(...)
162         local v = Value.cfgvalue(...)
163         return v == "1" and translate("yes") or translate("no")
164 end
165
166 o = s2:option(DummyValue, "AdvOnLink", translate("On-link"))
167 function o.cfgvalue(...)
168         local v = Value.cfgvalue(...)
169         return v == "1" and translate("yes") or translate("no")
170 end
171
172 o = s2:option(DummyValue, "AdvValidLifetime", translate("Validity time"))
173 function o.cfgvalue(...)
174         local v = Value.cfgvalue(...) or "86400"
175         return translate(v)
176 end
177
178
179 --
180 -- Routes
181 --
182
183 s3 = m:section(TypedSection, "route", translate("Routes"))
184 s3.template = "cbi/tblsection"
185 s3.extedit  = luci.dispatcher.build_url("admin/network/radvd/route/%s")
186 s3.addremove = true
187 s3.anonymous = true
188
189 function s3.create(...)
190         local id = TypedSection.create(...)
191         luci.http.redirect(s3.extedit % id)
192 end
193
194
195 o = s3:option(Flag, "ignore", translate("Enable"))
196 o.rmempty = false
197 o.width   = "30px"
198 function o.cfgvalue(...)
199         local v = Flag.cfgvalue(...)
200         return v == "1" and "0" or "1"
201 end
202 function o.write(self, section, value)
203         Flag.write(self, section, value == "1" and "0" or "1")
204 end
205
206 o = s3:option(DummyValue, "interface", translate("Interface"))
207 o.template = "cbi/network_netinfo"
208 o.width    = "10%"
209
210 o = s3:option(DummyValue, "prefix", translate("Prefix"))
211 o.width = "60%"
212 function o.cfgvalue(self, section)
213         local v = Value.cfgvalue(self, section)
214         if v then
215                 v = luci.ip.IPv6(v)
216                 v = v and v:string()
217         end
218         return v or "?"
219 end
220
221 o = s3:option(DummyValue, "AdvRouteLifetime", translate("Lifetime"))
222 function o.cfgvalue(self, section)
223         local v = Value.cfgvalue(self, section) or "1800"
224         return translate(v)
225 end
226
227 o = s3:option(DummyValue, "AdvRoutePreference", translate("Preference"))
228 function o.cfgvalue(self, section)
229         local v = Value.cfgvalue(self, section) or "medium"
230         return translate(v)
231 end
232
233
234 --
235 -- RDNSS
236 --
237
238 s4 = m:section(TypedSection, "rdnss", translate("RDNSS"))
239 s4.template = "cbi/tblsection"
240 s4.extedit  = luci.dispatcher.build_url("admin/network/radvd/rdnss/%s")
241 s4.addremove = true
242 s4.anonymous = true
243
244 function s.create(...)
245         local id = TypedSection.create(...)
246         luci.http.redirect(s4.extedit % id)
247 end
248
249
250 o = s4:option(Flag, "ignore", translate("Enable"))
251 o.rmempty = false
252 o.width   = "30px"
253 function o.cfgvalue(...)
254         local v = Flag.cfgvalue(...)
255         return v == "1" and "0" or "1"
256 end
257 function o.write(self, section, value)
258         Flag.write(self, section, value == "1" and "0" or "1")
259 end
260
261 o = s4:option(DummyValue, "interface", translate("Interface"))
262 o.template = "cbi/network_netinfo"
263 o.width    = "10%"
264
265 o = s4:option(DummyValue, "addr", translate("Address"))
266 o.width = "60%"
267 function o.cfgvalue(self, section)
268         local v = Value.cfgvalue(self, section)
269         if not v then
270                 local net = nm:get_network(m.uci:get("radvd", section, "interface"))
271                 if net then
272                         local ifc = nm:get_interface(net:ifname())
273                         if ifc then
274                                 local adr
275                                 local lla = luci.ip.IPv6("fe80::/10")
276                                 for _, adr in ipairs(ifc:ip6addrs()) do
277                                         if not lla:contains(adr) then
278                                                 v = adr:network(128):string()
279                                                 break
280                                         end
281                                 end
282                         end
283                 end
284         else
285                 v = luci.ip.IPv6(v)
286                 v = v and v:network(128):string()
287         end
288
289         return v or "?"
290 end
291
292 o = s4:option(DummyValue, "AdvRDNSSOpen", translate("Open"))
293 function o.cfgvalue(self, section)
294         local v = Value.cfgvalue(self, section)
295         return v == "1" and translate("yes") or translate("no")
296 end
297
298 o = s4:option(DummyValue, "AdvRDNSSLifetime", translate("Lifetime"))
299 function o.cfgvalue(self, section)
300         local v = Value.cfgvalue(self, section) or "1200"
301         return translate(v)
302 end
303
304
305 return m