Merry christmas! Redesign of JavaScript code and many other things (graph, nodes view, etc.)

This commit is contained in:
p4u 2012-12-25 02:10:30 +01:00
parent 0f2f0dc943
commit 53da163724
17 changed files with 875 additions and 95 deletions

View file

@ -28,6 +28,7 @@ function index()
local place = {} local place = {}
local ucim = require "luci.model.uci" local ucim = require "luci.model.uci"
local uci = ucim.cursor() local uci = ucim.cursor()
-- checking if ignore is on -- checking if ignore is on
if uci:get("luci-bmx6","luci","ignore") == "1" then if uci:get("luci-bmx6","luci","ignore") == "1" then
return nil return nil
@ -47,28 +48,34 @@ function index()
-- Starting with the pages -- Starting with the pages
--------------------------- ---------------------------
--- neighbours/descriptions (default) --- status (default)
entry(place,call("action_neighbours_j"),place[#place]) entry(place,call("action_status_j"),place[#place])
table.insert(place,"neighbours_nojs") -- not visible
entry(place, call("action_neighbours"), nil) table.insert(place,"nodes_nojs")
entry(place, call("action_nodes"), nil)
table.remove(place) table.remove(place)
--- status (this is default one) --- nodes
table.insert(place,"Status") table.insert(place,"Nodes")
entry(place,call("action_status"),"Status") entry(place,call("action_nodes_j"),"Nodes",1)
table.remove(place) table.remove(place)
--- links --- links
table.insert(place,"Links") table.insert(place,"Links")
entry(place,call("action_links"),"Links").leaf = true entry(place,call("action_links"),"Links",2).leaf = true
table.remove(place) table.remove(place)
-- Gateways -- Tunnels
table.insert(place,"Gateways") table.insert(place,"Tunnels")
entry(place,call("action_gateways_j"),"Gateways").leaf = true entry(place,call("action_tunnels_j"), "Tunnels", 3).leaf = true
table.remove(place) table.remove(place)
-- Gateways (deprecated)
--table.insert(place,"Gateways")
--entry(place,call("action_gateways_j"),"Gateways").leaf = true
--table.remove(place)
--- chat --- chat
table.insert(place,"Chat") table.insert(place,"Chat")
entry(place,call("action_chat"),"Chat") entry(place,call("action_chat"),"Chat")
@ -76,7 +83,7 @@ function index()
--- Graph --- Graph
table.insert(place,"Graph") table.insert(place,"Graph")
entry(place, template("bmx6/graph"), "Graph") entry(place, template("bmx6/graph",4), "Graph")
table.remove(place) table.remove(place)
--- Topology (hidden) --- Topology (hidden)
@ -86,22 +93,30 @@ function index()
--- configuration (CBI) --- configuration (CBI)
table.insert(place,"Configuration") table.insert(place,"Configuration")
entry(place, cbi("bmx6/main"), "Configuration").dependent=false entry(place, cbi("bmx6/main"), "Configuration",6).dependent=false
table.insert(place,"General")
entry(place, cbi("bmx6/main"), "General",1)
table.remove(place)
table.insert(place,"Advanced") table.insert(place,"Advanced")
entry(place, cbi("bmx6/advanced"), "Advanced") entry(place, cbi("bmx6/advanced"), "Advanced",5)
table.remove(place) table.remove(place)
table.insert(place,"Interfaces") table.insert(place,"Interfaces")
entry(place, cbi("bmx6/interfaces"), "Interfaces") entry(place, cbi("bmx6/interfaces"), "Interfaces",2)
table.remove(place)
table.insert(place,"Tunnels")
entry(place, cbi("bmx6/tunnels"), "Tunnels",3)
table.remove(place) table.remove(place)
table.insert(place,"Plugins") table.insert(place,"Plugins")
entry(place, cbi("bmx6/plugins"), "Plugins") entry(place, cbi("bmx6/plugins"), "Plugins",6)
table.remove(place) table.remove(place)
table.insert(place,"HNA") table.insert(place,"HNAv6")
entry(place, cbi("bmx6/hna"), "HNA") entry(place, cbi("bmx6/hna"), "HNAv6",4)
table.remove(place) table.remove(place)
table.remove(place) table.remove(place)
@ -119,7 +134,12 @@ function action_status()
end end
end end
function action_neighbours() function action_status_j()
luci.template.render("bmx6/status_j", {})
end
function action_nodes()
local orig_list = bmx6json.get("originators").originators or nil local orig_list = bmx6json.get("originators").originators or nil
if orig_list == nil then if orig_list == nil then
@ -143,38 +163,27 @@ function action_neighbours()
name = o.name name = o.name
end end
--Not sure about that, but trying to find main ipv4 from HNA6 published by each node table.insert(originators,{name=name,orig=orig,desc=desc})
if desc.DESC_ADV ~= nil then
for _,h in ipairs(desc.DESC_ADV.extensions[2].HNA6_EXTENSION) do
if h ~= nil and string.find(h.address,"::ffff:") then
ipv4=string.gsub(h.address,"::ffff:","")
break
end
end
end end
if ipv4 == "" then luci.template.render("bmx6/nodes", {originators=originators})
ipv4="0.0.0.0"
end
table.insert(originators,{name=name,ipv4=ipv4,orig=orig,desc=desc})
end
luci.template.render("bmx6/neighbours", {originators=originators})
end end
function action_neighbours_j() function action_nodes_j()
local http = require "luci.http" local http = require "luci.http"
local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/neighbours_nojs' local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/nodes_nojs'
luci.template.render("bmx6/neighbours_j", {link_non_js=link_non_js}) luci.template.render("bmx6/nodes_j", {link_non_js=link_non_js})
end end
function action_gateways_j() function action_gateways_j()
luci.template.render("bmx6/gateways_j", {}) luci.template.render("bmx6/gateways_j", {})
end end
function action_tunnels_j()
luci.template.render("bmx6/tunnels_j", {})
end
function action_links(host) function action_links(host)
local links = bmx6json.get("links", host) local links = bmx6json.get("links", host)
@ -199,19 +208,34 @@ function action_topology()
local originators = bmx6json.get("originators/all") local originators = bmx6json.get("originators/all")
local o,i,l,i2 local o,i,l,i2
local first = true local first = true
luci.http.prepare_content("application/json") local topology = '[ '
luci.http.write('[ ') local cache = '/tmp/bmx6-topology.json'
local offset = 60
local cachefd = io.open(cache,r)
local update = false
if cachefd ~= nil then
local lastupdate = tonumber(cachefd:read("*line")) or 0
if os.time() >= lastupdate + offset then
update = true
else
topology = cachefd:read("*all")
end
cachefd:close()
end
if cachefd == nil or update then
for i,o in ipairs(originators) do for i,o in ipairs(originators) do
local links = bmx6json.get("links",o.primaryIp) local links = bmx6json.get("links",o.primaryIp)
if links then if links then
if first then if first then
first = false first = false
else else
luci.http.write(', ') topology = topology .. ', '
end end
luci.http.write('{ "globalId": "%s", "links": [' %o.globalId:match("^[^%.]+")) topology = topology .. '{ "globalId": "%s", "links": [' %o.globalId:match("^[^%.]+")
local first2 = true local first2 = true
@ -219,19 +243,30 @@ function action_topology()
if first2 then if first2 then
first2 = false first2 = false
else else
luci.http.write(', ') topology = topology .. ', '
end end
luci.http.write('{ "globalId": "%s", "rxRate": %s, "txRate": %s }' topology = topology .. '{ "globalId": "%s", "rxRate": %s, "txRate": %s }'
%{ l.globalId:match("^[^%.]+"), l.rxRate, l.txRate }) %{ l.globalId:match("^[^%.]+"), l.rxRate, l.txRate }
end end
luci.http.write(']}') topology = topology .. ']}'
end end
end end
luci.http.write(' ]')
topology = topology .. ' ]'
-- Upgrading the content of the cache file
cachefd = io.open(cache,'w+')
cachefd:write(os.time()..'\n')
cachefd:write(topology)
cachefd:close()
end
luci.http.prepare_content("application/json")
luci.http.write(topology)
end end

View file

@ -163,3 +163,57 @@ function wget(url, timeout)
end end
end end
function getOptions(name)
-- Getting json and Checking if bmx6-json is avaiable
local options = get("options")
if options == nil or options.OPTIONS == nil then
m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
return nil
else
options = options.OPTIONS
end
-- Filtering by the option name
local i,_
local namedopt = nil
if name ~= nil then
for _,i in ipairs(options) do
if i.name == name and i.CHILD_OPTIONS ~= nil then
namedopt = i.CHILD_OPTIONS
break
end
end
end
return namedopt
end
-- Rturns a help string formated to be used in HTML scope
function getHtmlHelp(opt)
if opt == nil then return nil end
local help = ""
if opt.help ~= nil then
help = text2html(opt.help)
end
if opt.syntax ~= nil then
help = help .. "<br/><b>Syntax: </b>" .. text2html(opt.syntax)
end
return help
end
function testandreload()
local test = sys.call('bmx6 -c --test > /tmp/bmx6-luci.err.tmp')
if test ~= 0 then
return sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
if err ~= 0 then
return sys.exec("cat /tmp/bmx6-luci.err.tmp")
end
return nil
end

View file

@ -23,18 +23,18 @@ local sys = require("luci.sys")
m = Map("bmx6", "bmx6") m = Map("bmx6", "bmx6")
local hna = m:section(TypedSection,"hna","HNA") local hna = m:section(TypedSection,"hna","IPv6 HNA")
hna.addremove = true hna.addremove = true
hna.anonymous = false hna.anonymous = true
local hna_option = hna:option(Value,"hna", "Host Network Announcement") local hna_option = hna:option(Value,"hna", "Host Network Announcement IPv6")
function hna_option:validate(value) --function hna_option:validate(value)
local err = sys.call('bmx6 -c --test -a ' .. value) -- local err = sys.call('bmx6 -c --test -a ' .. value)
if err ~= 0 then -- if err ~= 0 then
return nil -- return nil
end -- end
return value -- return value
end --end
function m.on_commit(self,map) function m.on_commit(self,map)
local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp') local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')

View file

@ -38,10 +38,10 @@ local eth_int = luci.sys.net.devices()
-- Getting the most important options from general -- Getting the most important options from general
local general = m:section(NamedSection,"general","general","General") local general = m:section(NamedSection,"general","general","General")
general.addremove = false general.addremove = false
general:option(Value,"globalPrefix","Global ip prefix","Specify global prefix for interfaces: NETADDR/LENGTH") general:option(Value,"globalPrefix","Global ip prefix","Specify global prefix for interfaces: NETADDR/LENGTH. If you are using IPv6 leave blank to let bmx6 autoassign an ULA IPv6 address.")
if m:get("ipVersion","ipVersion") == "6" then if m:get("ipVersion","ipVersion") == "6" then
general:option(Value,"tun4Address","NIIT IPv4 tunnel address","specify default IPv4 tunnel address and announced range (IP SHOULD be assigned to niit4to6 interface!)") general:option(Value,"tun4Address","IPv4 address or range","specify default IPv4 tunnel address and announced range")
end end
-- IP section -- IP section
@ -90,7 +90,7 @@ end
-- Interfaces section -- Interfaces section
local interfaces = m:section(TypedSection,"dev","Devices","") local interfaces = m:section(TypedSection,"dev","Devices","")
interfaces.addremove = true interfaces.addremove = true
interfaces.anonymous = false interfaces.anonymous = true
local intlv = interfaces:option(ListValue,"dev","Device") local intlv = interfaces:option(ListValue,"dev","Device")
for _,i in ipairs(eth_int) do for _,i in ipairs(eth_int) do

View file

@ -18,14 +18,14 @@
The full GNU General Public License is included in this distribution in The full GNU General Public License is included in this distribution in
the file called "COPYING". the file called "COPYING".
--]] --]]
local sys = require("luci.sys")
m = Map("bmx6", "bmx6") m = Map("bmx6", "bmx6")
plugins_dir = {"/usr/lib/","/var/lib","/lib"} plugins_dir = {"/usr/lib/","/var/lib","/lib"}
plugin = m:section(TypedSection,"plugin","Plugin") plugin = m:section(TypedSection,"plugin","Plugin")
plugin.addremove = true plugin.addremove = true
plugin.anonymous = false plugin.anonymous = true
plv = plugin:option(ListValue,"plugin", "Plugin") plv = plugin:option(ListValue,"plugin", "Plugin")
for _,d in ipairs(plugins_dir) do for _,d in ipairs(plugins_dir) do
@ -38,5 +38,13 @@ for _,d in ipairs(plugins_dir) do
end end
function m.on_commit(self,map)
local err = sys.call('/etc/init.d/bmx6 restart')
if err ~= 0 then
m.message = sys.exec("Cannot restart bmx6")
end
end
return m return m

