Update my email addresses in the license headers
[project/luci.git] / applications / luci-app-radvd / luasrc / model / cbi / radvd.lua
1 -- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
2 -- Licensed to the public under the Apache License 2.0.
3
4 m = Map("radvd", translate("Radvd"),
5         translate("Radvd is a router advertisement daemon for IPv6. " ..
6                 "It listens to router solicitations and sends router advertisements " ..
7                 "as described in RFC 4861."))
8
9 local nm = require "luci.model.network".init(m.uci)
10 local ut = require "luci.util"
11
12
13 --
14 -- Interfaces
15 --
16
17 s = m:section(TypedSection, "interface", translate("Interfaces"))
18 s.template = "cbi/tblsection"
19 s.extedit  = luci.dispatcher.build_url("admin/network/radvd/interface/%s")
20 s.anonymous = true
21 s.addremove = true
22
23 function s.create(...)
24         local id = TypedSection.create(...)
25         luci.http.redirect(s.extedit % id)
26 end
27
28 function s.remove(self, section)
29         if m.uci:get("radvd", section) == "interface" then
30                 local iface = m.uci:get("radvd", section, "interface")
31                 if iface then
32                         m.uci:delete_all("radvd", "prefix",
33                                 function(s) return s.interface == iface end)
34
35                         m.uci:delete_all("radvd", "route",
36                                 function(s) return s.interface == iface end)
37
38                         m.uci:delete_all("radvd", "rdnss",
39                                 function(s) return s.interface == iface end)
40                 end
41         end
42
43         return TypedSection.remove(self, section)
44 end
45
46 o = s:option(Flag, "ignore", translate("Enable"))
47 o.rmempty = false
48 o.width   = "30px"
49 function o.cfgvalue(...)
50         local v = Flag.cfgvalue(...)
51         return v == "1" and "0" or "1"
52 end
53 function o.write(self, section, value)
54         Flag.write(self, section, value == "1" and "0" or "1")
55 end
56
57 o = s:option(DummyValue, "interface", translate("Interface"))
58 o.template = "cbi/network_netinfo"
59 o.width    = "10%"
60
61 o = s:option(DummyValue, "UnicastOnly", translate("Multicast"))
62 function o.cfgvalue(self, section)
63         local v  = Value.cfgvalue(self, section)
64         local v2 = m.uci:get("radvd", section, "client")
65         return (v == "1" or (v2 and #v2 > 0)) and translate("no") or translate("yes")
66 end
67
68 o = s:option(DummyValue, "AdvSendAdvert", translate("Advertising"))
69 function o.cfgvalue(...)
70         local v = Value.cfgvalue(...)
71         return v == "1" and translate("yes") or translate("no")
72 end
73
74 o = s:option(DummyValue, "MaxRtrAdvInterval", translate("Max. interval"))
75 function o.cfgvalue(...)
76         local v = Value.cfgvalue(...) or "600"
77         return v .. "s"
78 end
79
80 o = s:option(DummyValue, "AdvHomeAgentFlag", translate("Mobile IPv6"))
81 function o.cfgvalue(...)
82         local v = Value.cfgvalue(...)
83         return v == "1" and translate("yes") or translate("no")
84 end
85
86 o = s:option(DummyValue, "AdvDefaultPreference", translate("Preference"))
87 function o.cfgvalue(...)
88         local v = Value.cfgvalue(...) or "medium"
89         return translate(v)
90 end
91
92
93 --
94 -- Prefixes
95 --
96
97 s2 = m:section(TypedSection, "prefix", translate("Prefixes"))
98 s2.template = "cbi/tblsection"
99 s2.extedit  = luci.dispatcher.build_url("admin/network/radvd/prefix/%s")
100 s2.addremove = true
101 s2.anonymous = true
102
103 function s2.create(...)
104         local id = TypedSection.create(...)
105         luci.http.redirect(s2.extedit % id)
106 end
107
108
109 o = s2:option(Flag, "ignore", translate("Enable"))
110 o.rmempty = false
111 o.width   = "30px"
112 function o.cfgvalue(...)
113         local v = Flag.cfgvalue(...)
114         return v == "1" and "0" or "1"
115 end
116 function o.write(self, section, value)
117         Flag.write(self, section, value == "1" and "0" or "1")
118 end
119
120 o = s2:option(DummyValue, "interface", translate("Interface"))
121 o.template = "cbi/network_netinfo"
122 o.width    = "10%"
123
124 pfx = s2:option(DummyValue, "prefix", translate("Prefix"))
125 pfx.width = "60%"
126 function pfx.cfgvalue(self, section)
127         local v = m.uci:get_list("radvd", section, self.option)
128         local l = { }
129
130         if not v or #v == 0 or (#v == 1 and #v[1] == 0) then
131                 local net = nm:get_network(m.uci:get("radvd", section, "interface"))
132                 if net then
133                         local ifc = nm:get_interface(net:ifname())
134                         if ifc then
135                                 local adr
136                                 for _, adr in ipairs(ifc:ip6addrs()) do
137                                         if not adr:is6linklocal() then
138                                                 v = adr:string()
139                                                 break
140                                         end
141                                 end
142                         end
143                 end
144         end
145
146         for v in ut.imatch(v) do
147                 v = luci.ip.IPv6(v)
148                 if v then
149                         l[#l+1] = v:string()
150                 end
151         end
152
153         if #l == 0 then
154                 l[1] = "?"
155         end
156
157         return table.concat(l, ", ")
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 o.cfgvalue = pfx.cfgvalue
213
214 o = s3:option(DummyValue, "AdvRouteLifetime", translate("Lifetime"))
215 function o.cfgvalue(self, section)
216         local v = Value.cfgvalue(self, section) or "1800"
217         return translate(v)
218 end
219
220 o = s3:option(DummyValue, "AdvRoutePreference", translate("Preference"))
221 function o.cfgvalue(self, section)
222         local v = Value.cfgvalue(self, section) or "medium"
223         return translate(v)
224 end
225
226
227 --
228 -- RDNSS
229 --
230
231 s4 = m:section(TypedSection, "rdnss", translate("RDNSS"))
232 s4.template = "cbi/tblsection"
233 s4.extedit  = luci.dispatcher.build_url("admin/network/radvd/rdnss/%s")
234 s4.addremove = true
235 s4.anonymous = true
236
237 function s4.create(...)
238         local id = TypedSection.create(...)
239         luci.http.redirect(s4.extedit % id)
240 end
241
242
243 o = s4:option(Flag, "ignore", translate("Enable"))
244 o.rmempty = false
245 o.width   = "30px"
246 function o.cfgvalue(...)
247         local v = Flag.cfgvalue(...)
248         return v == "1" and "0" or "1"
249 end
250 function o.write(self, section, value)
251         Flag.write(self, section, value == "1" and "0" or "1")
252 end
253
254 o = s4:option(DummyValue, "interface", translate("Interface"))
255 o.template = "cbi/network_netinfo"
256 o.width    = "10%"
257
258 o = s4:option(DummyValue, "addr", translate("Address"))
259 o.width = "60%"
260 o.cfgvalue = pfx.cfgvalue
261
262 o = s4:option(DummyValue, "AdvRDNSSLifetime", translate("Lifetime"))
263 function o.cfgvalue(self, section)
264         local v = Value.cfgvalue(self, section) or "1200"
265         return translate(v)
266 end
267
268
269 --
270 -- DNSSL
271 --
272
273 s5 = m:section(TypedSection, "dnssl", translate("DNSSL"))
274 s5.template = "cbi/tblsection"
275 s5.extedit  = luci.dispatcher.build_url("admin/network/radvd/dnssl/%s")
276 s5.addremove = true
277 s5.anonymous = true
278
279 function s5.create(...)
280         local id = TypedSection.create(...)
281         luci.http.redirect(s5.extedit % id)
282 end
283
284
285 o = s5:option(Flag, "ignore", translate("Enable"))
286 o.rmempty = false
287 o.width   = "30px"
288 function o.cfgvalue(...)
289         local v = Flag.cfgvalue(...)
290         return v == "1" and "0" or "1"
291 end
292 function o.write(self, section, value)
293         Flag.write(self, section, value == "1" and "0" or "1")
294 end
295
296 o = s5:option(DummyValue, "interface", translate("Interface"))
297 o.template = "cbi/network_netinfo"
298 o.width    = "10%"
299
300 o = s5:option(DummyValue, "suffix", translate("Suffix"))
301 o.width = "60%"
302 function o.cfgvalue(self, section)
303         local v = m.uci:get_list("radvd", section, "suffix")
304         local l = { }
305
306         for v in ut.imatch(v) do
307                 l[#l+1] = v
308         end
309
310         if #l == 0 then
311                 l[1] = "?"
312         end
313
314         return table.concat(l, ", ")
315 end
316
317 o = s5:option(DummyValue, "AdvDNSSLLifetime", translate("Lifetime"))
318 function o.cfgvalue(self, section)
319         local v = Value.cfgvalue(self, section) or "1200"
320         return translate(v)
321 end
322
323
324 return m