modules/admin-core, modules/admin-full: implement display support for dnsmasq dhcpv6 leases

This commit is contained in:
Jo-Philipp Wich 2012-08-17 15:06:46 +00:00
parent 044b011051
commit dce04bbcb2
4 changed files with 154 additions and 17 deletions

View file

@ -16,7 +16,7 @@ module("luci.tools.status", package.seeall)
local uci = require "luci.model.uci".cursor() local uci = require "luci.model.uci".cursor()
function dhcp_leases() local function dhcp_leases_common(family)
local rv = { } local rv = { }
local nfs = require "nixio.fs" local nfs = require "nixio.fs"
local leasefile = "/var/dhcp.leases" local leasefile = "/var/dhcp.leases"
@ -36,14 +36,23 @@ function dhcp_leases()
if not ln then if not ln then
break break
else else
local ts, mac, ip, name = ln:match("^(%d+) (%S+) (%S+) (%S+)") local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
if ts and mac and ip and name then if ts and mac and ip and name and duid then
rv[#rv+1] = { if family == 4 and not ip:match(":") then
expires = os.difftime(tonumber(ts) or 0, os.time()), rv[#rv+1] = {
macaddr = mac, expires = os.difftime(tonumber(ts) or 0, os.time()),
ipaddr = ip, macaddr = mac,
hostname = (name ~= "*") and name ipaddr = ip,
} hostname = (name ~= "*") and name
}
elseif family == 6 and ip:match(":") then
rv[#rv+1] = {
expires = os.difftime(tonumber(ts) or 0, os.time()),
ip6addr = ip,
duid = (duid ~= "*") and duid,
hostname = (name ~= "*") and name
}
end
end end
end end
end end
@ -53,6 +62,18 @@ function dhcp_leases()
return rv return rv
end end
function dhcp_leases()
return dhcp_leases_common(4)
end
function dhcp6_leases()
if luci.sys.call("dnsmasq --version 2>/dev/null | grep -q ' DHCPv6 '") == 0 then
return dhcp_leases_common(6)
else
return nil
end
end
function wifi_networks() function wifi_networks()
local rv = { } local rv = { }
local ntm = require "luci.model.network".init() local ntm = require "luci.model.network".init()

View file

@ -410,7 +410,11 @@ function lease_status()
local s = require "luci.tools.status" local s = require "luci.tools.status"
luci.http.prepare_content("application/json") luci.http.prepare_content("application/json")
luci.http.write('[')
luci.http.write_json(s.dhcp_leases()) luci.http.write_json(s.dhcp_leases())
luci.http.write(',')
luci.http.write_json(s.dhcp6_leases())
luci.http.write(']')
end end
function diag_command(cmd) function diag_command(cmd)

View file

@ -3,31 +3,31 @@
function(x, st) function(x, st)
{ {
var tb = document.getElementById('lease_status_table'); var tb = document.getElementById('lease_status_table');
if (st && tb) if (st && st[0] && tb)
{ {
/* clear all rows */ /* clear all rows */
while( tb.rows.length > 1 ) while( tb.rows.length > 1 )
tb.deleteRow(1); tb.deleteRow(1);
for( var i = 0; i < st.length; i++ ) for( var i = 0; i < st[0].length; i++ )
{ {
var timestr; var timestr;
if (st[i].expires <= 0) if (st[0][i].expires <= 0)
{ {
timestr = '<em><%:expired%></em>'; timestr = '<em><%:expired%></em>';
} }
else else
{ {
timestr = String.format('%t', st[i].expires); timestr = String.format('%t', st[0][i].expires);
} }
var tr = tb.insertRow(-1); var tr = tb.insertRow(-1);
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1); tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
tr.insertCell(-1).innerHTML = st[i].hostname ? st[i].hostname : '?'; tr.insertCell(-1).innerHTML = st[0][i].hostname ? st[0][i].hostname : '?';
tr.insertCell(-1).innerHTML = st[i].ipaddr; tr.insertCell(-1).innerHTML = st[0][i].ipaddr;
tr.insertCell(-1).innerHTML = st[i].macaddr; tr.insertCell(-1).innerHTML = st[0][i].macaddr;
tr.insertCell(-1).innerHTML = timestr; tr.insertCell(-1).innerHTML = timestr;
} }
@ -41,12 +41,54 @@
td.innerHTML = '<em><br /><%:There are no active leases.%></em>'; td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
} }
} }
var tb6 = document.getElementById('lease6_status_table');
if (st && st[1] && tb6)
{
tb6.parentNode.style.display = 'block';
/* clear all rows */
while( tb6.rows.length > 1 )
tb6.deleteRow(1);
for( var i = 0; i < st[1].length; i++ )
{
var timestr;
if (st[1][i].expires <= 0)
{
timestr = '<em><%:expired%></em>';
}
else
{
timestr = String.format('%t', st[1][i].expires);
}
var tr = tb6.insertRow(-1);
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
tr.insertCell(-1).innerHTML = st[1][i].hostname ? st[1][i].hostname : '?';
tr.insertCell(-1).innerHTML = st[1][i].ip6addr;
tr.insertCell(-1).innerHTML = st[1][i].duid;
tr.insertCell(-1).innerHTML = timestr;
}
if( tb6.rows.length == 1 )
{
var tr = tb6.insertRow(-1);
tr.className = 'cbi-section-table-row';
var td = tr.insertCell(-1);
td.colSpan = 4;
td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
}
}
} }
); );
//]]></script> //]]></script>
<fieldset class="cbi-section"> <fieldset class="cbi-section">
<legend><%:Active Leases%></legend> <legend><%:Active DHCP Leases%></legend>
<table class="cbi-section-table" id="lease_status_table"> <table class="cbi-section-table" id="lease_status_table">
<tr class="cbi-section-table-titles"> <tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Hostname%></th> <th class="cbi-section-table-cell"><%:Hostname%></th>
@ -59,3 +101,18 @@
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
<fieldset class="cbi-section" style="display:none">
<legend><%:Active DHCPv6 Leases%></legend>
<table class="cbi-section-table" id="lease6_status_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Hostname%></th>
<th class="cbi-section-table-cell"><%:IPv6-Address%></th>
<th class="cbi-section-table-cell"><%:DUID%></th>
<th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="4"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>