View file

@ -0,0 +1,75 @@
--[[
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
--]]
local sys = require("luci.sys")
local bmx6json = require("luci.model.bmx6json")
m = Map("bmx6", "bmx6")
-- tunOut
local tunnelsOut = m:section(TypedSection,"tunOut",translate("Networks to fetch"),translate("Tunnel announcements to fetch if possible"))
tunnelsOut.addremove = true
tunnelsOut.anonymous = true
tunnelsOut:option(Value,"tunOut","Name")
tunnelsOut:option(Value,"network", translate("Network to fetch"))
local tunoptions = bmx6json.getOptions("tunOut")
local _,o
for _,o in ipairs(tunoptions) do
if o.name ~= nil and o.name ~= "network" then
help = bmx6json.getHtmlHelp(o)
value = tunnelsOut:option(Value,o.name,o.name,help)
value.optional = true
end
end
--tunIn
local tunnelsIn = m:section(TypedSection,"tunInNet",translate("Networks to offer"),translate("Tunnels to announce in the network"))
tunnelsIn.addremove = true
tunnelsIn.anonymous = true
local net = tunnelsIn:option(Value,"tunInNet", translate("Network to offer"))
net.default = "10.0.0.0/8"
local bwd = tunnelsIn:option(Value,"bandwidth",translate("Bandwidth (Bytes)"))
bwd.default = "1000000"
local tuninoptions = bmx6json.getOptions("tunInNet")
local _,o
for _,o in ipairs(tuninoptions) do
if o.name ~= nil and o.name ~= "tunInNet" and o.name ~= "bandwidth" then
help = bmx6json.getHtmlHelp(o)
value = tunnelsIn:option(Value,o.name,o.name,help)
value.optional = true
end
end
function m.on_commit(self,map)
--Not working. If test returns error the changes are still commited
local msg = bmx6json.testandreload()
if msg ~= nil then
m.message = msg
end
end
return m

