diff options
-rw-r--r-- | applications/luci-olsr/luasrc/controller/olsr.lua | 136 | ||||
-rw-r--r-- | applications/luci-olsr/luasrc/view/status-olsr/neighbors.htm | 52 |
2 files changed, 137 insertions, 51 deletions
diff --git a/applications/luci-olsr/luasrc/controller/olsr.lua b/applications/luci-olsr/luasrc/controller/olsr.lua index 20bf25ba1c..4623f132c1 100644 --- a/applications/luci-olsr/luasrc/controller/olsr.lua +++ b/applications/luci-olsr/luasrc/controller/olsr.lua @@ -9,7 +9,7 @@ function index() local uci = luci.model.uci.cursor_state() uci:foreach("olsrd", "olsrd", function(s) - if s.SmartGateway and s.SmartGateway == "yes" then has_smartgw = true end + if s.SmartGateway and s.SmartGateway == "yes" then has_smartgw = true end end) local page = node("admin", "status", "olsr") @@ -56,9 +56,9 @@ function index() end local page = node("admin", "status", "olsr", "interfaces") - page.target = call("action_interfaces") - page.title = _("Interfaces") - page.order = 70 + page.target = call("action_interfaces") + page.title = _("Interfaces") + page.order = 70 local ol = entry( {"admin", "services", "olsrd"}, @@ -84,7 +84,7 @@ function index() odsp = entry( {"admin", "services", "olsrd", "display"}, cbi("olsr/olsrddisplay"), _("Display") - ) + ) oplg.leaf = true oplg.subindex = true @@ -106,8 +106,8 @@ function action_json() local http = require "luci.http" local utl = require "luci.util" - local jsonreq4 = utl.exec("echo /status | nc 127.0.0.1 9090") - local jsonreq6 = utl.exec("echo /status | nc ::1 9090") + local jsonreq4 = utl.exec("echo /status | nc 127.0.0.1 9090") + local jsonreq6 = utl.exec("echo /status | nc ::1 9090") http.prepare_content("application/json") if #jsonreq4 < 1 then @@ -130,7 +130,16 @@ function action_neigh(json) local uci = require "luci.model.uci".cursor_state() local resolve = uci:get("luci_olsr", "general", "resolve") - luci.sys.net.routes(function(r) if r.dest:prefix() == 0 then defaultgw = r.gateway:string() end end) + local ntm = require "luci.model.network".init() + local devices = ntm:get_wifidevs() + local sys = require "luci.sys" + local assoclist = {} + + luci.sys.net.routes(function(r) + if r.dest:prefix() == 0 then + defaultgw = r.gateway:string() + end + end) local function compare(a,b) if a.proto == b.proto then @@ -140,13 +149,80 @@ function action_neigh(json) end end + for _, dev in ipairs(devices) do + for _, net in ipairs(dev:get_wifinets()) do + assoclist[#assoclist+1] = {} + assoclist[#assoclist]['ifname'] = net.iwdata.ifname + assoclist[#assoclist]['network'] = net.iwdata.network + assoclist[#assoclist]['device'] = net.iwdata.device + assoclist[#assoclist]['list'] = net.iwinfo.assoclist + end + end + for k, v in ipairs(data) do + local interface + local snr = 1 + local signal = 1 + local noise = 1 + local arptable = sys.net.arptable() + local mac + local rmac + local lmac + local ip + if resolve == "1" then hostname = nixio.getnameinfo(v.remoteIP, nil, 100) if hostname then v.hostname = hostname end end + if v.proto == '4' then + uci:foreach("network", "interface",function(vif) + if vif.ipaddr and vif.ipaddr == v.localIP then + interface = vif['.name'] or vif.interface + lmac = string.lower(vif.macaddr or "") + return + end + end) + for _, arpt in ipairs(arptable) do + ip = arpt['IP address'] + if ip == v.remoteIP then + rmac = string.lower(arpt['HW address'] or "") + end + end + for _, val in ipairs(assoclist) do + if val.network == interface and val.list then + for assocmac, assot in pairs(val.list) do + assocmac = string.lower(assocmac or "") + if rmac == assocmac then + signal = tonumber(assot.signal) + noise = tonumber(assot.noise) + snr = signal/noise + end + end + end + end + elseif v.proto == '6' then + uci:foreach("network", "interface",function(vif) + if vif.ip6addr and string.gsub(vif.ip6addr, "/64", "") == v.localIP then + interface = vif['.name'] or vif.interface + return + end + end) + end + if interface then + v.interface = interface + end + v.snr = snr + v.signal = signal + v.noise = noise + if rmac then + v.remoteMAC = rmac + end + if lmac then + v.localMAC = lmac + end + if defaultgw == v.remoteIP then v.defaultgw = 1 end @@ -229,7 +305,7 @@ function action_hna() end end if v.validityTime then - v.validityTime = tonumber(string.format("%.0f", v.validityTime / 1000)) + v.validityTime = tonumber(string.format("%.0f", v.validityTime / 1000)) end end @@ -289,12 +365,13 @@ end -- Internal function fetch_jsoninfo(otable) + local uci = require "luci.model.uci".cursor_state() local utl = require "luci.util" local json = require "luci.json" - local jsonreq4 = utl.exec("echo /" .. otable .. " | nc 127.0.0.1 9090") - local jsondata4 = {} - local jsonreq6 = utl.exec("echo /" .. otable .. " | nc ::1 9090") - local jsondata6 = {} + local jsonreq4 = utl.exec("echo /" .. otable .. " | nc 127.0.0.1 9090") + local jsondata4 = {} + local jsonreq6 = utl.exec("echo /" .. otable .. " | nc ::1 9090") + local jsondata6 = {} local data4 = {} local data6 = {} local has_v4 = False @@ -305,36 +382,37 @@ function fetch_jsoninfo(otable) return nil, 0, 0, true end - if #jsonreq4 ~= 0 then + if #jsonreq4 ~= 0 then has_v4 = 1 - jsondata4 = json.decode(jsonreq4) + jsondata4 = json.decode(jsonreq4) if otable == 'status' then - data4 = jsondata4 + data4 = jsondata4 or {} else - data4 = jsondata4[otable] + data4 = jsondata4[otable] or {} end - for k, v in ipairs(data4) do - data4[k]['proto'] = '4' + for k, v in ipairs(data4) do + data4[k]['proto'] = '4' end - end - if #jsonreq6 ~= 0 then + + end + if #jsonreq6 ~= 0 then has_v6 = 1 - jsondata6 = json.decode(jsonreq6) + jsondata6 = json.decode(jsonreq6) if otable == 'status' then - data6 = jsondata6 + data6 = jsondata6 or {} else - data6 = jsondata6[otable] + data6 = jsondata6[otable] or {} end - for k, v in ipairs(data6) do - data6[k]['proto'] = '6' - end - end + for k, v in ipairs(data6) do + data6[k]['proto'] = '6' + end + end for k, v in ipairs(data6) do table.insert(data4, v) end - return data4, has_v4, has_v6, false + return data4, has_v4, has_v6, false end diff --git a/applications/luci-olsr/luasrc/view/status-olsr/neighbors.htm b/applications/luci-olsr/luasrc/view/status-olsr/neighbors.htm index 4d84241fbd..ab61fb5b4b 100644 --- a/applications/luci-olsr/luasrc/view/status-olsr/neighbors.htm +++ b/applications/luci-olsr/luasrc/view/status-olsr/neighbors.htm @@ -3,7 +3,7 @@ LuCI - Lua Configuration Interface Copyright 2008 Steven Barth <steven@midlink.org> Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net> Copyright 2011 Manuel Munz <freifunk at somakoma dot de> - + 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 @@ -31,11 +31,17 @@ if luci.http.formvalue("status") == "1" then rv[#rv+1] = { rip = link.remoteIP, + rmac = link.remoteMAC, hn = link.hostname, lip = link.localIP, + lmac = link.localMAC, + ifn = link.interface, lq = string.format("%.3f", link.linkQuality), nlq = string.format("%.3f",link.neighborLinkQuality), cost = string.format("%.3f", link.linkCost), + snr = string.format("%.3f", link.snr), + signal = string.format("%.3f", link.signal), + noise = string.format("%.3f", link.noise), color = color, dfgcolor = defaultgw_color, proto = link.proto @@ -66,36 +72,36 @@ end if (neigh.proto == '6') { s += String.format( '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' + - '<td class="cbi-section-table-cell" style="background-color:%s"><a href="http://[%s]/cgi-bin-status.html">%s</a></td>', - neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip + '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://[%s]/cgi-bin-status.html">%s/%s</a></td>', + neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip, neigh.rmac ); } else { s += String.format( '<tr class="cbi-section-table-row cbi-rowstyle-'+(1 + (idx % 2))+' proto-%s">' + - '<td class="cbi-section-table-cell" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>', - neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip + '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s/%s</a></td>', + neigh.proto, neigh.dfgcolor, neigh.rip, neigh.rip, neigh.rmac ); } if (neigh.hn) { - s += String.format( - '<td class="cbi-section-table-cell" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>', + s += String.format( + '<td class="cbi-section-table-titles" style="background-color:%s"><a href="http://%s/cgi-bin-status.html">%s</a></td>' + neigh.dfgcolor, neigh.hn, neigh.hn ); } else { s += String.format( - '<td class="cbi-section-table-cell" style="background-color:%s">?</td>', + '<td class="cbi-section-table-titles" style="background-color:%s">?</td>', neigh.dfgcolor ); } s += String.format( - '<td class="cbi-section-table-cell" style="background-color:%s">%s</td>' + - '<td class="cbi-section-table-cell" style="background-color:%s">%s</td>' + - '<td class="cbi-section-table-cell" style="background-color:%s">%s</td>' + - '<td class="cbi-section-table-cell" style="background-color:%s">%s</td>' + - '</tr>', - - neigh.dfgcolor, neigh.lip, neigh.dfgcolor, neigh.lq, neigh.dfgcolor, neigh.nlq, neigh.color, neigh.cost || '?' + '<td class="cbi-section-table-titles" style="background-color:%s">%s/%s/%s</td>' + + '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' + + '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' + + '<td class="cbi-section-table-titles" style="background-color:%s">%s</td>' + + '<td class="cbi-section-table-titles" style="background-color:%s" title="Signal: %s Noise: %s">%s</td>' + + '</tr>', + neigh.dfgcolor, neigh.ifn, neigh.lip, neigh.lmac, neigh.dfgcolor, neigh.lq, neigh.dfgcolor, neigh.nlq, neigh.color, neigh.cost, neigh.color, neigh.signal, neigh.noise, neigh.snr || '?' ); } @@ -122,6 +128,7 @@ end <th class="cbi-section-table-cell">LQ</th> <th class="cbi-section-table-cell">NLQ</th> <th class="cbi-section-table-cell">ETX</th> + <th class="cbi-section-table-cell">SNR</th> </tr> </thead> @@ -143,15 +150,16 @@ end <tr class="cbi-section-table-row cbi-rowstyle-<%=i%> proto-<%=link.proto%>"> <% if link.proto == "6" then %> - <td class="cbi-section-table-cell" style="background-color:<%=defaultgw_color%>"><a href="http://[<%=link.remoteIP%>]/cgi-bin-status.html"><%=link.remoteIP%></a></td> + <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://[<%=link.remoteIP%>]/cgi-bin-status.html"><%=link.remoteIP%>/<%=link.remoteMAC%></a></td> <% else %> - <td class="cbi-section-table-cell" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.remoteIP%>/cgi-bin-status.html"><%=link.remoteIP%></a></td> + <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.remoteIP%>/cgi-bin-status.html"><%=link.remoteIP%>/<%=link.remoteMAC%></a></td> <% end %> - <td class="cbi-section-table-cell" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.hostname%>/cgi-bin-status.html"><%=link.hostname%></a></td> - <td class="cbi-section-table-cell" style="background-color:<%=defaultgw_color%>"><%=link.localIP%></td> - <td class="cbi-section-table-cell" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.linkQuality)%></td> - <td class="cbi-section-table-cell" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.neighborLinkQuality)%></td> - <td class="cbi-section-table-cell" style="background-color:<%=color%>"><%=string.format("%.3f", link.linkCost)%></td> + <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><a href="http://<%=link.hostname%>/cgi-bin-status.html"><%=link.hostname%></a></td> + <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=link.interface%>/<%=link.localIP%>/<%=link.localMAC%></td> + <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.linkQuality)%></td> + <td class="cbi-section-table-titles" style="background-color:<%=defaultgw_color%>"><%=string.format("%.3f", link.neighborLinkQuality)%></td> + <td class="cbi-section-table-titles" style="background-color:<%=color%>"><%=string.format("%.3f", link.linkCost)%></td> + <td class="cbi-section-table-titles" style="background-color:<%=color%>" title="Signal: <%=string.format("%.3f", link.signal)%> Noise: <%=string.format("%.3f", link.noise)%>"><%=string.format("%.3f", link.snr)%></td> </tr> <% i = ((i % 2) + 1) |