end
if has_wifi and has_wifi.size > 0 then
- local page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), i18n("Wifi"), 15)
+ local page
+
+ page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), i18n("Wifi"), 15)
page.leaf = true
page.subindex = true
- local page = entry({"admin", "network", "wireless_join"}, call("wifi_join"), nil, 16)
+ page = entry({"admin", "network", "wireless_join"}, call("wifi_join"), nil, 16)
+ page.leaf = true
+
+ page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil, 16)
page.leaf = true
- local page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil, 16)
+ page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil, 16)
page.leaf = true
- local page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil, 16)
+ page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil, 16)
page.leaf = true
end
end
function wifi_add()
- local dev = luci.http.formvalue("device")
+ local dev = luci.http.formvalue("device")
local uci = require "luci.model.uci".cursor()
local wlm = require "luci.model.wireless"
uci:save("wireless")
luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
end
+
+function wifi_status()
+ local function jsondump(x)
+ if x == nil then
+ luci.http.write("null")
+ elseif type(x) == "table" then
+ local k, v
+ if type(next(x)) == "number" then
+ luci.http.write("[ ")
+ for k, v in ipairs(x) do
+ jsondump(v)
+ if next(x, k) then
+ luci.http.write(", ")
+ end
+ end
+ luci.http.write(" ]")
+ else
+ luci.http.write("{ ")
+ for k, v in pairs(x) do
+ luci.http.write("%q: " % k)
+ jsondump(v)
+ if next(x, k) then
+ luci.http.write(", ")
+ end
+ end
+ luci.http.write(" }")
+ end
+ elseif type(x) == "number" or type(x) == "boolean" then
+ luci.http.write(tostring(x))
+ elseif type(x) == "string" then
+ luci.http.write("%q" % tostring(x))
+ end
+ end
+
+
+ local path = luci.dispatcher.context.requestpath
+ local dev = path[#path]
+ local iw = luci.sys.wifi.getiwinfo(dev)
+
+ if iw then
+ local f
+ local j = { }
+ for _, f in ipairs({
+ "channel", "frequency", "txpower", "bitrate", "signal", "noise",
+ "quality", "quality_max", "mode", "ssid", "bssid", "country",
+ "encryption", "mbssid_support", "ifname"
+ }) do
+ j[f] = iw[f]
+ end
+
+ luci.http.prepare_content("application/json")
+ jsondump(j)
+ return
+ end
+
+ luci.http.status(404, "No such device")
+end
m.title = ww:get_i18n(wnet)
-local iw = nil
-local tx_powers = nil
-
-m.uci:foreach("wireless", "wifi-iface",
- function(s)
- if s.device == arg[1] and not iw then
- iw = luci.sys.wifi.getiwinfo(s.ifname or s.device)
- tx_powers = iw.txpwrlist or { }
- end
- end)
+local iw = luci.sys.wifi.getiwinfo(arg[1])
+local tx_powers = iw.txpwrlist or { }
+
s = m:section(NamedSection, arg[1], "wifi-device", translate("Device Configuration"))
s.addremove = false
back.titleref = luci.dispatcher.build_url("admin", "network", "wireless")
]]
-en = s:taboption("general", Flag, "disabled", translate("enable"))
+st = s:taboption("general", DummyValue, "__status", translate("Status"))
+st.template = "admin_network/wifi_status"
+st.ifname = arg[1]
+
+en = s:taboption("general", Flag, "disabled", translate("Enable device"))
en.enabled = "0"
en.disabled = "1"
en.rmempty = false
return Flag.cfgvalue(self, section) or "0"
end
-s:taboption("general", DummyValue, "type", translate("Type"))
local hwtype = m:get(arg[1], "type")
local htcaps = m:get(arg[1], "ht_capab") and true or false
ch = s:taboption("general", Value, "channel", translate("Channel"))
ch:value("auto", translate("auto"))
for _, f in ipairs(iw and iw.freqlist or luci.sys.wifi.channels()) do
- ch:value(f.channel, "%i (%.3f GHz)" %{ f.channel, f.mhz / 1000 })
+ if not f.restricted then
+ ch:value(f.channel, "%i (%.3f GHz)" %{ f.channel, f.mhz / 1000 })
+ end
end
nasid.rmempty = true
eaptype = s:taboption("encryption", ListValue, "eap_type", translate("EAP-Method"))
- eaptype:value("TLS")
- eaptype:value("TTLS")
- eaptype:value("PEAP")
+ eaptype:value("tls")
+ eaptype:value("ttls")
+ eaptype:value("peap")
eaptype:depends({mode="sta", encryption="wpa"})
eaptype:depends({mode="sta", encryption="wpa2"})
cacert:depends({mode="sta", encryption="wpa2"})
privkey = s:taboption("encryption", FileUpload, "priv_key", translate("Path to Private Key"))
- privkey:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
- privkey:depends({mode="sta", eap_type="TLS", encryption="wpa"})
+ privkey:depends({mode="sta", eap_type="tls", encryption="wpa2"})
+ privkey:depends({mode="sta", eap_type="tls", encryption="wpa"})
privkeypwd = s:taboption("encryption", Value, "priv_key_pwd", translate("Password of Private Key"))
- privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
- privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa"})
+ privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa2"})
+ privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa"})
auth = s:taboption("encryption", Value, "auth", translate("Authentication"))
auth:value("CHAP")
auth:value("MSCHAP")
auth:value("MSCHAPV2")
- auth:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
- auth:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
- auth:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
- auth:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
+ auth:depends({mode="sta", eap_type="peap", encryption="wpa2"})
+ auth:depends({mode="sta", eap_type="peap", encryption="wpa"})
+ auth:depends({mode="sta", eap_type="ttls", encryption="wpa2"})
+ auth:depends({mode="sta", eap_type="ttls", encryption="wpa"})
identity = s:taboption("encryption", Value, "identity", translate("Identity"))
- identity:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
- identity:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
- identity:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
- identity:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
+ identity:depends({mode="sta", eap_type="peap", encryption="wpa2"})
+ identity:depends({mode="sta", eap_type="peap", encryption="wpa"})
+ identity:depends({mode="sta", eap_type="ttls", encryption="wpa2"})
+ identity:depends({mode="sta", eap_type="ttls", encryption="wpa"})
password = s:taboption("encryption", Value, "password", translate("Password"))
- password:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
- password:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
- password:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
- password:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
+ password:depends({mode="sta", eap_type="peap", encryption="wpa2"})
+ password:depends({mode="sta", eap_type="peap", encryption="wpa"})
+ password:depends({mode="sta", eap_type="ttls", encryption="wpa2"})
+ password:depends({mode="sta", eap_type="ttls", encryption="wpa"})
end
end
--- /dev/null
+<%+cbi/valueheader%>
+
+<script type="text/javascript"><![CDATA[
+ var iwxhr = new XHR();
+ window.setInterval(function() {
+ iwxhr.get('<%=luci.dispatcher.build_url("admin", "network", "wireless_status", self.ifname)%>', null,
+ function(x)
+ {
+ var iw = x.responseText ? eval('(' + x.responseText + ')') : null;
+ if (iw)
+ {
+ var is_assoc = (iw.bssid && iw.channel);
+ var p = (100 / iw.quality_max * iw.quality);
+ var q = is_assoc ? p : -1;
+
+ var icon;
+ if (q < 0)
+ icon = "<%=resource%>/icons/signal-none.png";
+ else if (q == 0)
+ icon = "<%=resource%>/icons/signal-0.png";
+ else if (q < 25)
+ icon = "<%=resource%>/icons/signal-0-25.png";
+ else if (q < 50)
+ icon = "<%=resource%>/icons/signal-25-50.png";
+ else if (q < 75)
+ icon = "<%=resource%>/icons/signal-50-75.png";
+ else
+ icon = "<%=resource%>/icons/signal-75-100.png";
+
+ var s = document.getElementById('<%=self.option%>-iw-signal');
+ if (s)
+ s.innerHTML = String.format(
+ '<img src="%s" title="Signal: %d dBm / Noise: %d dBm" /><br />' +
+ '<small>%d%%</small>', icon, iw.signal, iw.noise, p
+ );
+
+ var d = document.getElementById('<%=self.option%>-iw-description');
+ if (d && is_assoc)
+ d.innerHTML = String.format(
+ '<strong><%:Mode%>:</strong> %s |' +
+ '<strong><%:SSID%>:</strong> %s<br />' +
+ '<strong><%:BSSID%>:</strong> %s |' +
+ '<strong><%:Encryption%>:</strong> %s<br />' +
+ '<strong><%:Channel%>:</strong> %d (%.3f GHz) |' +
+ '<strong><%:Tx-Power%>:</strong> %d dBm<br />' +
+ '<strong><%:Signal%>:</strong> %d dBm |' +
+ '<strong><%:Noise%>:</strong> %d dBm<br />' +
+ '<strong><%:Bit Rate%>:</strong> %.1f MBit/s |' +
+ '<strong><%:Country%>:</strong> %s',
+ iw.mode, iw.ssid, iw.bssid,
+ iw.encryption ? iw.encryption.description : '<%:None%>',
+ iw.channel, iw.frequency ? (iw.frequency / 1000) : 0,
+ iw.txpower, iw.signal, iw.noise,
+ iw.bitrate ? (iw.bitrate / 1000) : 0, iw.country
+ );
+ else if (d)
+ d.innerHTML = '<%:Wireless is disabled or not associated%>';
+ }
+ }
+ )
+ }, 5000);
+]]></script>
+
+<table>
+ <tr class="cbi-section-table">
+ <td></td>
+ <td class="cbi-value-field" style="width:16px; padding:3px" id="<%=self.option%>-iw-signal">
+ <img src="<%=resource%>/icons/signal-none.png" title="<%:Not associated%>" /><br />
+ <small>0%</small>
+ </td>
+ <td class="cbi-value-field" style="vertical-align:middle; text-align:left; padding:3px" id="<%=self.option%>-iw-description">
+ <em><%:Collecting data...%></em>
+ </td>
+ </tr>
+</table>
+
+<%+cbi/valuefooter%>