View file

@ -1,15 +1,23 @@
<%# <%#
LuCI - Lua Configuration Interface Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Copyright 2012 Jo-Philipp Wich <xm@subsignal.org> Contributors Jo-Philip
Licensed under the Apache License, Version 2.0 (the "License"); This program is free software; you can redistribute it and/or modify
you may not use this file except in compliance with the License. it under the terms of the GNU General Public License as published by
You may obtain a copy of the License at the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
http://www.apache.org/licenses/LICENSE-2.0 This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
$Id$ You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
-%> -%>
<% <%
@ -26,6 +34,17 @@ $Id$
<script type="text/javascript" src="<%=resource%>/bmx6/js/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="<%=resource%>/bmx6/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="<%=resource%>/bmx6/js/dracula_graph.js"></script> <script type="text/javascript" src="<%=resource%>/bmx6/js/dracula_graph.js"></script>
<button id="redraw" onclick="redraw();">&nbsp redraw &nbsp</button>
<div id="wait" style="text-align: center">
<br /><br />
<img src="<%=resource%>/icons/loading.gif" />
<%:Collecting data...%>
</div>
<div id="canvas" style="min-width:800px; min-height:800px"></div>
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
var redraw; var redraw;
@ -54,7 +73,7 @@ $Id$
g.addEdge(data[i].globalId, data[i].links[j].globalId, g.addEdge(data[i].globalId, data[i].links[j].globalId,
{ label: rxRate + '/' + txRate, { label: rxRate + '/' + txRate,
directed: false, stroke: '#aaaaaa', fill: '#ffffff', directed: false, stroke: '#aaaaaa', fill: '#ffffff',
'label-style': { 'font-size': 10 }}); 'label-style': { 'font-size': 8 }});
seen[key] = true; seen[key] = true;
} }
} }
@ -72,6 +91,9 @@ $Id$
var layouter = new Graph.Layout.Spring(g); var layouter = new Graph.Layout.Spring(g);
layouter.layout(); layouter.layout();
var divwait = document.getElementById("wait");
divwait.parentNode.removeChild(divwait);
var renderer = new Graph.Renderer.Raphael(canvas.id, g, canvas.offsetWidth, canvas.offsetHeight); var renderer = new Graph.Renderer.Raphael(canvas.id, g, canvas.offsetWidth, canvas.offsetHeight);
renderer.draw(); renderer.draw();
@ -84,8 +106,5 @@ $Id$
); );
//]]></script> //]]></script>
<button id="redraw" onclick="redraw();">redraw</button>
<div id="canvas" style="min-width:800px; min-height:800px"></div>
<%+footer%> <%+footer%>