View file

@ -50,6 +50,7 @@ $Id$
connmax = conn_max, connmax = conn_max,
conncount = conn_count, conncount = conn_count,
leases = luci.tools.status.dhcp_leases(), leases = luci.tools.status.dhcp_leases(),
leases6 = luci.tools.status.dhcp6_leases(),
wifinets = luci.tools.status.wifi_networks() wifinets = luci.tools.status.wifi_networks()
} }
@ -248,6 +249,44 @@ $Id$
td.innerHTML = '<em><br /><%:There are no active leases.%></em>'; td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
} }
} }
var ls6 = document.getElementById('lease6_status_table');
if (ls6 && info.leases6)
{
ls6.parentNode.style.display = 'block';
/* clear all rows */
while( ls6.rows.length > 1 )
ls6.rows[0].parentNode.deleteRow(1);
for( var i = 0; i < info.leases6.length; i++ )
{
var timestr;
if (info.leases6[i].expires <= 0)
timestr = '<em><%:expired%></em>';
else
timestr = String.format('%t', info.leases6[i].expires);
var tr = ls6.rows[0].parentNode.insertRow(-1);
tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
tr.insertCell(-1).innerHTML = info.leases6[i].hostname ? info.leases6[i].hostname : '?';
tr.insertCell(-1).innerHTML = info.leases6[i].ip6addr;
tr.insertCell(-1).innerHTML = info.leases6[i].duid;
tr.insertCell(-1).innerHTML = timestr;
}
if( ls6.rows.length == 1 )
{
var tr = ls6.rows[0].parentNode.insertRow(-1);
tr.className = 'cbi-section-table-row';
var td = tr.insertCell(-1);
td.colSpan = 4;
td.innerHTML = '<em><br /><%:There are no active leases.%></em>';
}
}
<% end %> <% end %>
<% if has_wifi then %> <% if has_wifi then %>
@ -532,6 +571,22 @@ $Id$
</tr> </tr>
</table> </table>
</fieldset> </fieldset>
<fieldset class="cbi-section" style="display:none">
<legend><%:DHCPv6 Leases%></legend>
<table class="cbi-section-table" id="lease6_status_table">
<tr class="cbi-section-table-titles">
<th class="cbi-section-table-cell"><%:Hostname%></th>
<th class="cbi-section-table-cell"><%:IPv6-Address%></th>
<th class="cbi-section-table-cell"><%:DUID%></th>
<th class="cbi-section-table-cell"><%:Leasetime remaining%></th>
</tr>
<tr class="cbi-section-table-row">
<td colspan="4"><em><br /><%:Collecting data...%></em></td>
</tr>
</table>
</fieldset>
<% end %> <% end %>
<% if has_wifi then %> <% if has_wifi then %>