modules/admin-core, modules/admin-full: implement display support for dnsmasq dhcpv6...
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 17 Aug 2012 15:06:46 +0000 (15:06 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 17 Aug 2012 15:06:46 +0000 (15:06 +0000)
modules/admin-core/luasrc/tools/status.lua
modules/admin-full/luasrc/controller/admin/network.lua
modules/admin-full/luasrc/view/admin_network/lease_status.htm
modules/admin-full/luasrc/view/admin_status/index.htm

index 2eef3e0..cd543f7 100644 (file)
@@ -16,7 +16,7 @@ module("luci.tools.status", package.seeall)
 
 local uci = require "luci.model.uci".cursor()
 
-function dhcp_leases()
+local function dhcp_leases_common(family)
        local rv = { }
        local nfs = require "nixio.fs"
        local leasefile = "/var/dhcp.leases"
@@ -36,14 +36,23 @@ function dhcp_leases()
                        if not ln then
                                break
                        else
-                               local ts, mac, ip, name = ln:match("^(%d+) (%S+) (%S+) (%S+)")
-                               if ts and mac and ip and name then
-                                       rv[#rv+1] = {
-                                               expires  = os.difftime(tonumber(ts) or 0, os.time()),
-                                               macaddr  = mac,
-                                               ipaddr   = ip,
-                                               hostname = (name ~= "*") and name
-                                       }
+                               local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
+                               if ts and mac and ip and name and duid then
+                                       if family == 4 and not ip:match(":") then
+                                               rv[#rv+1] = {
+                                                       expires  = os.difftime(tonumber(ts) or 0, os.time()),
+                                                       macaddr  = mac,
+                                                       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
@@ -53,6 +62,18 @@ function dhcp_leases()
        return rv
 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()
        local rv = { }
        local ntm = require "luci.model.network".init()
index 85d7b18..00e1fe2 100644 (file)
@@ -410,7 +410,11 @@ function lease_status()
        local s = require "luci.tools.status"
 
        luci.http.prepare_content("application/json")
+       luci.http.write('[')
        luci.http.write_json(s.dhcp_leases())
+       luci.http.write(',')
+       luci.http.write_json(s.dhcp6_leases())
+       luci.http.write(']')
 end
 
 function diag_command(cmd)
index bf5a5c2..0ba334e 100644 (file)
@@ -3,31 +3,31 @@
                function(x, st)
                {
                        var tb = document.getElementById('lease_status_table');
-                       if (st && tb)
+                       if (st && st[0] && tb)
                        {
                                /* clear all rows */
                                while( tb.rows.length > 1 )
                                        tb.deleteRow(1);
 
-                               for( var i = 0; i < st.length; i++ )
+                               for( var i = 0; i < st[0].length; i++ )
                                {
                                        var timestr;
 
-                                       if (st[i].expires <= 0)
+                                       if (st[0][i].expires <= 0)
                                        {
                                                timestr = '<em><%:expired%></em>';
                                        }
                                        else
                                        {
-                                               timestr = String.format('%t', st[i].expires);
+                                               timestr = String.format('%t', st[0][i].expires);
                                        }
 
                                        var tr = tb.insertRow(-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[i].ipaddr;
-                                       tr.insertCell(-1).innerHTML = st[i].macaddr;
+                                       tr.insertCell(-1).innerHTML = st[0][i].hostname ? st[0][i].hostname : '?';
+                                       tr.insertCell(-1).innerHTML = st[0][i].ipaddr;
+                                       tr.insertCell(-1).innerHTML = st[0][i].macaddr;
                                        tr.insertCell(-1).innerHTML = timestr;
                                }
 
                                                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>
 
 <fieldset class="cbi-section">
-       <legend><%:Active Leases%></legend>
+       <legend><%:Active DHCP Leases%></legend>
        <table class="cbi-section-table" id="lease_status_table">
                <tr class="cbi-section-table-titles">
                        <th class="cbi-section-table-cell"><%:Hostname%></th>
                </tr>
        </table>
 </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>
index 4f2a651..003ec31 100644 (file)
@@ -50,6 +50,7 @@ $Id$
                        connmax    = conn_max,
                        conncount  = conn_count,
                        leases     = luci.tools.status.dhcp_leases(),
+                       leases6    = luci.tools.status.dhcp6_leases(),
                        wifinets   = luci.tools.status.wifi_networks()
                }
 
@@ -248,6 +249,44 @@ $Id$
                                                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 %>
 
                        <% if has_wifi then %>
@@ -532,6 +571,22 @@ $Id$
                </tr>
        </table>
 </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 %>
 
 <% if has_wifi then %>