View file

@ -0,0 +1,87 @@
<%+header%>
<style type="text/css">
table {
width:90%;
border-top:1px solid #e5eaf8;
border-right:1px solid #e5eaf8;
margin:1em auto;
border-collapse:collapse;
}
td {
color:#678197;
border-bottom:1px solid #e6eff8;
border-left:1px solid #e6eff8;
padding:.3em 1em;
text-align:center;
}
th {
background:#f4f9fe;
text-align:center;
font:bold 1.2em/2em "Century Gothic","Trebuchet MS",Arial,Helvetica,sans-serif;
color:#66a3d3;
}
#neighbour {
position:relative;
margin:5px;
}
#orig_id {
background-color: black;
color: white;
text-ident:10px;
}
</style>
<h2><a id="content" name="content"><%:Nodes%></a></h2>
<table>
<tr>
<th scope="col">Name</th>
<th scope="col">IPv6</th>
<th scope="col">Via Dev</th>
<th scope="col">Via IP</th>
<th scope="col">Routes</th>
<th scope="col">Metric</th>
<th scope="col">Last Desc</th>
<th scope="col">Last Ref</th>
</tr>
<% for i,o in ipairs(originators) do %>
<tr>
<td><%=o.name%></td>
<td><a href="http://[<%=o.orig.primaryIp%>]"><%=o.orig.primaryIp%></a></td>
<td><%=o.orig.viaDev%></td>
<td><%=o.orig.viaIp%></td>
<td><%=o.orig.routes%></td>
<td><%=o.orig.metric%></td>
<td><%=o.orig.lastDesc%></td>
<td><%=o.orig.lastRef%></td>
</tr>
<%end%>
</table>
<table>
<tr>
<th scope="col">Node</th>
<th scope="col">Announced networks</th>
</tr>
<% for i,o in ipairs(originators) do %>
<tr>
<td><%=o.name%></td>
<td style="text-align:left;">
<% if o.desc.DESC_ADV ~= nil then %>
<% for j,h in ipairs(o.desc.DESC_ADV.extensions[2].HNA6_EXTENSION) do %>
<%=h.address%>&nbsp;&nbsp;&nbsp;&nbsp;
<% end %>
<% end %>
</td>
</tr>
<% end %>
</table>
<br />
<%+footer%>

