root/luci/trunk/modules/admin-mini/luasrc/model/cbi/mini/wifi.lua @ 4708

Revision 4708, 10.2 KB (checked in by jow, 4 years ago)

modules/admin-{mini,full}: fixup wpa-mixed dependencies, make key a password field, fix bssid dependency for broadcom ad-hoc mode in admin-mini

  • Property svn:keywords set to Id
Line 
1--[[
2LuCI - Lua Configuration Interface
3
4Copyright 2008 Steven Barth <steven@midlink.org>
5Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
6
7Licensed under the Apache License, Version 2.0 (the "License");
8you may not use this file except in compliance with the License.
9You may obtain a copy of the License at
10
11    http://www.apache.org/licenses/LICENSE-2.0
12
13$Id$
14]]--
15
16-- Data init --
17
18local uci = luci.model.uci.cursor()
19if not uci:get("network", "wan") then
20    uci:section("network", "interface", "wan", {proto="none", ifname=" "})
21    uci:save("network")
22    uci:commit("network")
23end
24
25local wlcursor = luci.model.uci.cursor_state()
26local wireless = wlcursor:get_all("wireless")
27local wifidata = luci.sys.wifi.getiwconfig()
28local wifidevs = {}
29local ifaces = {}
30
31for k, v in pairs(wireless) do
32    if v[".type"] == "wifi-iface" then
33        table.insert(ifaces, v)
34    end
35end
36
37wlcursor:foreach("wireless", "wifi-device",
38    function(section)
39        table.insert(wifidevs, section[".name"])
40    end)
41
42
43-- Main Map --
44
45m = Map("wireless", translate("wifi"), translate("a_w_devices1"))
46m:chain("network")
47
48
49-- Status Table --
50s = m:section(Table, ifaces, translate("networks"))
51
52link = s:option(DummyValue, "_link", translate("link"))
53function link.cfgvalue(self, section)
54    local ifname = self.map:get(section, "ifname")
55    return wifidata[ifname] and wifidata[ifname]["Link Quality"] or "-"
56end
57
58essid = s:option(DummyValue, "ssid", "ESSID")
59
60bssid = s:option(DummyValue, "_bsiid", "BSSID")
61function bssid.cfgvalue(self, section)
62    local ifname = self.map:get(section, "ifname")
63    return (wifidata[ifname] and (wifidata[ifname].Cell
64     or wifidata[ifname]["Access Point"])) or "-"
65end
66
67channel = s:option(DummyValue, "channel", translate("channel"))
68function channel.cfgvalue(self, section)
69    return wireless[self.map:get(section, "device")].channel
70end
71
72protocol = s:option(DummyValue, "_mode", translate("protocol"))
73function protocol.cfgvalue(self, section)
74    local mode = wireless[self.map:get(section, "device")].mode
75    return mode and "802." .. mode
76end
77
78mode = s:option(DummyValue, "mode", translate("mode"))
79encryption = s:option(DummyValue, "encryption", translate("iwscan_encr"))
80
81power = s:option(DummyValue, "_power", translate("power"))
82function power.cfgvalue(self, section)
83    local ifname = self.map:get(section, "ifname")
84    return wifidata[ifname] and wifidata[ifname]["Tx-Power"] or "-"
85end
86
87scan = s:option(Button, "_scan", translate("scan"))
88scan.inputstyle = "find"
89
90function scan.cfgvalue(self, section)
91    return self.map:get(section, "ifname") or false
92end
93
94-- WLAN-Scan-Table --
95
96t2 = m:section(Table, {}, translate("iwscan"), translate("iwscan1"))
97
98function scan.write(self, section)
99    m.autoapply = false
100    t2.render = t2._render
101    local ifname = self.map:get(section, "ifname")
102    luci.util.update(t2.data, luci.sys.wifi.iwscan(ifname))
103end
104
105t2._render = t2.render
106t2.render = function() end
107
108t2:option(DummyValue, "Quality", translate("iwscan_link"))
109essid = t2:option(DummyValue, "ESSID", "ESSID")
110function essid.cfgvalue(self, section)
111    return self.map:get(section, "ESSID")
112end
113
114t2:option(DummyValue, "Address", "BSSID")
115t2:option(DummyValue, "Mode", translate("mode"))
116chan = t2:option(DummyValue, "channel", translate("channel"))
117function chan.cfgvalue(self, section)
118    return self.map:get(section, "Channel")
119        or self.map:get(section, "Frequency")
120        or "-"
121end
122
123t2:option(DummyValue, "Encryption key", translate("iwscan_encr"))
124
125t2:option(DummyValue, "Signal level", translate("iwscan_signal"))
126
127t2:option(DummyValue, "Noise level", translate("iwscan_noise"))
128
129
130
131if #wifidevs < 1 then
132    return m
133end
134
135-- Config Section --
136
137s = m:section(NamedSection, wifidevs[1], "wifi-device", translate("devices"))
138s.addremove = false
139
140en = s:option(Flag, "disabled", translate("enable"))
141en.rmempty = false
142en.enabled = "0"
143en.disabled = "1"
144
145function en.cfgvalue(self, section)
146    return Flag.cfgvalue(self, section) or "0"
147end
148
149
150local hwtype = m:get(wifidevs[1], "type")
151
152if hwtype == "atheros" then
153    mode = s:option(ListValue, "mode", translate("mode"))
154    mode.override_values = true
155    mode:value("", "auto")
156    mode:value("11b", "802.11b")
157    mode:value("11g", "802.11g")
158    mode:value("11a", "802.11a")
159    mode:value("11bg", "802.11b+g")
160    mode.rmempty = true
161end
162
163
164ch = s:option(Value, "channel", translate("a_w_channel"))
165for i=1, 14 do
166    ch:value(i, i .. " (2.4 GHz)")
167end
168
169
170s = m:section(TypedSection, "wifi-iface", translate("m_n_local"))
171s.anonymous = true
172s.addremove = false
173
174s:option(Value, "ssid", translate("a_w_netid"))
175
176bssid = s:option(Value, "bssid", translate("wifi_bssid"))
177
178local devs = {}
179luci.model.uci.cursor():foreach("wireless", "wifi-device",
180    function (section)
181        table.insert(devs, section[".name"])
182    end)
183
184if #devs > 1 then
185    device = s:option(DummyValue, "device", translate("device"))
186else
187    s.defaults.device = devs[1]
188end
189
190mode = s:option(ListValue, "mode", translate("mode"))
191mode.override_values = true
192mode:value("ap", translate("m_w_ap"))
193mode:value("adhoc", translate("m_w_adhoc"))
194mode:value("sta", translate("m_w_client"))
195
196function mode.write(self, section, value)
197    if value == "sta" then
198        local oldif = m.uci:get("network", "wan", "ifname")
199        if oldif and oldif ~= " " then
200            m.uci:set("network", "wan", "_ifname", oldif)
201        end
202        m.uci:set("network", "wan", "ifname", " ")
203
204        self.map:set(section, "network", "wan")
205    else
206        if m.uci:get("network", "wan", "_ifname") then
207            m.uci:set("network", "wan", "ifname", m.uci:get("network", "wan", "_ifname"))
208        end
209        self.map:set(section, "network", "lan")
210    end
211
212    return ListValue.write(self, section, value)
213end
214
215encr = s:option(ListValue, "encryption", translate("encryption"))
216encr.override_values = true
217encr:value("none", "No Encryption")
218encr:value("wep", "WEP")
219
220if hwtype == "atheros" or hwtype == "mac80211" then
221    local supplicant = luci.fs.mtime("/usr/sbin/wpa_supplicant")
222    local hostapd = luci.fs.mtime("/usr/sbin/hostapd")
223
224    if hostapd and supplicant then
225        encr:value("psk", "WPA-PSK")
226        encr:value("psk2", "WPA2-PSK")
227        encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode")
228        encr:value("wpa", "WPA-Radius", {mode="ap"}, {mode="sta"})
229        encr:value("wpa2", "WPA2-Radius", {mode="ap"}, {mode="sta"})
230    elseif hostapd and not supplicant then
231        encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="adhoc"})
232        encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="adhoc"})
233        encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="adhoc"})
234        encr:value("wpa", "WPA-Radius", {mode="ap"})
235        encr:value("wpa2", "WPA2-Radius", {mode="ap"})
236        encr.description = translate("wifi_wpareq")
237    elseif not hostapd and supplicant then
238        encr:value("psk", "WPA-PSK", {mode="sta"})
239        encr:value("psk2", "WPA2-PSK", {mode="sta"})
240        encr:value("mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"})
241        encr:value("wpa", "WPA-EAP", {mode="sta"})
242        encr:value("wpa2", "WPA2-EAP", {mode="sta"})
243        encr.description = translate("wifi_wpareq")
244    else
245        encr.description = translate("wifi_wpareq")
246    end
247elseif hwtype == "broadcom" then
248    encr:value("psk", "WPA-PSK")
249    encr:value("psk2", "WPA2-PSK")
250    encr:value("psk+psk2", "WPA-PSK/WPA2-PSK Mixed Mode")
251end
252
253key = s:option(Value, "key", translate("key"))
254key:depends("encryption", "wep")
255key:depends("encryption", "psk")
256key:depends("encryption", "psk2")
257key:depends("encryption", "psk+psk2")
258key:depends("encryption", "mixed")
259key:depends({mode="ap", encryption="wpa"})
260key:depends({mode="ap", encryption="wpa2"})
261key.rmempty = true
262key.password = true
263
264server = s:option(Value, "server", translate("a_w_radiussrv"))
265server:depends({mode="ap", encryption="wpa"})
266server:depends({mode="ap", encryption="wpa2"})
267server.rmempty = true
268
269port = s:option(Value, "port", translate("a_w_radiusport"))
270port:depends({mode="ap", encryption="wpa"})
271port:depends({mode="ap", encryption="wpa2"})
272port.rmempty = true
273
274
275if hwtype == "atheros" or hwtype == "mac80211" then
276    nasid = s:option(Value, "nasid", translate("a_w_nasid"))
277    nasid:depends({mode="ap", encryption="wpa"})
278    nasid:depends({mode="ap", encryption="wpa2"})
279    nasid.rmempty = true
280
281    eaptype = s:option(ListValue, "eap_type", translate("a_w_eaptype"))
282    eaptype:value("TLS")
283    eaptype:value("TTLS")
284    eaptype:value("PEAP")
285    eaptype:depends({mode="sta", encryption="wpa"})
286    eaptype:depends({mode="sta", encryption="wpa2"})
287
288    cacert = s:option(FileUpload, "ca_cert", translate("a_w_cacert"))
289    cacert:depends({mode="sta", encryption="wpa"})
290    cacert:depends({mode="sta", encryption="wpa2"})
291
292    privkey = s:option(FileUpload, "priv_key", translate("a_w_tlsprivkey"))
293    privkey:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
294    privkey:depends({mode="sta", eap_type="TLS", encryption="wpa"})
295
296    privkeypwd = s:option(Value, "priv_key_pwd", translate("a_w_tlsprivkeypwd"))
297    privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
298    privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa"})
299
300
301    auth = s:option(Value, "auth", translate("a_w_peapauth"))
302    auth:value("PAP")
303    auth:value("CHAP")
304    auth:value("MSCHAP")
305    auth:value("MSCHAPV2")
306    auth:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
307    auth:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
308    auth:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
309    auth:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
310
311
312    identity = s:option(Value, "identity", translate("a_w_peapidentity"))
313    identity:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
314    identity:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
315    identity:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
316    identity:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
317
318    password = s:option(Value, "password", translate("a_w_peappassword"))
319    password:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
320    password:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
321    password:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
322    password:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
323end
324
325
326if hwtype == "atheros" or hwtype == "broadcom" then
327    iso = s:option(Flag, "isolate", translate("a_w_apisolation"), translate("a_w_apisolation1"))
328    iso.rmempty = true
329    iso:depends("mode", "ap")
330
331    hide = s:option(Flag, "hidden", translate("a_w_hideessid"))
332    hide.rmempty = true
333    hide:depends("mode", "ap")
334end
335
336if hwtype == "mac80211" or hwtype == "atheros" then
337    bssid:depends({mode="adhoc"})
338end
339
340if hwtype == "broadcom" then
341    bssid:depends({mode="wds"})
342    bssid:depends({mode="adhoc"})
343end
344
345
346return m
Note: See TracBrowser for help on using the browser.