X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=modules%2Fluci-mod-status%2Fhtdocs%2Fluci-static%2Fresources%2Fview%2Fstatus%2Froutes.js;h=5e8bb525660aabed1cd5b735c088bca6b381f6c5;hb=025d8e79ba4cd1ad6807c763caf9e3e68f7c4770;hp=5da5d403b162459040cea7a3a6f011416d6d148d;hpb=fde15967f411e48c876c8ceecca981d335199bf1;p=project%2Fluci.git diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js index 5da5d403b1..5e8bb52566 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js @@ -3,6 +3,7 @@ 'require fs'; 'require rpc'; 'require validation'; +'require ui'; var callNetworkInterfaceDump = rpc.declare({ object: 'network.interface', @@ -32,8 +33,10 @@ return view.extend({ callNetworkInterfaceDump(), L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'neigh', 'show' ]), {}), L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'route', 'show', 'table', 'all' ]), {}), + L.resolveDefault(fs.exec('/sbin/ip', [ '-4', 'rule', 'show' ]), {}), L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'neigh', 'show' ]), {}), - L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'route', 'show', 'table', 'all' ]), {}) + L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'route', 'show', 'table', 'all' ]), {}), + L.resolveDefault(fs.exec('/sbin/ip', [ '-6', 'rule', 'show' ]), {}) ]); }, @@ -84,7 +87,7 @@ return view.extend({ res = []; for (var i = 0; i < lines.length; i++) { - var m = lines[i].match(/^([0-9a-f:.]+) (.+) (\S+)$/), + var m = lines[i].match(/^([0-9a-f:.]+) (.+) (\S+) *$/), addr = m ? m[1] : null, flags = m ? m[2].trim().split(/\s+/) : [], state = (m ? m[3] : null) || 'FAILED'; @@ -135,7 +138,26 @@ return view.extend({ dest, (v6 ? flags.from : flags.via) || '-', String(flags.metric || 0), - flags.table || 'main' + flags.table || 'main', + flags.proto, + ]); + } + + return res; + }, + + parseRule: function(s) { + var lines = s.trim().split(/\n/), + res = []; + + for (var i = 0; i < lines.length; i++) { + var m = lines[i].match(/^(\d+):\s+(.+)$/), + prio = m ? m[1] : null, + rule = m ? m[2] : null; + + res.push([ + prio, + rule ]); } @@ -146,70 +168,115 @@ return view.extend({ var networks = data[0], ip4neigh = data[1].stdout || '', ip4route = data[2].stdout || '', - ip6neigh = data[3].stdout || '', - ip6route = data[4].stdout || ''; - - var neigh4tbl = E('div', { 'class': 'table' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, [ _('IPv4-Address') ]), - E('div', { 'class': 'th' }, [ _('MAC-Address') ]), - E('div', { 'class': 'th' }, [ _('Interface') ]) + ip4rule = data[3].stdout || '', + ip6neigh = data[4].stdout || '', + ip6route = data[5].stdout || '', + ip6rule = data[6].stdout || ''; + + var neigh4tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('IP address') ]), + E('th', { 'class': 'th' }, [ _('MAC address') ]), + E('th', { 'class': 'th' }, [ _('Interface') ]) ]) ]); - var route4tbl = E('div', { 'class': 'table' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, [ _('Network') ]), - E('div', { 'class': 'th' }, [ _('Target') ]), - E('div', { 'class': 'th' }, [ _('IPv4-Gateway') ]), - E('div', { 'class': 'th' }, [ _('Metric') ]), - E('div', { 'class': 'th' }, [ _('Table') ]) + var route4tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('Network') ]), + E('th', { 'class': 'th' }, [ _('Target') ]), + E('th', { 'class': 'th' }, [ _('Gateway') ]), + E('th', { 'class': 'th' }, [ _('Metric') ]), + E('th', { 'class': 'th' }, [ _('Table') ]), + E('th', { 'class': 'th' }, [ _('Protocol') ]) ]) ]); - var neigh6tbl = E('div', { 'class': 'table' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, [ _('IPv6-Address') ]), - E('div', { 'class': 'th' }, [ _('MAC-Address') ]), - E('div', { 'class': 'th' }, [ _('Interface') ]) + var rule4tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('Priority') ]), + E('th', { 'class': 'th' }, [ _('Rule') ]) ]) ]); - var route6tbl = E('div', { 'class': 'table' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, [ _('Network') ]), - E('div', { 'class': 'th' }, [ _('Target') ]), - E('div', { 'class': 'th' }, [ _('Source') ]), - E('div', { 'class': 'th' }, [ _('Metric') ]), - E('div', { 'class': 'th' }, [ _('Table') ]) + var neigh6tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('IP address') ]), + E('th', { 'class': 'th' }, [ _('MAC address') ]), + E('th', { 'class': 'th' }, [ _('Interface') ]) ]) ]); - cbi_update_table(neigh4tbl, this.parseNeigh(ip4neigh, networks, false)); - cbi_update_table(route4tbl, this.parseRoute(ip4route, networks, false)); - cbi_update_table(neigh6tbl, this.parseNeigh(ip6neigh, networks, true)); - cbi_update_table(route6tbl, this.parseRoute(ip6route, networks, true)); - - return E([], [ - E('h2', {}, [ _('Routes') ]), - E('p', {}, [ _('The following rules are currently active on this system.') ]), + var route6tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('Network') ]), + E('th', { 'class': 'th' }, [ _('Target') ]), + E('th', { 'class': 'th' }, [ _('Source') ]), + E('th', { 'class': 'th' }, [ _('Metric') ]), + E('th', { 'class': 'th' }, [ _('Table') ]), + E('th', { 'class': 'th' }, [ _('Protocol') ]) + ]) + ]); - E('h3', {}, [ _('ARP') ]), - neigh4tbl, + var rule6tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('Priority') ]), + E('th', { 'class': 'th' }, [ _('Rule') ]) + ]) + ]); - E('h3', {}, _('Active IPv4-Routes')), - route4tbl, + cbi_update_table(neigh4tbl, this.parseNeigh(ip4neigh, networks, false), + E('em', _('No entries available')) + ); + cbi_update_table(route4tbl, this.parseRoute(ip4route, networks, false), + E('em', _('No entries available')) + ); + cbi_update_table(rule4tbl, this.parseRule(ip4rule, networks, false), + E('em', _('No entries available')) + ); + cbi_update_table(neigh6tbl, this.parseNeigh(ip6neigh, networks, true), + E('em', _('No entries available')) + ); + cbi_update_table(route6tbl, this.parseRoute(ip6route, networks, true), + E('em', _('No entries available')) + ); + cbi_update_table(rule6tbl, this.parseRule(ip6rule, networks, false), + E('em', _('No entries available')) + ); + + var view = E([], [ + E('h2', {}, [ _('Routing') ]), + E('p', {}, [ _('The following rules are currently active on this system.') ]), + E('div', {}, [ + E('div', { 'class': 'cbi-section', 'data-tab': 'ipv4routing', 'data-tab-title': _('IPv4 Routing') }, [ + E('h3', {}, [ _('IPv4 Neighbours') ]), + neigh4tbl, + + E('h3', {}, [ _('Active IPv4 Routes') ]), + route4tbl, + + E('h3', {}, [ _('Active IPv4 Rules') ]), + rule4tbl + ]), + E('div', { 'class': 'cbi-section', 'data-tab': 'ipv6routing', 'data-tab-title': _('IPv6 Routing') }, [ + E('h3', {}, [ _('IPv6 Neighbours') ]), + neigh6tbl, + + E('h3', {}, [ _('Active IPv6 Routes') ]), + route6tbl, + + E('h3', {}, [ _('Active IPv6 Rules') ]), + rule6tbl + ]) + ]) + ]); - E('h3', {}, [ _('IPv6 Neighbours') ]), - neigh6tbl, + ui.tabs.initTabGroup(view.lastElementChild.childNodes); - E('h3', {}, _('Active IPv6-Routes')), - route6tbl - ]); + return view; }, handleSaveApply: null, handleSave: null, handleReset: null }); -