2009-09-26 11:10:01 +00:00
< %#
LuCI - Lua Configuration Interface
Copyright 2008-2009 Steven Barth < steven @ midlink . org >
Copyright 2008-2009 Jo-Philipp Wich < xm @ leipzig . freifunk . net >
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
$Id$
-%>
< %-
local sys = require "luci.sys"
local utl = require "luci.util"
local uci = require "luci.model.uci".cursor_state()
function guess_wifi_hw(ifname)
local name, idx = ifname:match("^([a-z]+)(%d+)")
idx = tonumber(idx)
-- wl.o
if name == "wl" then
local name = "Broadcom 802.11 Wireless Controller"
local nm = 0
local fd = nixio.open("/proc/bus/pci/devices", "r")
if fd then
local ln
for ln in fd:linesource() do
if ln:match("wl$") then
if nm == idx then
local version = ln:match("^%S+%s+%S%S%S%S([0-9a-f]+)")
name = string.format(
"Broadcom BCM%04x 802.11 Wireless Controller",
tonumber(version, 16)
)
break
else
nm = nm + 1
end
end
end
fd:close()
end
return name
-- madwifi
elseif name == "ath" or name == "wifi" then
return "Atheros 802.11 Wireless Controller"
-- ralink
elseif name == "ra" then
return "RaLink 802.11 Wireless Controller"
-- prism?
elseif name == "eth" then
return "Prism 802.11 Wireless Controller"
-- dunno yet
else
return "Unkown 802.11 Wireless Controller"
end
end
function guess_wifi_signal(info)
local snr = -1 * ((info.noise or 0) - (info.signal or 0))
local scale = math.floor(snr / 5)
local icon
if not info.bssid or info.bssid == "00:00:00:00:00:00" then
icon = resource .. "/icons/signal-none.png"
elseif scale < 1 then
icon = resource .. "/icons/signal-0.png"
elseif scale < 2 then
icon = resource .. "/icons/signal-0-25.png"
elseif scale < 3 then
icon = resource .. "/icons/signal-25-50.png"
elseif scale < 4 then
icon = resource .. "/icons/signal-50-75.png"
else
icon = resource .. "/icons/signal-75-100.png"
end
return icon
end
function percent_wifi_signal(info)
local qc = info.quality or 0
local qm = info.quality_max or 0
if info.bssid and qc > 0 and qm > 0 then
return math.floor((100 / qm) * qc)
else
return 0
end
end
function find_wifi_devices()
local devs = { }
uci:foreach("wireless", "wifi-device",
function(s)
local dev = s['.name']
local act = 0
devs[dev] = { active = 0, networks = { } }
uci:foreach("wireless", "wifi-iface",
function(s)
if s.device == dev then
if s.up == "1" then act = act + 1 end
devs[dev].networks[#devs[dev].networks+1] = {
active = (s.up == "1"),
ifname = s.ifname,
info = sys.wifi.getiwinfo(s.ifname or s.device)
}
end
end)
devs[dev].hwname = guess_wifi_hw(dev)
devs[dev].active = (act > 0)
end)
return devs
end
function find_wifi_frequency(state)
2009-09-26 14:00:23 +00:00
if state and state.active and state.networks[1] and state.networks[1].info then
2009-09-26 11:10:01 +00:00
return string.format("%d (%.03f GHz)",
state.networks[1].info.channel,
state.networks[1].info.frequency / 1000);
else
return "n/a"
end
end
local devices = find_wifi_devices()
local arpcache = { }
sys.net.arptable(function(e) arpcache[e["HW address"]] = e["IP address"] end)
-%>
< %+header%>
< h2 > < a id = "content" name = "content" > < %:a_s_iw_overview Wireless Overview%>< / a > < / h2 >
< div class = "cbi-map" >
< % for dev, state in utl.kspairs(devices) do %>
<!-- device <%=dev%> -->
< fieldset class = "cbi-section" >
< table class = "cbi-section-table" style = "margin:10px; empty-cells:hide" >
<!-- physical device -->
< tr >
< td style = "width:34px" > < img src = "<%=resource%>/icons/wifi<%=state.active and " " or " _disabled " % > .png" style="float:left; margin-right:10px" />< / td >
< td colspan = "2" style = "text-align:left" >
< big > < strong > < %=state.hwname%> (< %=dev%>)< / strong > < / big > < br / >
< strong > Channel:< / strong > < %=find_wifi_frequency(state)%> |
2009-09-26 14:00:23 +00:00
< strong > Bitrate:< / strong > < %=(state and state.networks[1]) and (state.networks[1].info.bitrate / 1000) .. " Mb/s" or "n/a"%>
2009-09-26 11:10:01 +00:00
< / td >
< td style = "width:40px" >
< a href = "<%=luci.dispatcher.build_url(" admin / network / wireless_join ? device = "..dev)%>" > < img style = "border:none" src = "<%=resource%>/cbi/find.gif" alt = "Find and join network" title = "Find and join network" / > < / a >
< a href = "#" > < img style = "border:none" src = "<%=resource%>/cbi/add.gif" alt = "Provide new network" title = "Provide new network" / > < / a >
< / td >
< / tr >
<!-- /physical device -->
<!-- network list -->
< % if #state.networks > 0 then %>
< % for i, net in ipairs(state.networks) do %>
< tr class = "cbi-section-table-row cbi-rowstyle-<%=1 + ((i-1) % 2)%>" >
< td > < / td >
< td class = "cbi-value-field" style = "width:16px; padding:3px" >
< img src = "<%=guess_wifi_signal(net.info)%>" title = "Signal: <%=net.info.signal%> dBm / Noise: <%=net.info.noise%> dBm" / > < br / >
< small > < %=percent_wifi_signal(net.info)%>%< / small >
< / td >
< td class = "cbi-value-field" style = "vertical-align:middle; text-align:left; padding:3px" >
< strong > SSID:< / strong > < %=utl.pcdata(net.info.ssid)%> |
< strong > Mode:< / strong > < %=net.info.mode%>< br / >
< strong > BSSID:< / strong > < %=net.info.bssid%> |
< strong > Encryption:< / strong > < %=net.info.enctype%>
< / td >
< td class = "cbi-value-field" style = "width:40px" >
< a href = "<%=REQUEST_URI%>/<%=dev%>" > < img style = "border:none" src = "<%=resource%>/cbi/edit.gif" alt = "Edit this network" title = "Edit this network" / > < / a >
< a href = "#" > < img style = "border:none" src = "<%=resource%>/cbi/remove.gif" alt = "Delete this network" title = "Delete this network" / > < / a >
< / td >
< / tr >
< % end %>
< % else %>
< tr class = "cbi-section-table-row cbi-rowstyle-2" >
< td > < / td >
< td colspan = "3" class = "cbi-value-field" style = "vertical-align:middle; text-align:left; padding:3px" >
< em > (No network configured on this device)< / em >
< / td >
< / tr >
< % end %>
<!-- /network list -->
< / table >
< / fieldset >
<!-- /device <%=dev%> -->
< % end %>
< h2 > < a id = "content" name = "content" > < %:a_s_iw_overview2 Associated Stations%>< / a > < / h2 >
< fieldset class = "cbi-section" >
< table class = "cbi-section-table" style = "margin:10px; width:50%" >
< tr class = "cbi-section-table-titles" >
< th class = "cbi-section-table-cell" > < / th >
< th class = "cbi-section-table-cell" > SSID< / th >
< th class = "cbi-section-table-cell" > MAC< / th >
< th class = "cbi-section-table-cell" > Address< / th >
< th class = "cbi-section-table-cell" > Signal< / th >
< th class = "cbi-section-table-cell" > Noise< / th >
< / tr >
< % local count = -1 %>
< % for dev, state in utl.kspairs(devices) do %>
< % for _, net in ipairs(state.networks) do %>
< % for mac, info in utl.kspairs(net.info.assoclist) do info.bssid = mac; count = count + 1 %>
< tr class = "cbi-section-table-row cbi-rowstyle-<%=1 + (count % 2)%>" >
< td class = "cbi-value-field" > < img src = "<%=guess_wifi_signal(info)%>" title = "Signal: <%=info.signal%> dBm / Noise: <%=info.noise%> dBm" / > < / td >
< td class = "cbi-value-field" > < %=net.info.ssid%>< / td >
< td class = "cbi-value-field" > < %=mac%>< / td >
< td class = "cbi-value-field" > < %=arpcache[mac] or "n/a"%>< / td >
< td class = "cbi-value-field" > < %=info.signal%> dBm< / td >
< td class = "cbi-value-field" > < %=info.noise%> dBm< / td >
< / tr >
< % end %>
< % end %>
< % end %>
< % if count < = 0 then %>
< tr class = "cbi-section-table-row cbi-rowstyle-2" >
< td class = "cbi-value-field" colspan = "6" >
< em > No information available< / em >
< / td >
< / tr >
< % end %>
< / table >
< / fieldset >
< / div >
< %+footer%>