modules/admin-full: rework wifi configuration
This commit is contained in:
parent
1a3533cb86
commit
7ae988f342
3 changed files with 173 additions and 36 deletions
|
@ -41,17 +41,22 @@ function index()
|
|||
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
|
||||
|
||||
local page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil, 16)
|
||||
page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil, 16)
|
||||
page.leaf = true
|
||||
|
||||
local page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil, 16)
|
||||
page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil, 16)
|
||||
page.leaf = true
|
||||
|
||||
page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil, 16)
|
||||
page.leaf = true
|
||||
end
|
||||
|
||||
|
@ -127,7 +132,7 @@ function wifi_join()
|
|||
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"
|
||||
|
||||
|
@ -156,3 +161,60 @@ function wifi_delete(network)
|
|||
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
|
||||
|
|
|
@ -58,16 +58,9 @@ end
|
|||
m.title = ww:get_i18n(wnet)
|
||||
|
||||
|
||||
local iw = nil
|
||||
local tx_powers = nil
|
||||
local iw = luci.sys.wifi.getiwinfo(arg[1])
|
||||
local tx_powers = iw.txpwrlist or { }
|
||||
|
||||
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)
|
||||
|
||||
s = m:section(NamedSection, arg[1], "wifi-device", translate("Device Configuration"))
|
||||
s.addremove = false
|
||||
|
@ -82,7 +75,11 @@ back.value = ""
|
|||
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
|
||||
|
@ -91,7 +88,6 @@ function en.cfgvalue(self, section)
|
|||
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
|
||||
|
@ -102,7 +98,9 @@ local nsantenna = m:get(arg[1], "antenna")
|
|||
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
|
||||
|
||||
|
||||
|
@ -626,9 +624,9 @@ if wnet then
|
|||
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"})
|
||||
|
||||
|
@ -637,12 +635,12 @@ if wnet then
|
|||
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"))
|
||||
|
@ -650,23 +648,23 @@ if wnet then
|
|||
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
|
||||
|
||||
|
|
77
modules/admin-full/luasrc/view/admin_network/wifi_status.htm
Normal file
77
modules/admin-full/luasrc/view/admin_network/wifi_status.htm
Normal file
|
@ -0,0 +1,77 @@
|
|||
<%+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%>
|
Loading…
Reference in a new issue