luci-mod-admin-full: switch to luci.ip route functions
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 22 Jan 2015 14:53:16 +0000 (15:53 +0100)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 22 Jan 2015 14:53:16 +0000 (15:53 +0100)
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua
modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm

index 01580f1..ac02b15 100644 (file)
@@ -1,14 +1,14 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
 -- Licensed to the public under the Apache License 2.0.
 
 -- Copyright 2008 Steven Barth <steven@midlink.org>
 -- Licensed to the public under the Apache License 2.0.
 
-require("luci.tools.webadmin")
+local wa = require "luci.tools.webadmin"
+local fs = require "nixio.fs"
+
 m = Map("network",
        translate("Routes"),
        translate("Routes specify over which interface and gateway a certain host or network " ..
                "can be reached."))
 
 m = Map("network",
        translate("Routes"),
        translate("Routes specify over which interface and gateway a certain host or network " ..
                "can be reached."))
 
-local routes6 = luci.sys.net.routes6()
-
 s = m:section(TypedSection, "route", translate("Static IPv4 Routes"))
 s.addremove = true
 s.anonymous = true
 s = m:section(TypedSection, "route", translate("Static IPv4 Routes"))
 s.addremove = true
 s.anonymous = true
@@ -16,7 +16,7 @@ s.anonymous = true
 s.template  = "cbi/tblsection"
 
 iface = s:option(ListValue, "interface", translate("Interface"))
 s.template  = "cbi/tblsection"
 
 iface = s:option(ListValue, "interface", translate("Interface"))
-luci.tools.webadmin.cbi_add_networks(iface)
+wa.cbi_add_networks(iface)
 
 t = s:option(Value, "target", translate("Target"), translate("Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"))
 t.datatype = "ip4addr"
 
 t = s:option(Value, "target", translate("Target"), translate("Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"))
 t.datatype = "ip4addr"
@@ -41,7 +41,7 @@ mtu.placeholder = 1500
 mtu.datatype = "range(64,9000)"
 mtu.rmempty = true
 
 mtu.datatype = "range(64,9000)"
 mtu.rmempty = true
 
-if routes6 then
+if fs.access("/proc/net/ipv6_route") then
        s = m:section(TypedSection, "route6", translate("Static IPv6 Routes"))
        s.addremove = true
        s.anonymous = true
        s = m:section(TypedSection, "route6", translate("Static IPv6 Routes"))
        s.addremove = true
        s.anonymous = true
@@ -49,7 +49,7 @@ if routes6 then
        s.template  = "cbi/tblsection"
 
        iface = s:option(ListValue, "interface", translate("Interface"))
        s.template  = "cbi/tblsection"
 
        iface = s:option(ListValue, "interface", translate("Interface"))