View file

@ -0,0 +1,193 @@
<%#
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Contributors Lluis Esquerda <eskerda@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
-%>
<%+header%>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
<style>
div.hideme{
display: none;
}
div.info{
background: #FFF;
border: solid 0px;
height: 90px;
display: block;
overflow: auto;
}
div.inforow{
text-align:left;
display:inline-block;
width:20%;
margin:5px;
vertical-align:top;
}
#extra-info ul { list-style: none outside none; margin-left: 0em; }
</style>
<div class="cbi-map">
<h2>Node originators</h2>
<div class="cbi-map-descr"></div>
<div id="extra-info" class="info">
<br />
<center>
Click icon <img src="<%=resource%>/bmx6/world.png" /> to see individual node information
</center>
</div>
<fieldset class="cbi-section">
<legend><%:Mesh nodes%></legend>
<table class="cbi-section-table" id="descriptions_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"></th>
<th class="cbi-section-table-cell"><%:Hostname%></th>
<th class="cbi-section-table-cell"><%:Primary IP%></th>
<th class="cbi-section-table-cell"><%:Via Device%></th>
<th class="cbi-section-table-cell"><%:Metric%></th>
<th class="cbi-section-table-cell"><%:Last Desc%></th>
<th class="cbi-section-table-cell"><%:Last Ref%></th>
<th class="cbi-section-table-cell"><%:Blocked%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="8"><br /><center><em><%:Collecting data...%></em></center></td>
</tr>
</table>
</fieldset>
</div>
<a href="<%=link_non_js%>">Go to non JavaScript view</a>
<script type="text/javascript">//<![CDATA[
var displayExtraInfo = function ( id ) {
document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
}
new TablePooler(5,"/cgi-bin/bmx6-info", {'$neighbours':''}, "descriptions_table", function(st){
var infoicon = "<%=resource%>/bmx6/world_small.png";
var nodeicon = "<%=resource%>/bmx6/world.png";
var originators = st.neighbours[0].originators;
var descriptions = st.neighbours[1].descriptions;
var res = Array();
var error = "";
if ( originators.length != descriptions.length )
{
error = '<em><br /><%:Some problem with JSON: lenght of originators and descriptions differs. %> \
<%: Please perform a cache flush from a console it this persists: bmx6 -c --flushAll %></em>';
res.push([[error,7]]);
return res;
}
for ( var i = 0; i < descriptions.length; i++ ){
var nodename = descriptions[i].DESC_ADV.globalId.replace(/\.[^\.]+$/,"");
var extensions = descriptions[i].DESC_ADV.extensions;
//var extrainfo = '<a onclick="displayExtraInfo(\'ip-' + i + '\')"><img src="' + infoicon + '" / ></a>';
var extrainfo_link = '<a onclick="displayExtraInfo(\'ip-' + i + '\')">' + '<img src="' + infoicon + '" />' + '</a>';
// Looking for the extensions
var hna6 = [];
var tun4in6 = [];
var tun6 = [];
for( var e = 0; e < extensions.length; e++)
{
if( extensions[e].HNA6_EXTENSION )
hna6 = extensions[e].HNA6_EXTENSION;
if ( extensions[e].TUN4IN6_NET_EXTENSION )
tun4in6 = extensions[e].TUN4IN6_NET_EXTENSION;
}
// Gateways
var gateways = '<ul>';
for ( var t = 0; t < tun4in6.length; t++)
{
if ( tun4in6[t].networklen == "32" )
gateways += '<li><a href="http://' + tun4in6[t].network + '">' + tun4in6[t].network + '</a></li>';
else
gateways += "<li>"+tun4in6[t].network+'/'+tun4in6[t].networklen + ' | ' + tun4in6[t].bandwidth+'</li>';
}
gateways += '</ul>';
//Adding HNAs with prefix=128 as main address
var ipstxt = '';
var address;
var first = 1;
var ipstxt_hidden = '<ul>';
var hna6list = '<ul>';
var extrainfo = "";
for( var e = 0; e < hna6.length; e++ )
{
address = hna6[e].address;
prefix = hna6[e].prefixlen;
if ( prefix == '128' )
{
if (first)
{
ipstxt += address;
ipstxt_hidden += '<li><a href="http://['+address+']" >'+address+"</a></li>";
first = 0;
}
else {
ipstxt_hidden += '<li><a href="http://['+address+']" >'+address+"</a></li>";
}
}
else {
hna6list += '<li>'+address+'/'+prefix+'</li>';
}
}
hna6list += '</ul>';
ipstxt_hidden += '</ul>';
extrainfo = '<div id="ip-'+ i +'" class="hideme">'
+ "<div class='inforow'>"
+ "<h4>" + nodename + '</h4>\n' + '<img src="' + nodeicon + '" />'+ "</div>"
+ "<div class='inforow'>"
+ "<h5>Available IPs</h5>\n"
+ ipstxt_hidden + "</div>\n"
+ "<div class='inforow'>"
+ "<h5>Gateways announced</h5>\n"
+ gateways + "</div>\n"
+ "<div class='inforow'>"
+ "<h5>Networks announced</h5>\n"
+ hna6list + "</div>\n"
+ "\n</div>";
res.push([extrainfo_link,nodename, ipstxt, originators[i].viaDev, originators[i].metric,
originators[i].lastDesc, originators[i].lastRef, originators[i].blocked, extrainfo]);
}
return res;
});
//]]></script>
<%+footer%>

