modules/freifunk: Rewrite status as view and use iwinfo

This commit is contained in:
Manuel Munz 2010-11-26 11:01:08 +00:00
parent f1c6b2974b
commit f71776c1cd
5 changed files with 192 additions and 220 deletions

View file

@ -42,7 +42,7 @@ function index()
page.title = "Kontakt" page.title = "Kontakt"
local page = node("freifunk", "status") local page = node("freifunk", "status")
page.target = form("freifunk/public_status") page.target = template("freifunk/public_status")
page.title = i18n("Status") page.title = i18n("Status")
page.order = 20 page.order = 20
page.i18n = "base" page.i18n = "base"

View file

@ -1,217 +0,0 @@
require "luci.sys"
require "luci.tools.webadmin"
local bit = require "bit"
local uci = luci.model.uci.cursor_state()
local ffzone = luci.tools.webadmin.firewall_find_zone("freifunk")
local ffznet = ffzone and uci:get("firewall", ffzone, "network")
local ffwifs = ffznet and luci.util.split(ffznet, " ") or {}
-- System --
f = SimpleForm("system", "System")
f.submit = false
f.reset = false
local system, model, memtotal, memcached, membuffers, memfree = luci.sys.sysinfo()
local uptime = luci.sys.uptime()
f:field(DummyValue, "_system", translate("System")).value = system
f:field(DummyValue, "_cpu", translate("Processor")).value = model
local load1, load5, load15 = luci.sys.loadavg()
f:field(DummyValue, "_la", translate("Load")).value =
string.format("%.2f, %.2f, %.2f", load1, load5, load15)
f:field(DummyValue, "_memtotal", translate("Memory")).value =
string.format("%.2f MB (%.0f%% %s, %.0f%% %s, %.0f%% %s)",
tonumber(memtotal) / 1024,
100 * memcached / memtotal,
tostring(translate("cached")),
100 * membuffers / memtotal,
tostring(translate("buffered")),
100 * memfree / memtotal,
tostring(translate("free"))
)
f:field(DummyValue, "_systime", translate("Local Time")).value =
os.date("%c")
f:field(DummyValue, "_uptime", translate("Uptime")).value =
luci.tools.webadmin.date_format(tonumber(uptime))
-- Wireless --
local wireless = uci:get_all("wireless")
local wifidata = luci.sys.wifi.getiwconfig()
local ifaces = {}
for k, v in pairs(wireless) do
if v[".type"] == "wifi-iface" and (
luci.util.contains(ffwifs, v.device) or
( #ffwifs == 0 and (not v.encryption or v.encryption == "none") ) )
then
table.insert(ifaces, v)
end
end
m = SimpleForm("wireless", "Freifunk WLAN")
m.submit = false
m.reset = false
s = m:section(Table, ifaces, translate("Networks"))
link = s:option(DummyValue, "_link", translate("Link"))
function link.cfgvalue(self, section)
local ifname = self.map:get(section, "ifname")
return wifidata[ifname] and wifidata[ifname]["Link Quality"] or "-"
end
essid = s:option(DummyValue, "ssid", "ESSID")
bssid = s:option(DummyValue, "_bsiid", "BSSID")
function bssid.cfgvalue(self, section)
local ifname = self.map:get(section, "ifname")
return (wifidata[ifname] and (wifidata[ifname].Cell
or wifidata[ifname]["Access Point"])) or "-"
end
channel = s:option(DummyValue, "channel", translate("Channel"))
function channel.cfgvalue(self, section)
return wireless[self.map:get(section, "device")].channel
end
protocol = s:option(DummyValue, "_mode", translate("Protocol"))
function protocol.cfgvalue(self, section)
local mode = wireless[self.map:get(section, "device")].hwmode
return mode and "802." .. mode
end
mode = s:option(DummyValue, "mode", translate("Mode"))
encryption = s:option(DummyValue, "encryption", translate("<abbr title=\"Encrypted\">Encr.</abbr>"))
power = s:option(DummyValue, "_power", translate("Power"))
function power.cfgvalue(self, section)
local ifname = self.map:get(section, "ifname")
return wifidata[ifname] and wifidata[ifname]["Tx-Power"] or "-"
end
scan = s:option(Button, "_scan", translate("Scan"))
scan.inputstyle = "find"
function scan.cfgvalue(self, section)
return self.map:get(section, "ifname") or false
end
t2 = m:section(Table, {}, translate("<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"), translate("Wifi networks in your local environment"))
function scan.write(self, section)
t2.render = t2._render
local ifname = self.map:get(section, "ifname")
luci.util.update(t2.data, luci.sys.wifi.iwscan(ifname))
end
t2._render = t2.render
t2.render = function() end
t2:option(DummyValue, "Quality", translate("Link"))
essid = t2:option(DummyValue, "ESSID", "ESSID")
function essid.cfgvalue(self, section)
return luci.util.pcdata(self.map:get(section, "ESSID"))
end
t2:option(DummyValue, "Address", "BSSID")
t2:option(DummyValue, "Mode", translate("Mode"))
chan = t2:option(DummyValue, "channel", translate("Channel"))
function chan.cfgvalue(self, section)
return self.map:get(section, "Channel")
or self.map:get(section, "Frequency")
or "-"
end
t2:option(DummyValue, "Encryption key", translate("<abbr title=\"Encrypted\">Encr.</abbr>"))
t2:option(DummyValue, "Signal level", translate("Signal"))
t2:option(DummyValue, "Noise level", translate("Noise"))
-- Routes --
r = SimpleForm("routes", "Standardrouten")
r.submit = false
r.reset = false
local routes = {}
for i, route in ipairs(luci.sys.net.routes()) do
if route.dest:prefix() == 0 then
routes[#routes+1] = route
end
end
v = r:section(Table, routes)
net = v:option(DummyValue, "iface", translate("Network"))
function net.cfgvalue(self, section)
return luci.tools.webadmin.iface_get_network(routes[section].device)
or routes[section].device
end
target = v:option(DummyValue, "target", translate("Target"))
function target.cfgvalue(self, section)
return routes[section].dest:network():string()
end
netmask = v:option(DummyValue, "netmask", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
function netmask.cfgvalue(self, section)
return routes[section].dest:mask():string()
end
gateway = v:option(DummyValue, "gateway", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"))
function gateway.cfgvalue(self, section)
return routes[section].gateway:string()
end
metric = v:option(DummyValue, "metric", translate("Metric"))
function metric.cfgvalue(self, section)
return routes[section].metric
end
local routes6 = {}
for i, route in ipairs(luci.sys.net.routes6() or {}) do
if route.dest:prefix() == 0 then
routes6[#routes6+1] = route
end
end
if #routes6 > 0 then
v6 = r:section(Table, routes6)
net = v6:option(DummyValue, "iface", translate("Network"))
function net.cfgvalue(self, section)
return luci.tools.webadmin.iface_get_network(routes6[section].device)
or routes6[section].device
end
target = v6:option(DummyValue, "target", translate("Target"))
function target.cfgvalue(self, section)
return routes6[section].dest:string()
end
gateway = v6:option(DummyValue, "gateway6", translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"))
function gateway.cfgvalue(self, section)
return routes6[section].source:string()
end
metric = v6:option(DummyValue, "metric", translate("Metric"))
function metric.cfgvalue(self, section)
local metr = routes6[section].metric
local lower = bit.band(metr, 0xffff)
local higher = bit.rshift(bit.band(metr, 0xffff0000), 16)
return "%04X%04X" % {higher, lower}
end
end
return f, m, r

View file

@ -0,0 +1,173 @@
<%
local sys = require "luci.sys"
local twa = require "luci.tools.webadmin"
-- System
local system, model, memtotal, memcached, membuffers, memfree = sys.sysinfo()
local uptime = twa.date_format(tonumber(sys.uptime()))
local_time = os.date("%c")
local load1, load5, load15 = sys.loadavg()
local load = string.format("%.2f, %.2f, %.2f", load1, load5, load15)
local memory = string.format("%.2f MB (%.0f%% %s, %.0f%% %s, %.0f%% %s)",
tonumber(memtotal) / 1024,
100 * memcached / memtotal,
tostring(translate("cached")),
100 * membuffers / memtotal,
tostring(translate("buffered")),
100 * memfree / memtotal,
tostring(translate("free"))
)
-- wireless
local uci = require "luci.model.uci".cursor()
local ntm = require "luci.model.network"
ntm.init(uci)
local devices = ntm:get_wifidevs()
local netlist = { }
local netdevs = { }
local dev
-- Routes
local defroutev4 = sys.net.defaultroute()
local defroutev6 = sys.net.defaultroute6 ()
%>
<%+header%>
<div class="cbi-map">
<h2><%:System%></h2>
<div class="cbi-section-node">
<div class="cbi-value"><label class="cbi-value-title"><%:System%></label><div class="cbi-value-field"><%=system%></div></div>
<div class="cbi-value"><label class="cbi-value-title"><%:Processor%></label><div class="cbi-value-field"><%=model%></div></div>
<div class="cbi-value"><label class="cbi-value-title"><%:Load%></label><div class="cbi-value-field"><%=load%></div></div>
<div class="cbi-value"><label class="cbi-value-title"><%:Memory%></label><div class="cbi-value-field"><%=memory%></div></div>
<div class="cbi-value"><label class="cbi-value-title"><%:Local Time%></label><div class="cbi-value-field"><%=local_time%></div></div>
<div class="cbi-value"><label class="cbi-value-title"><%:Uptime%></label><div class="cbi-value-field"><%=uptime%></div></div>
</div>
</div>
<% if devices[1] then %>
<div class="cbi-map">
<h2><%:Wireless Overview%></h2>
<div class="cbi-section">
<div class="cbi-section-node">
<table class="cbi-section-table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Signal%></th>
<th class="cbi-section-table-cell"><%:Bitrate%></th>
<th class="cbi-section-table-cell"><%:SSID%></th>
<th class="cbi-section-table-cell"><%:BSSID%></th>
<th class="cbi-section-table-cell"><%:Channel%></th>
<th class="cbi-section-table-cell"><%:Mode%></th>
<th class="cbi-section-table-cell"><%:TX%>-<%:Power%></th>
<th class="cbi-section-table-cell"><%:Interface%></th>
</tr>
<%
for _, dev in ipairs(devices) do
local net
for _, net in ipairs(dev:get_wifinets()) do
netlist[#netlist+1] = net:ifname()
netdevs[net:ifname()] = dev:name()
if net.iwdata.ifname then
local signal = net.iwinfo.signal or "N/A"
local noise = net.iwinfo.noise or "N/A"
local q = net.iwinfo.quality or "0"
local qmax = net.iwinfo.quality_max or "100"
local qperc = q / qmax * 100
if qperc == 0 then
icon = "signal-none.png"
elseif qperc < 26 then
icon = "signal-0-25.png"
elseif qperc < 51 then
icon = "signal-25-50.png"
elseif qperc < 76 then
icon = "signal-50-75.png"
elseif qperc < 100 then
icon = "signal-75-100.png"
else
icon = "signal-0.png"
end
signal_string = "<img src='"..resource.."/icons/"..icon.."' title='Signal: "..signal.." db / Noise: "..noise.." db' alt='Signal Quality'></img>"
local ssid = net.iwinfo.ssid or "N/A"
local bssid = net.iwinfo.bssid or "N/A"
local chan = net.iwinfo.channel or "N/A"
local mode = net.iwinfo.mode or "N/A"
local txpwr = net.iwinfo.txpower or "N/A"
if txpwr ~= "N/A" then
txpwr = txpwr.." dbm"
end
local bitrate = net.iwinfo.bitrate or "N/A"
if bitrate ~= "N/A" then
bitrate = ( bitrate / 1000 ).."Mb/s"
end
local interface = net.iwdata.ifname or "N/A"
%>
<tr class="cbi-section-table-row cbi-rowstyle-1">
<td class="cbi-value-field"><%=signal_string%></td>
<td class="cbi-value-field"><%=bitrate%></td>
<td class="cbi-value-field"><%=ssid%></td>
<td class="cbi-value-field"><%=bssid%></td>
<td class="cbi-value-field"><%=chan%></td>
<td class="cbi-value-field"><%=mode%></td>
<td class="cbi-value-field"><%=txpwr%></td>
<td class="cbi-value-field"><%=interface%></td>
</tr>
<% end
end
end %>
</table>
</div>
</div>
</div>
<% end %>
<div class="cbi-map">
<h2><%:Default routes%></h2>
<div class="cbi-section">
<div class="cbi-section-node">
<table class="cbi-section-table">
<% if not defroutev4 and not defroutev6 then %>
<%:No defaultroutes known.%>
<%else%>
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Network%></th>
<th class="cbi-section-table-cell"><%:Interface%></th>
<th class="cbi-section-table-cell"><%:Gateway%></th>
<th class="cbi-section-table-cell"><%:Metric%></th>
</tr>
<% if defroutev4 then %>
<tr class="cbi-section-table-row cbi-rowstyle-1">
<td class="cbi-value-field"><%=defroutev4.dest:string()%></td>
<td class="cbi-value-field"><%=defroutev4.device%></td>
<td class="cbi-value-field"><%=defroutev4.gateway:string()%></td>
<td class="cbi-value-field"><%=defroutev4.metric%></td>
</tr>
<% end
if defroutev6 then %>
<tr class="cbi-section-table-row cbi-rowstyle-2">
<td class="cbi-value-field"><%=defroutev6.dest:string()%></td>
<td class="cbi-value-field"><%=defroutev6.device%></td>
<td class="cbi-value-field"><%=defroutev6.nexthop:string()%></td>
<td class="cbi-value-field"><%=defroutev6.metric%></td>
</tr>
<% end %>
</table>
</div>
</div>
</div>
<% end %>
<%+footer%>

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2010-11-18 09:51+0100\n" "PO-Revision-Date: 2010-11-26 12:02+0100\n"
"Last-Translator: Manuel Munz <freifunk@somakoma.de>\n" "Last-Translator: Manuel Munz <freifunk@somakoma.de>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
@ -350,3 +350,11 @@ msgstr "Kontakt"
#. Please fill in your contact details below. #. Please fill in your contact details below.
msgid "Please fill in your contact details below." msgid "Please fill in your contact details below."
msgstr "Bitte gib hier deine Kontaktdaten an." msgstr "Bitte gib hier deine Kontaktdaten an."
#. Default routes
msgid "Default routes"
msgstr "Standardrouten"
#. No defaultroutes known.
msgid "No defaultroutes known."
msgstr "Es sind keine Standardrouten bekannt."

View file

@ -319,3 +319,11 @@ msgstr ""
#. Please fill in your contact details below. #. Please fill in your contact details below.
msgid "Please fill in your contact details below." msgid "Please fill in your contact details below."
msgstr "" msgstr ""
#. Default routes
msgid "Default routes"
msgstr ""
#. No defaultroutes known.
msgid "No defaultroutes known."
msgstr ""