提交 7ae988f3 编写于 作者: J Jo-Philipp Wich

modules/admin-full: rework wifi configuration

上级 1a3533cb
...@@ -41,17 +41,22 @@ function index() ...@@ -41,17 +41,22 @@ function index()
end end
if has_wifi and has_wifi.size > 0 then 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.leaf = true
page.subindex = 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 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 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 page.leaf = true
end end
...@@ -127,7 +132,7 @@ function wifi_join() ...@@ -127,7 +132,7 @@ function wifi_join()
end end
function wifi_add() function wifi_add()
local dev = luci.http.formvalue("device") local dev = luci.http.formvalue("device")
local uci = require "luci.model.uci".cursor() local uci = require "luci.model.uci".cursor()
local wlm = require "luci.model.wireless" local wlm = require "luci.model.wireless"
...@@ -156,3 +161,60 @@ function wifi_delete(network) ...@@ -156,3 +161,60 @@ function wifi_delete(network)
uci:save("wireless") uci:save("wireless")
luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless")) luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
end 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 ...@@ -58,16 +58,9 @@ end
m.title = ww:get_i18n(wnet) m.title = ww:get_i18n(wnet)
local iw = nil local iw = luci.sys.wifi.getiwinfo(arg[1])
local tx_powers = nil 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 = m:section(NamedSection, arg[1], "wifi-device", translate("Device Configuration"))
s.addremove = false s.addremove = false
...@@ -82,7 +75,11 @@ back.value = "" ...@@ -82,7 +75,11 @@ back.value = ""
back.titleref = luci.dispatcher.build_url("admin", "network", "wireless") 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.enabled = "0"
en.disabled = "1" en.disabled = "1"
en.rmempty = false en.rmempty = false
...@@ -91,7 +88,6 @@ function en.cfgvalue(self, section) ...@@ -91,7 +88,6 @@ function en.cfgvalue(self, section)
return Flag.cfgvalue(self, section) or "0" return Flag.cfgvalue(self, section) or "0"
end end
s:taboption("general", DummyValue, "type", translate("Type"))
local hwtype = m:get(arg[1], "type") local hwtype = m:get(arg[1], "type")
local htcaps = m:get(arg[1], "ht_capab") and true or false local htcaps = m:get(arg[1], "ht_capab") and true or false
...@@ -102,7 +98,9 @@ local nsantenna = m:get(arg[1], "antenna") ...@@ -102,7 +98,9 @@ local nsantenna = m:get(arg[1], "antenna")
ch = s:taboption("general", Value, "channel", translate("Channel")) ch = s:taboption("general", Value, "channel", translate("Channel"))
ch:value("auto", translate("auto")) ch:value("auto", translate("auto"))
for _, f in ipairs(iw and iw.freqlist or luci.sys.wifi.channels()) do 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 end
...@@ -626,9 +624,9 @@ if wnet then ...@@ -626,9 +624,9 @@ if wnet then
nasid.rmempty = true nasid.rmempty = true
eaptype = s:taboption("encryption", ListValue, "eap_type", translate("EAP-Method")) eaptype = s:taboption("encryption", ListValue, "eap_type", translate("EAP-Method"))
eaptype:value("TLS") eaptype:value("tls")
eaptype:value("TTLS") eaptype:value("ttls")
eaptype:value("PEAP") eaptype:value("peap")
eaptype:depends({mode="sta", encryption="wpa"}) eaptype:depends({mode="sta", encryption="wpa"})
eaptype:depends({mode="sta", encryption="wpa2"}) eaptype:depends({mode="sta", encryption="wpa2"})
...@@ -637,12 +635,12 @@ if wnet then ...@@ -637,12 +635,12 @@ if wnet then
cacert:depends({mode="sta", encryption="wpa2"}) cacert:depends({mode="sta", encryption="wpa2"})
privkey = s:taboption("encryption", FileUpload, "priv_key", translate("Path to Private Key")) 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="wpa2"})
privkey:depends({mode="sta", eap_type="TLS", encryption="wpa"}) privkey:depends({mode="sta", eap_type="tls", encryption="wpa"})
privkeypwd = s:taboption("encryption", Value, "priv_key_pwd", translate("Password of Private Key")) 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="wpa2"})
privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa"}) privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa"})
auth = s:taboption("encryption", Value, "auth", translate("Authentication")) auth = s:taboption("encryption", Value, "auth", translate("Authentication"))
...@@ -650,23 +648,23 @@ if wnet then ...@@ -650,23 +648,23 @@ if wnet then
auth:value("CHAP") auth:value("CHAP")
auth:value("MSCHAP") auth:value("MSCHAP")
auth:value("MSCHAPV2") auth:value("MSCHAPV2")
auth:depends({mode="sta", eap_type="PEAP", encryption="wpa2"}) auth:depends({mode="sta", eap_type="peap", encryption="wpa2"})
auth:depends({mode="sta", eap_type="PEAP", encryption="wpa"}) 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="wpa2"})
auth:depends({mode="sta", eap_type="TTLS", encryption="wpa"}) auth:depends({mode="sta", eap_type="ttls", encryption="wpa"})
identity = s:taboption("encryption", Value, "identity", translate("Identity")) 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="wpa2"})
identity:depends({mode="sta", eap_type="PEAP", encryption="wpa"}) 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="wpa2"})
identity:depends({mode="sta", eap_type="TTLS", encryption="wpa"}) identity:depends({mode="sta", eap_type="ttls", encryption="wpa"})
password = s:taboption("encryption", Value, "password", translate("Password")) 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="wpa2"})
password:depends({mode="sta", eap_type="PEAP", encryption="wpa"}) 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="wpa2"})
password:depends({mode="sta", eap_type="TTLS", encryption="wpa"}) password:depends({mode="sta", eap_type="ttls", encryption="wpa"})
end end
end end
......
<%+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%>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册