View file

@ -1,6 +1,13 @@
<%+header%> <%+header%>
<link rel="stylesheet" type="text/css" href="/luci-static/resources/bmx6/style.css" /> <link rel="stylesheet" type="text/css" href="/luci-static/resources/bmx6/style.css" />
<img src="<%=resource%>/bmx6/bmx6logo.png" />
Bmx6 is a routing protocol for Linux based operating systems. Visit <a href="http://bmx6.net">bmx6.net</a> for more info.
<br />
<br />
<h2>Status of bmx6</h2> <h2>Status of bmx6</h2>
<table> <table>

View file

@ -0,0 +1,114 @@
<%+header%>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
<style>
div.hideme{
display: none;
}
div.info{
background: #FFF;
border: solid 1px;
height: 80px;
display: block;
overflow: auto;
}
div.inforow{
text-align:left;
display:inline-block;
width:20%;
margin:5px;
vertical-align:top;
}
#extra-info ul { list-style: none outside none; margin-left: 0em; }
</style>
<div class="cbi-map">
<center>
<img src="<%=resource%>/bmx6/bmx6logo.png" />
<br />
<br />
a mesh routing protocol for Linux devices.<br />
Visit <a href="http://bmx6.net">bmx6.net</a> for more info.
<br />
<br />
</center>
<h2>status</h2>
<div class="cbi-map-descr"></div>
<fieldset class="cbi-section">
<legend><%:status%></legend>
<table class="cbi-section-table" id="status_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Version%></th>
<th class="cbi-section-table-cell"><%:Compat%></th>
<th class="cbi-section-table-cell"><%:Code Version%></th>
<th class="cbi-section-table-cell"><%:Global ID%></th>
<th class="cbi-section-table-cell"><%:Primary IP%></th>
<th class="cbi-section-table-cell"><%:Tun6Address%></th>
<th class="cbi-section-table-cell"><%:Tun4Address%></th>
<th class="cbi-section-table-cell"><%:Local ID%></th>
<th class="cbi-section-table-cell"><%:Uptime%></th>
<th class="cbi-section-table-cell"><%:Cpu load%></th>
<th class="cbi-section-table-cell"><%:Nodes seen%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="11"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>
<fieldset class="cbi-section">
<legend><%:Network devices%></legend>
<table class="cbi-section-table" id="ifaces_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Name%></th>
<th class="cbi-section-table-cell"><%:State%></th>
<th class="cbi-section-table-cell"><%:Type%></th>
<th class="cbi-section-table-cell"><%:Rate%></th>
<th class="cbi-section-table-cell"><%:Local IP%></th>
<th class="cbi-section-table-cell"><%:Global IP%></th>
<th class="cbi-section-table-cell"><%:Multicast IP%></th>
<th class="cbi-section-table-cell"><%:is Primary%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="8"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>
</div>
<script type="text/javascript">//<![CDATA[
new TablePooler(5,"/cgi-bin/bmx6-info", {'status':''}, "status_table", function(st){
var res = Array();
var sta = st.status;
res.push([sta.version,sta.compatibility,sta.codeVersion,sta.globalId,sta.primaryIp,sta.tun6Address,
sta.tun4Address,sta.myLocalId,sta.uptime,sta.cpu,sta.nodes]);
return res;
});
new TablePooler(5,"/cgi-bin/bmx6-info", {'interfaces':''}, "ifaces_table", function(st){
var res = Array();
var ifaces = st.interfaces;
for ( var i = 0; i < ifaces.length; i++)
{
res.push([ifaces[i].devName,ifaces[i].state,ifaces[i].type,ifaces[i].rateMin+"/"+ifaces[i].rateMax,
ifaces[i].llocalIp,ifaces[i].globalIp,ifaces[i].multicastIp,ifaces[i].primary]);
}
return res;
});
//]]></script>
<%+footer%>

