2010-11-15 22:08:42 +00:00
< %#
LuCI - Lua Configuration Interface
Copyright 2010 Jo-Philipp Wich < xm @ subsignal . org >
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
http://www.apache.org/licenses/LICENSE-2.0
2010-11-15 22:09:47 +00:00
$Id$
2010-11-15 22:08:42 +00:00
-%>
< %-
local ntm = require "luci.model.network".init()
2011-09-24 01:03:06 +00:00
local fwm = require "luci.model.firewall".init()
2010-11-15 22:08:42 +00:00
local net
local netlist = { }
for _, net in ipairs(ntm:get_networks()) do
if net:name() ~= "loopback" then
netlist[#netlist+1] = net:name()
end
end
-%>
< script type = "text/javascript" src = "<%=resource%>/cbi.js" > < / script >
2010-11-18 01:34:56 +00:00
< script type = "text/javascript" > / / < ! [ C D A T A [
2010-11-15 22:08:42 +00:00
function iface_shutdown(id, reconnect) {
2011-09-23 20:03:49 +00:00
if (!reconnect & & !confirm(String.format('< %_Really shutdown interface "%s" ?\nYou might lose access to this router if you are connected via this interface.%>', id)))
2010-11-15 22:08:42 +00:00
return;
2011-09-24 01:03:06 +00:00
var d = document.getElementById(id + '-ifc-description');
if (d)
d.innerHTML = reconnect
2010-11-15 22:08:42 +00:00
? '< em > < %:Interface is reconnecting...%>< / em > '
: '< em > < %:Interface is shutting down...%>< / em > ';
var s = document.getElementById('ifc-rc-status');
if (s)
{
s.parentNode.style.display = 'block';
s.innerHTML = '< %:Waiting for router...%>';
}
2011-09-26 00:24:34 +00:00
XHR.get('< %=luci.dispatcher.build_url("admin", "network")%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, null,
2010-11-15 22:08:42 +00:00
function(x)
{
if (s)
{
s.innerHTML = reconnect
? '< %:Interface reconnected%>'
: '< %:Interface shut down%>';
window.setTimeout(function() {
s.parentNode.style.display = 'none';
}, 1000);
}
}
);
}
var iwxhr = new XHR();
var wifidevs = < %=luci.http.write_json(netdevs)%>;
var arptable = < %=luci.http.write_json(arpcache)%>;
2011-09-26 00:24:34 +00:00
XHR.poll(5, '< %=luci.dispatcher.build_url("admin", "network", "iface_status", table.concat(netlist, ","))%>', null,
function(x, ifcs)
{
if (ifcs)
2010-11-15 22:08:42 +00:00
{
2011-09-26 00:24:34 +00:00
for (var idx = 0; idx < ifcs.length ; idx + + )
2010-11-15 22:08:42 +00:00
{
2011-09-26 00:24:34 +00:00
var ifc = ifcs[idx];
var html = '';
var s = document.getElementById(ifc.id + '-ifc-devices');
if (s)
2010-11-15 22:08:42 +00:00
{
2011-09-26 00:24:34 +00:00
var stat = String.format(
'< img src = "<%=resource%>/icons/%s%s.png" style = "width:16px; height:16px; vertical-align:middle" / > ',
ifc.type,
ifc.is_up ? '' : '_disabled'
);
2010-11-15 22:08:42 +00:00
2011-09-26 00:24:34 +00:00
if (ifc.subdevices & & ifc.subdevices.length)
2010-11-15 22:08:42 +00:00
{
2011-09-26 00:24:34 +00:00
stat += ' < strong > (';
2010-11-15 22:08:42 +00:00
2011-09-26 00:24:34 +00:00
for (var j = 0; j < ifc.subdevices.length ; j + + )
2011-09-24 01:03:06 +00:00
{
2011-09-26 00:24:34 +00:00
var sif = ifc.subdevices[j];
stat += String.format(
2011-11-08 23:12:38 +00:00
'< img src = "<%=resource%>/icons/%s%s.png" style = "width:16px; height:16px; vertical-align:middle" title = "%h" / > ',
2011-09-26 00:24:34 +00:00
sif.type,
sif.is_up ? '' : '_disabled',
sif.name
);
}
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
stat += ')< / strong > ';
}
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
stat += String.format(
2011-11-08 22:35:24 +00:00
'< br / > < small > %h< / small > ',
2011-09-26 00:24:34 +00:00
ifc.name
);
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
s.innerHTML = stat;
}
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
var d = document.getElementById(ifc.id + '-ifc-description');
2011-10-18 13:20:43 +00:00
if (d & & ifc.proto & & ifc.ifname)
2011-09-26 00:24:34 +00:00
{
if (ifc.is_up)
{
html += String.format('< strong > < %:Uptime%>:< / strong > %t< br / > ', ifc.uptime);
2010-11-15 22:08:42 +00:00
}
2011-09-26 00:24:34 +00:00
if (ifc.type != 'tunnel')
2010-11-15 22:08:42 +00:00
{
2011-09-26 00:24:34 +00:00
html += String.format('< strong > < %:MAC Address%>:< / strong > %s< br / > ', ifc.macaddr);
}
2010-11-15 22:08:42 +00:00
2011-09-26 00:24:34 +00:00
html += String.format(
'< strong > < %:RX%>< / strong > : %.2mB (%d < %:Pkts.%>)< br / > ' +
'< strong > < %:TX%>< / strong > : %.2mB (%d < %:Pkts.%>)< br / > ',
ifc.rx_bytes, ifc.rx_packets,
ifc.tx_bytes, ifc.tx_packets
);
2010-11-15 22:08:42 +00:00
2011-09-26 00:24:34 +00:00
if (ifc.ipaddrs & & ifc.ipaddrs.length)
{
html += '< strong > < %:IPv4%>: < / strong > ';
2010-11-15 22:08:42 +00:00
2011-09-26 00:24:34 +00:00
for (var i = 0; i < ifc.ipaddrs.length ; i + + )
html += String.format(
'%s%s/%d',
i ? ', ' : '',
ifc.ipaddrs[i].addr,
ifc.ipaddrs[i].prefix
);
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
html += '< br / > ';
}
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
if (ifc.ip6addrs & & ifc.ip6addrs.length)
{
html += '< strong > < %:IPv6%>: < / strong > ';
2011-09-24 01:03:06 +00:00
2011-09-26 00:24:34 +00:00
for (var i = 0; i < ifc.ip6addrs.length ; i + + )
html += String.format(
'%s%s/%d',
i ? ', ' : '',
ifc.ip6addrs[i].addr.toUpperCase(),
ifc.ip6addrs[i].prefix
);
2010-11-15 22:08:42 +00:00
2011-09-26 00:24:34 +00:00
html += '< br / > ';
2010-11-15 22:08:42 +00:00
}
2011-09-26 00:24:34 +00:00
d.innerHTML = html;
}
2011-10-18 13:20:43 +00:00
else if (d & & !ifc.proto)
{
var e = document.getElementById(ifc.id + '-ifc-edit');
if (e)
e.disabled = true;
d.innerHTML = String.format(
'< em > < %:Unsupported protocol type.%>< / em > < br / > ' +
'< a href = "%h" > < %:Install protocol extensions...%>< / a > ',
'< %=luci.dispatcher.build_url("admin/system/packages")%>?query=luci-proto& display=available'
);
}
2011-09-26 00:24:34 +00:00
else if (d)
{
d.innerHTML = '< em > < %:Interface not present or not connected yet.%>< / em > ';
2010-11-15 22:08:42 +00:00
}
}
}
2011-09-26 00:24:34 +00:00
}
);
2010-11-18 01:34:56 +00:00
//]]>< / script >
2010-11-15 22:08:42 +00:00
< fieldset class = "cbi-section" style = "display:none" >
< legend > < %:Reconnecting interface%>< / legend >
< img src = "<%=resource%>/icons/loading.gif" alt = "<%:Loading%>" style = "vertical-align:middle" / >
< span id = "ifc-rc-status" > < %:Waiting for router...%>< / span >
< / fieldset >
< div class = "cbi-map" >
< fieldset class = "cbi-section" >
2010-11-15 23:00:53 +00:00
< legend > < %:Interface Overview%>< / legend >
2010-11-15 22:08:42 +00:00
< table class = "cbi-section-table" style = "margin:10px; empty-cells:hide" >
< tr class = "cbi-section-table-titles" >
2011-09-24 01:03:06 +00:00
< th class = "cbi-section-table-cell" > < %:Network%>< / th >
< th class = "cbi-section-table-cell" style = "text-align:left" > < %:Status%>< / th >
< th class = "cbi-section-table-cell" > < %:Actions%>< / th >
2010-11-15 22:08:42 +00:00
< / tr >
2011-09-24 01:03:06 +00:00
< %
for i, net in ipairs(netlist) do
local z = fwm:get_zone_by_network(net)
local c = z and z:get_color() or "#EEEEEE"
local t = z and translate("Part of zone %q" % z:name()) or translate("No zone assigned")
%>
2010-11-15 22:08:42 +00:00
< tr class = "cbi-section-table-row cbi-rowstyle-<%=i % 2 + 1%>" >
2011-09-24 01:03:06 +00:00
< td class = "cbi-value-field" style = "padding:3px" >
2012-02-15 15:12:10 +00:00
< div style = "background-color:#FFFFFF; border:1px solid #CCCCCC; margin:0 10px; text-align:center; white-space:nowrap" >
2011-09-24 01:03:06 +00:00
< div style = "border-bottom:1px solid #CCCCCC; padding:2px; background-color:<%=c%>" title = "<%=pcdata(t)%>" >
< strong > < %=net:upper()%>< / strong >
< / div >
< div style = "padding:2px" id = "<%=net%>-ifc-devices" >
< img src = "<%=resource%>/icons/ethernet_disabled.png" style = "width:16px; height:16px" / > < br / >
< small > ?< / small >
< / div >
< / div >
2010-11-15 22:08:42 +00:00
< / td >
2011-09-24 01:03:06 +00:00
< td class = "cbi-value-field" style = "vertical-align:middle; text-align:left; padding:3px" id = "<%=net%>-ifc-description" >
< em > < %:Collecting data...%>< / em >
2010-11-15 22:08:42 +00:00
< / td >
2011-10-02 11:37:44 +00:00
< td style = "width:420px" >
2012-02-15 15:12:10 +00:00
< input type = "button" class = "cbi-button cbi-button-reload" style = "width:100px" onclick = "iface_shutdown('<%=net%>', true)" title = "<%:Reconnect this interface%>" value = "<%:Connect%>" / >
< input type = "button" class = "cbi-button cbi-button-reset" style = "width:100px" onclick = "iface_shutdown('<%=net%>', false)" title = "<%:Shutdown this interface%>" value = "<%:Stop%>" / >
< input type = "button" class = "cbi-button cbi-button-edit" style = "width:100px" onclick = "location.href='<%=luci.dispatcher.build_url(" admin / network / network " , net ) % > '" title="< %:Edit this interface%>" value="< %:Edit%>" id="< %=net%>-ifc-edit" />
< input type = "button" class = "cbi-button cbi-button-remove" style = "width:100px" onclick = "if (confirm('<%:Really delete this interface? The deletion cannot be undone!\nYou might lose access to this router if you are connected via this interface.%>')) location.href='<%=luci.dispatcher.build_url(" admin / network / iface_delete " , net ) % > '" title="< %:Delete this interface%>" value="< %:Delete%>" />
2010-11-15 22:08:42 +00:00
< / td >
< / tr >
< % end %>
< / table >
2011-02-06 01:58:55 +00:00
< input type = "button" class = "cbi-button cbi-button-add" value = "<%:Add new interface...%>" onclick = "location.href='<%=luci.dispatcher.build_url(" admin / network / iface_add " ) % > '" />
2010-11-15 23:00:53 +00:00
< / fieldset >
2010-11-15 22:08:42 +00:00
< / div >