-       luci.tools.webadmin.cbi_add_networks(iface)
+       wa.cbi_add_networks(iface)
 
        t = s:option(Value, "target", translate("Target"), translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network (CIDR)"))
        t.datatype = "ip6addr"
 
        t = s:option(Value, "target", translate("Target"), translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network (CIDR)"))
        t.datatype = "ip6addr"
index 2d9a4a3..82dd3a7 100644 (file)
@@ -1,15 +1,33 @@
 <%#
  Copyright 2008-2009 Steven Barth <steven@midlink.org>
 <%#
  Copyright 2008-2009 Steven Barth <steven@midlink.org>
- Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
  Licensed to the public under the Apache License 2.0.
 -%>
 
 <%-
  Licensed to the public under the Apache License 2.0.
 -%>
 
 <%-
-       require "luci.sys"
        require "luci.tools.webadmin"
        require "nixio.fs"
 
        require "luci.tools.webadmin"
        require "nixio.fs"
 
+       local ip = require "luci.ip"
        local style = true
        local style = true
+       local _, v
+
+       local rtn = {
+               [255] = "local",
+               [254] = "main",
+               [253] = "default",
+               [0]   = "unspec"
+       }
+
+       if nixio.fs.access("/etc/iproute2/rt_tables") then
+               local ln
+               for ln in io.lines("/etc/iproute2/rt_tables") do
+                       local i, n = ln:match("^(%d+)%s+(%S+)")
+                       if i and n then
+                               rtn[tonumber(i)] = n
+                       end
+               end
+       end
 -%>
 
 <%+header%>
 -%>
 
 <%+header%>
@@ -18,7 +36,7 @@
        <h2><a id="content" name="content"><%:Routes%></a></h2>
        <div class="cbi-map-descr"><%:The following rules are currently active on this system.%></div>
 
        <h2><a id="content" name="content"><%:Routes%></a></h2>
        <div class="cbi-map-descr"><%:The following rules are currently active on this system.%></div>
 
-       <fieldset class="cbi-section" id="cbi-table-table">
+       <fieldset class="cbi-section">
                <legend>ARP</legend>
                <div class="cbi-section-node">
                        <table class="cbi-section-table">
                <legend>ARP</legend>
                <div class="cbi-section-node">
                        <table class="cbi-section-table">
                                        <th class="cbi-section-table-cell"><%:Interface%></th>
                                </tr>
 
                                        <th class="cbi-section-table-cell"><%:Interface%></th>
                                </tr>
 
-                               <% luci.sys.net.arptable(function(e) %>
+                               <%
+                                       for _, v in ipairs(ip.neighbors({ family = 4 })) do
+                                               if v.mac then
+                               %>
                                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
                                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=e["IP address"]%></td>
-                                       <td class="cbi-value-field"><%=e["HW address"]%></td>
-                                       <td class="cbi-value-field"><%=e["Device"]%></td>
+                                       <td class="cbi-value-field"><%=v.dest%></td>
+                                       <td class="cbi-value-field"><%=v.mac%></td>
+                                       <td class="cbi-value-field"><%=v.dev%></td>
                                </tr>
                                </tr>
-                               <% style = not style; end) %>
+                               <%
+                                                       style = not style
+                                               end
+                                       end
+                               %>
                        </table>
                </div>
        </fieldset>
        <br />
 
                        </table>
                </div>
        </fieldset>
        <br />
 
-       <fieldset class="cbi-section" id="cbi-table-table">
+       <fieldset class="cbi-section">
                <legend><%_Active <abbr title="Internet Protocol Version 4">IPv4</abbr>-Routes%></legend>
 
                <div class="cbi-section-node">
                <legend><%_Active <abbr title="Internet Protocol Version 4">IPv4</abbr>-Routes%></legend>
 
                <div class="cbi-section-node">
                                        <th class="cbi-section-table-cell"><%:Target%></th>
                                        <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Gateway%></th>
                                        <th class="cbi-section-table-cell"><%:Metric%></th>
                                        <th class="cbi-section-table-cell"><%:Target%></th>
                                        <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 4">IPv4</abbr>-Gateway%></th>
                                        <th class="cbi-section-table-cell"><%:Metric%></th>
+                                       <th class="cbi-section-table-cell"><%:Table%></th>
                                </tr>
                                </tr>
-                               <% luci.sys.net.routes(function(rt) %>
+                               <% for _, v in ipairs(ip.routes({ family = 4, type = 1 })) do %>
                                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
                                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(rt.device) or rt.device%></td>
-                                       <td class="cbi-value-field"><%=rt.dest:string()%></td>
-                                       <td class="cbi-value-field"><%=rt.gateway:string()%></td>
-                                       <td class="cbi-value-field"><%=rt.metric%></td>
+                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or v.dev%></td>
+                                       <td class="cbi-value-field"><%=v.dest%></td>
+                                       <td class="cbi-value-field"><%=v.gw%></td>
+                                       <td class="cbi-value-field"><%=v.metric or 0%></td>
+                                       <td class="cbi-value-field"><%=rtn[v.table] or v.table%></td>
                                </tr>
                                </tr>
-                               <% style = not style; end) %>
+                               <% style = not style end %>
                        </table>
                </div>
        </fieldset>
        <br />
 
                        </table>
                </div>
        </fieldset>
        <br />
 
-       <% if nixio.fs.access("/proc/net/ipv6_route") then
-               style = true
-               fe80 = luci.ip.IPv6("fe80::/10")
+       <%
+               if nixio.fs.access("/proc/net/ipv6_route") then
+                       style = true
        %>
        %>
-       <fieldset class="cbi-section" id="cbi-table-table">
+       <fieldset class="cbi-section">
                <legend><%_Active <abbr title="Internet Protocol Version 6">IPv6</abbr>-Routes%></legend>
 
                <div class="cbi-section-node">
                <legend><%_Active <abbr title="Internet Protocol Version 6">IPv6</abbr>-Routes%></legend>
 
                <div class="cbi-section-node">
                                <tr class="cbi-section-table-titles">
                                        <th class="cbi-section-table-cell"><%:Network%></th>
                                        <th class="cbi-section-table-cell"><%:Target%></th>
                                <tr class="cbi-section-table-titles">
                                        <th class="cbi-section-table-cell"><%:Network%></th>
                                        <th class="cbi-section-table-cell"><%:Target%></th>
-                                       <th class="cbi-section-table-cell"><%_<abbr title="Internet Protocol Version 6">IPv6</abbr>-Gateway%></th>
+                                       <th class="cbi-section-table-cell"><%:Source%></th>
                                        <th class="cbi-section-table-cell"><%:Metric%></th>
                                        <th class="cbi-section-table-cell"><%:Metric%></th>
+                                       <th class="cbi-section-table-cell"><%:Table%></th>
+                               </tr>
+                               <%
+                                       for _, v in ipairs(ip.routes({ family = 6, type = 1 })) do
+                                               if v.dest and not v.dest:is6linklocal() then
+                               %>
+                               <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
+                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
+                                       <td class="cbi-value-field"><%=v.dest%></td>
+                                       <td class="cbi-value-field"><%=v.from%></td>
+                                       <td class="cbi-value-field"><%=v.metric or 0%></td>
+                                       <td class="cbi-value-field"><%=rtn[v.table] or v.table%></td>
+                               </tr>
+                               <%
+                                                       style = not style
+                                               end
+                                       end
+                               %>
+                       </table>
+               </div>
+       </fieldset>
+       <br />
+
+       <fieldset class="cbi-section">
+               <legend><%:IPv6 Neighbours%></legend>
+
+               <div class="cbi-section-node">
+                       <table class="cbi-section-table">
+                               <tr class="cbi-section-table-titles">
+                                       <th class="cbi-section-table-cell"><%:IPv6-Address%></th>
+                                       <th class="cbi-section-table-cell"><%:MAC-Address%></th>
+                                       <th class="cbi-section-table-cell"><%:Interface%></th>
                                </tr>
                                </tr>
-                               <% luci.sys.net.routes6(function(rt) if fe80:contains(rt.dest) then return end %>
+                               <%
+                                       for _, v in ipairs(ip.neighbors({ family = 6 })) do
+                                               if v.dest and not v.dest:is6linklocal() and v.mac then
+                               %>
                                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
                                <tr class="cbi-section-table-row cbi-rowstyle-<%=(style and 1 or 2)%>">
-                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(rt.device) or '(' .. rt.device .. ')'%></td>
-                                       <td class="cbi-value-field"><%=rt.dest:string()%></td>
-                                       <td class="cbi-value-field"><%=rt.source:string()%></td>
-                                       <td class="cbi-value-field"><%=rt.metric_raw:upper()%></td>
+                                       <td class="cbi-value-field"><%=v.dest%></td>
+                                       <td class="cbi-value-field"><%=v.mac%></td>
+                                       <td class="cbi-value-field"><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%></td>
                                </tr>
                                </tr>
-                               <% style = not style; end) %>
+                               <%
+                                                       style = not style
+                                               end
+                                       end
+                               %>
                        </table>
                </div>
        </fieldset>
                        </table>
                </div>
        </fieldset>