View file

@ -0,0 +1,107 @@
<%#
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Contributors Lluis Esquerda <eskerda@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
-%>
<%+header%>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
<style>
div.hideme{
display: none;
}
div.info{
background: #FFF;
border: solid 1px;
height: 80px;
display: block;
overflow: auto;
}
div.inforow{
text-align:left;
display:inline-block;
width:20%;
margin:5px;
vertical-align:top;
}
#extra-info ul { list-style: none outside none; margin-left: 0em; }
</style>
<div class="cbi-map">
<h2>Gateways tunnel announcements</h2>
<div class="cbi-map-descr"></div>
<fieldset class="cbi-section">
<legend><%:Mesh gateways%></legend>
<table class="cbi-section-table" id="descriptions_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"></th>
<th class="cbi-section-table-cell"><%:Tunnel%></th>
<th class="cbi-section-table-cell"><%:Node%></th>
<th class="cbi-section-table-cell"><%:Network%></th>
<th class="cbi-section-table-cell"><%:Bandwidth%></th>
<th class="cbi-section-table-cell"><%:SearchNet%></th>
<th class="cbi-section-table-cell"><%:Type%></th>
<th class="cbi-section-table-cell"><%:Path Metric%></th>
<th class="cbi-section-table-cell"><%:IP metric%></th>
<th class="cbi-section-table-cell"><%:Tun metric%></th>
<th class="cbi-section-table-cell"><%:Bonus%></th>
<th class="cbi-section-table-cell"><%:search id%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="10"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>
</div>
<script type="text/javascript">//<![CDATA[
new TablePooler(5,"/cgi-bin/bmx6-info", {'$tunnels':''}, "descriptions_table", function(st){
var tunicon = "<%=resource%>/icons/tunnel.png";
var tunicon_dis = "<%=resource%>/icons/tunnel_disabled.png";
var applyicon = "<%=resource%>/cbi/apply.gif";
var res = Array();
for ( var k in st.tunnels ){
var tunnel = st.tunnels[k];
var nodename = tunnel.remoteId.replace(/\..+$/,'');
var advnet = tunnel.advNet;
var status = '<img src="'+tunicon_dis+'"/>';
if ( tunnel.tunName != "---" ) status = '<img src="'+tunicon+'"/>';
if ( advnet == "0.0.0.0/0" ) advnet = "<b>Internet</b>";
res.push([status, tunnel.name, nodename, advnet, tunnel.advBw, tunnel.searchNet, tunnel.advType,
tunnel.pathMtc, tunnel.ipMtc, tunnel.tunMtc, tunnel.bonus, tunnel.searchId]);
}
return res;
});
//]]></script>
<%+footer%>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

@ -0,0 +1,81 @@
/*
Copyright (C) 2011 Pau Escrich <pau@dabax.net>
Contributors Lluis Esquerda <eskerda@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
the file called "COPYING".
*/
/*
Table pooler is a function to easy call XHR poller.
new TablePooler(5,"/cgi-bin/bmx6-info", {'status':''}, "status_table", function(st){
var table = Array()
table.push(st.first,st.second)
return table
}
Parameters are:
polling_time: time between pollings
json_url: the json url to fetch the data
json_call: the json call
output_table_id: the table where javascript will put the data
callback_function: the function that will be executed each polling_time
The callback_function must return an array of arrays (matrix).
In the code st is the data obtained from the json call
*/
function TablePooler (time, jsonurl, getparams, table_id, callback) {
this.table = document.getElementById(table_id);
this.callback = callback;
this.jsonurl = jsonurl;
this.getparams = getparams;
this.time = time;
this.clear = function(){
/* clear all rows */
while( this.table.rows.length > 1 ) this.table.deleteRow(1);
}
this.start = function(){
XHR.poll(this.time, this.jsonurl, this.getparams, function(x, st){
var data = this.callback(st);
var content, tr, td;
this.clear();
for (var i = 0; i < data.length; i++){
tr = this.table.insertRow(-1);
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
for (var j = 0; j < data[i].length; j++){
td = tr.insertCell(-1);
if (data[i][j].length == 2) {
td.colSpan = data[i][j][1];
content = data[i][j][0];
}
else content = data[i][j];
td.innerHTML = content;
}
}
}.bind(this));
}
this.start();
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 B