diff options
Diffstat (limited to 'modules/luci-mod-status')
19 files changed, 488 insertions, 287 deletions
diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/bandwidth.svg b/modules/luci-mod-status/htdocs/luci-static/resources/svg/bandwidth.svg index 5a121b85c6..5a121b85c6 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/bandwidth.svg +++ b/modules/luci-mod-status/htdocs/luci-static/resources/svg/bandwidth.svg diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/connections.svg b/modules/luci-mod-status/htdocs/luci-static/resources/svg/connections.svg index 5794e79426..5794e79426 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/connections.svg +++ b/modules/luci-mod-status/htdocs/luci-static/resources/svg/connections.svg diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/load.svg b/modules/luci-mod-status/htdocs/luci-static/resources/svg/load.svg index 716d37617f..716d37617f 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/load.svg +++ b/modules/luci-mod-status/htdocs/luci-static/resources/svg/load.svg diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/wifirate.svg b/modules/luci-mod-status/htdocs/luci-static/resources/svg/wifirate.svg index e75ea614c9..e75ea614c9 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/wifirate.svg +++ b/modules/luci-mod-status/htdocs/luci-static/resources/svg/wifirate.svg diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/wireless.svg b/modules/luci-mod-status/htdocs/luci-static/resources/svg/wireless.svg index 00cc2a12f1..00cc2a12f1 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/wireless.svg +++ b/modules/luci-mod-status/htdocs/luci-static/resources/svg/wireless.svg diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js index edb934ed93..cb7cf8c23d 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/bandwidth.js @@ -27,7 +27,7 @@ function rate(n, br) { return view.extend({ load: function() { return Promise.all([ - this.loadSVG(L.resource('bandwidth.svg')), + this.loadSVG(L.resource('svg/bandwidth.svg')), network.getDevices() ]); }, @@ -260,26 +260,26 @@ return view.extend({ E('div', { 'class': 'right' }, E('small', { 'id': 'scale' }, '-')), E('br'), - E('div', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid blue' }, [ _('Inbound:') ])), - E('div', { 'class': 'td', 'id': 'rx_bw_cur' }, rate(0, true)), + E('table', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid blue' }, [ _('Inbound:') ])), + E('td', { 'class': 'td', 'id': 'rx_bw_cur' }, rate(0, true)), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'rx_bw_avg' }, rate(0, true)), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'rx_bw_avg' }, rate(0, true)), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'rx_bw_peak' }, rate(0, true)) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'rx_bw_peak' }, rate(0, true)) ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid green' }, [ _('Outbound:') ])), - E('div', { 'class': 'td', 'id': 'tx_bw_cur' }, rate(0, true)), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid green' }, [ _('Outbound:') ])), + E('td', { 'class': 'td', 'id': 'tx_bw_cur' }, rate(0, true)), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'tx_bw_avg' }, rate(0, true)), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'tx_bw_avg' }, rate(0, true)), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'tx_bw_peak' }, rate(0, true)) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'tx_bw_peak' }, rate(0, true)) ]) ]) ])); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js index 4c1b097f2b..9d97569d22 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js @@ -36,7 +36,7 @@ Math.log2 = Math.log2 || function(x) { return Math.log(x) * Math.LOG2E; }; return view.extend({ load: function() { return Promise.all([ - this.loadSVG(L.resource('connections.svg')) + this.loadSVG(L.resource('svg/connections.svg')) ]); }, @@ -321,36 +321,36 @@ return view.extend({ E('div', { 'class': 'right' }, E('small', { 'id': 'scale' }, '-')), E('br'), - E('div', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid blue' }, [ _('UDP:') ])), - E('div', { 'class': 'td', 'id': 'lb_udp_cur' }, [ '0' ]), + E('table', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid blue' }, [ _('UDP:') ])), + E('td', { 'class': 'td', 'id': 'lb_udp_cur' }, [ '0' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'lb_udp_avg' }, [ '0' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'lb_udp_avg' }, [ '0' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'lb_udp_peak' }, [ '0' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'lb_udp_peak' }, [ '0' ]) ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid green' }, [ _('TCP:') ])), - E('div', { 'class': 'td', 'id': 'lb_tcp_cur' }, [ '0' ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid green' }, [ _('TCP:') ])), + E('td', { 'class': 'td', 'id': 'lb_tcp_cur' }, [ '0' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'lb_tcp_avg' }, [ '0' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'lb_tcp_avg' }, [ '0' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'lb_tcp_peak' }, [ '0' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'lb_tcp_peak' }, [ '0' ]) ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid red' }, [ _('Other:') ])), - E('div', { 'class': 'td', 'id': 'lb_otr_cur' }, [ '0' ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid red' }, [ _('Other:') ])), + E('td', { 'class': 'td', 'id': 'lb_otr_cur' }, [ '0' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'lb_otr_avg' }, [ '0' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'lb_otr_avg' }, [ '0' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'lb_otr_peak' }, [ '0' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'lb_otr_peak' }, [ '0' ]) ]) ]), @@ -376,16 +376,16 @@ return view.extend({ E('br'), E('div', { 'class': 'cbi-section-node' }, [ - E('div', { 'class': 'table', 'id': 'connections' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th col-2 hide-xs' }, [ _('Network') ]), - E('div', { 'class': 'th col-2' }, [ _('Protocol') ]), - E('div', { 'class': 'th col-7' }, [ _('Source') ]), - E('div', { 'class': 'th col-7' }, [ _('Destination') ]), - E('div', { 'class': 'th col-4' }, [ _('Transfer') ]) + E('table', { 'class': 'table', 'id': 'connections' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th col-2 hide-xs' }, [ _('Network') ]), + E('th', { 'class': 'th col-2' }, [ _('Protocol') ]), + E('th', { 'class': 'th col-7' }, [ _('Source') ]), + E('th', { 'class': 'th col-7' }, [ _('Destination') ]), + E('th', { 'class': 'th col-4' }, [ _('Transfer') ]) ]), - E('div', { 'class': 'tr placeholder' }, [ - E('div', { 'class': 'td' }, [ + E('tr', { 'class': 'tr placeholder' }, [ + E('td', { 'class': 'td' }, [ E('em', {}, [ _('Collecting data...') ]) ]) ]) diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js index 942b2dd567..ea8f2bb239 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/10_system.js @@ -65,12 +65,12 @@ return baseclass.extend({ ) : null ]; - var table = E('div', { 'class': 'table' }); + var table = E('table', { 'class': 'table' }); for (var i = 0; i < fields.length; i += 2) { - table.appendChild(E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), - E('div', { 'class': 'td left' }, [ (fields[i + 1] != null) ? fields[i + 1] : '?' ]) + table.appendChild(E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), + E('td', { 'class': 'td left' }, [ (fields[i + 1] != null) ? fields[i + 1] : '?' ]) ])); } diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js index ceb13b56fa..3e89578002 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js @@ -43,12 +43,12 @@ return baseclass.extend({ if (swap.total > 0) fields.push(_('Swap free'), swap.free, swap.total); - var table = E('div', { 'class': 'table' }); + var table = E('table', { 'class': 'table' }); for (var i = 0; i < fields.length; i += 3) { - table.appendChild(E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), - E('div', { 'class': 'td left' }, [ + table.appendChild(E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), + E('td', { 'class': 'td left' }, [ (fields[i + 1] != null) ? progressbar(fields[i + 1], fields[i + 2], true) : '?' ]) ])); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js index d528408236..3359ca82cc 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/30_network.js @@ -81,12 +81,12 @@ return baseclass.extend({ _('Active Connections'), ct_max ? ct_count : null ]; - var ctstatus = E('div', { 'class': 'table' }); + var ctstatus = E('table', { 'class': 'table' }); for (var i = 0; i < fields.length; i += 2) { - ctstatus.appendChild(E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), - E('div', { 'class': 'td left' }, [ + ctstatus.appendChild(E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]), + E('td', { 'class': 'td left' }, [ (fields[i + 1] != null) ? progressbar(fields[i + 1], ct_max) : '?' ]) ])); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js index 603c0d93aa..e06b555e83 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js @@ -1,7 +1,9 @@ 'use strict'; 'require baseclass'; 'require rpc'; +'require uci'; 'require network'; +'require validation'; var callLuciDHCPLeases = rpc.declare({ object: 'luci-rpc', @@ -12,29 +14,85 @@ var callLuciDHCPLeases = rpc.declare({ return baseclass.extend({ title: '', + isMACStatic: {}, + isDUIDStatic: {}, + load: function() { return Promise.all([ callLuciDHCPLeases(), - network.getHostHints() + network.getHostHints(), + uci.load('dhcp') ]); }, + handleCreateStaticLease: function(lease, ev) { + ev.currentTarget.classList.add('spinning'); + ev.currentTarget.disabled = true; + ev.currentTarget.blur(); + + var cfg = uci.add('dhcp', 'host'); + uci.set('dhcp', cfg, 'name', lease.hostname || '-'); + uci.set('dhcp', cfg, 'ip', lease.ipaddr); + uci.set('dhcp', cfg, 'mac', lease.macaddr.toUpperCase()); + + return uci.save() + .then(L.bind(L.ui.changes.init, L.ui.changes)) + .then(L.bind(L.ui.changes.displayChanges, L.ui.changes)); + }, + + handleCreateStaticLease6: function(lease, ev) { + ev.currentTarget.classList.add('spinning'); + ev.currentTarget.disabled = true; + ev.currentTarget.blur(); + + var cfg = uci.add('dhcp', 'host'), + ip6arr = lease.ip6addrs[0] ? validation.parseIPv6(lease.ip6addrs[0]) : null; + + uci.set('dhcp', cfg, 'name', lease.hostname || '-'); + uci.set('dhcp', cfg, 'duid', lease.duid.toUpperCase()); + uci.set('dhcp', cfg, 'mac', lease.macaddr); + if (ip6arr) + uci.set('dhcp', cfg, 'hostid', (ip6arr[6] * 0xFFFF + ip6arr[7]).toString(16)); + + return uci.save() + .then(L.bind(L.ui.changes.init, L.ui.changes)) + .then(L.bind(L.ui.changes.displayChanges, L.ui.changes)); + }, + renderLeases: function(data) { var leases = Array.isArray(data[0].dhcp_leases) ? data[0].dhcp_leases : [], leases6 = Array.isArray(data[0].dhcp6_leases) ? data[0].dhcp6_leases : [], - machints = data[1].getMACHints(false); - - var table = E('div', { 'class': 'table lases' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, _('Hostname')), - E('div', { 'class': 'th' }, _('IPv4-Address')), - E('div', { 'class': 'th' }, _('MAC-Address')), - E('div', { 'class': 'th' }, _('Lease time remaining')) + machints = data[1].getMACHints(false), + hosts = uci.sections('dhcp', 'host'); + + for (var i = 0; i < hosts.length; i++) { + var host = hosts[i]; + + if (host.mac) { + var macs = L.toArray(host.mac); + for (var j = 0; j < macs.length; j++) { + var mac = macs[j].toUpperCase(); + this.isMACStatic[mac] = true; + } + } + if (host.duid) { + var duid = host.duid.toUpperCase(); + this.isDUIDStatic[duid] = true; + } + }; + + var table = E('table', { 'class': 'table lases' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, _('Hostname')), + E('th', { 'class': 'th' }, _('IPv4-Address')), + E('th', { 'class': 'th' }, _('MAC-Address')), + E('th', { 'class': 'th' }, _('Lease time remaining')), + E('th', { 'class': 'th cbi-section-actions' }, _('Static Lease')) ]) ]); - cbi_update_table(table, leases.map(function(lease) { - var exp; + cbi_update_table(table, leases.map(L.bind(function(lease) { + var exp, rows; if (lease.expires === false) exp = E('em', _('unlimited')); @@ -43,25 +101,37 @@ return baseclass.extend({ else exp = '%t'.format(lease.expires); - return [ + rows = [ lease.hostname || '-', lease.ipaddr, lease.macaddr, exp ]; - }), E('em', _('There are no active leases'))); - - var table6 = E('div', { 'class': 'table leases6' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, _('Host')), - E('div', { 'class': 'th' }, _('IPv6-Address')), - E('div', { 'class': 'th' }, _('DUID')), - E('div', { 'class': 'th' }, _('Lease time remaining')) + + if (lease.macaddr != null) { + var mac = lease.macaddr.toUpperCase(); + rows.push(E('button', { + 'class': 'cbi-button cbi-button-apply', + 'click': L.bind(this.handleCreateStaticLease, this, lease), + 'disabled': this.isMACStatic[mac] + }, [ _('Set Static') ])); + } + + return rows; + }, this)), E('em', _('There are no active leases'))); + + var table6 = E('table', { 'class': 'table leases6' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, _('Host')), + E('th', { 'class': 'th' }, _('IPv6-Address')), + E('th', { 'class': 'th' }, _('DUID')), + E('th', { 'class': 'th' }, _('Lease time remaining')), + E('th', { 'class': 'th cbi-section-actions' }, _('Static Lease')) ]) ]); - cbi_update_table(table6, leases6.map(function(lease) { - var exp; + cbi_update_table(table6, leases6.map(L.bind(function(lease) { + var exp, rows; if (lease.expires === false) exp = E('em', _('unlimited')); @@ -80,13 +150,24 @@ return baseclass.extend({ else if (hint) host = hint[1]; - return [ + rows = [ host || '-', lease.ip6addrs ? lease.ip6addrs.join(' ') : lease.ip6addr, lease.duid, exp ]; - }), E('em', _('There are no active leases'))); + + if (lease.duid != null) { + var duid = lease.duid.toUpperCase(); + rows.push(E('button', { + 'class': 'cbi-button cbi-button-apply', + 'click': L.bind(this.handleCreateStaticLease6, this, lease), + 'disabled': this.isDUIDStatic[duid] + }, [ _('Set Static') ])); + } + + return rows; + }, this)), E('em', _('There are no active leases'))); return E([ E('h3', _('Active DHCP Leases')), diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js index cafd554f9a..4150b55133 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/50_dsl.js @@ -16,12 +16,12 @@ function renderbox(dsl) { L.itemlist(E('span'), [ _('Line State'), '%s [0x%x]'.format(dsl.line_state, dsl.line_state_detail), _('Line Mode'), dsl.line_mode_s || '-', - _('Line Uptime'), dsl.line_uptime_s || '-', + _('Line Uptime'), '%t'.format(dsl.line_uptime), _('Annex'), dsl.annex_s || '-', _('Profile'), dsl.profile_s || '-', - _('Data Rate'), '%s/s / %s/s'.format(dsl.data_rate_down_s, dsl.data_rate_up_s), - _('Max. Attainable Data Rate (ATTNDR)'), '%s/s / %s/s'.format(dsl.max_data_rate_down_s, dsl.max_data_rate_up_s), - _('Latency'), '%s / %s'.format(dsl.latency_num_down, dsl.latency_num_up), + _('Data Rate'), '%1000.3mb/s / %1000.3mb/s'.format(dsl.data_rate_down, dsl.data_rate_up), + _('Max. Attainable Data Rate (ATTNDR)'), '%1000.3mb/s / %1000.3mb/s'.format(dsl.max_data_rate_down, dsl.max_data_rate_up), + _('Latency'), '%.2f ms / %.2f ms'.format(dsl.latency_down / 1000, dsl.latency_up / 1000), _('Line Attenuation (LATN)'), '%.1f dB / %.1f dB'.format(dsl.line_attenuation_down, dsl.line_attenuation_up), _('Signal Attenuation (SATN)'), '%.1f dB / %.1f dB'.format(dsl.signal_attenuation_down, dsl.signal_attenuation_up), _('Noise Margin (SNR)'), '%.1f dB / %.1f dB'.format(dsl.noise_margin_down, dsl.noise_margin_up), diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js index deb6f8609f..9a956a72fe 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js @@ -2,120 +2,210 @@ 'require baseclass'; 'require dom'; 'require network'; +'require uci'; +'require fs'; 'require rpc'; -var callSessionAccess = rpc.declare({ - object: 'session', - method: 'access', - params: [ 'scope', 'object', 'function' ], - expect: { 'access': false } -}); - -function renderbox(radio, networks) { - var chan = null, - freq = null, - rate = null, - badges = []; - - for (var i = 0; i < networks.length; i++) { - var net = networks[i], - is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()), - quality = net.getSignalPercent(); - - var icon; - if (net.isDisabled()) - icon = L.resource('icons/signal-none.png'); - else if (quality <= 0) - icon = L.resource('icons/signal-0.png'); - else if (quality < 25) - icon = L.resource('icons/signal-0-25.png'); - else if (quality < 50) - icon = L.resource('icons/signal-25-50.png'); - else if (quality < 75) - icon = L.resource('icons/signal-50-75.png'); - else - icon = L.resource('icons/signal-75-100.png'); - - var badge = renderBadge( - icon, - '%s: %d dBm / %s: %d%%'.format(_('Signal'), net.getSignal(), _('Quality'), quality), - _('SSID'), net.getActiveSSID() || '?', - _('Mode'), net.getActiveMode(), - _('BSSID'), is_assoc ? (net.getActiveBSSID() || '-') : null, - _('Encryption'), is_assoc ? net.getActiveEncryption() : null, - _('Associations'), is_assoc ? (net.assoclist.length || '-') : null, - null, is_assoc ? null : E('em', net.isDisabled() ? _('Wireless is disabled') : _('Wireless is not associated'))); - - badges.push(badge); - - chan = (chan != null) ? chan : net.getChannel(); - freq = (freq != null) ? freq : net.getFrequency(); - rate = (rate != null) ? rate : net.getBitRate(); - } +return baseclass.extend({ + title: _('Wireless'), - return E('div', { class: 'ifacebox' }, [ - E('div', { class: 'ifacebox-head center ' + (radio.isUp() ? 'active' : '') }, - E('strong', radio.getName())), - E('div', { class: 'ifacebox-body left' }, [ - L.itemlist(E('span'), [ - _('Type'), radio.getI18n().replace(/^Generic | Wireless Controller .+$/g, ''), - _('Channel'), chan ? '%d (%.3f %s)'.format(chan, freq, _('GHz')) : '-', - _('Bitrate'), rate ? '%d %s'.format(rate, _('Mbit/s')) : '-' - ]), - E('div', {}, badges) - ]) - ]); -} - -function wifirate(rt) { - var s = '%.1f\xa0%s, %d\xa0%s'.format(rt.rate / 1000, _('Mbit/s'), rt.mhz, _('MHz')), - ht = rt.ht, vht = rt.vht, - mhz = rt.mhz, nss = rt.nss, - mcs = rt.mcs, sgi = rt.short_gi; - - if (ht || vht) { - if (vht) s += ', VHT-MCS\xa0%d'.format(mcs); - if (nss) s += ', VHT-NSS\xa0%d'.format(nss); - if (ht) s += ', MCS\xa0%s'.format(mcs); - if (sgi) s += ', ' + _('Short GI').replace(/ /g, '\xa0'); - } + WPSTranslateTbl: { + Disabled: _('Disabled'), + Active: _('Active'), + 'Timed-out': _('Timed-out'), + Overlap: _('Overlap'), + Unknown: _('Unknown') + }, - return s; -} + callSessionAccess: rpc.declare({ + object: 'session', + method: 'access', + params: [ 'scope', 'object', 'function' ], + expect: { 'access': false } + }), + + wifirate: function(rt) { + var s = '%.1f\xa0%s, %d\xa0%s'.format(rt.rate / 1000, _('Mbit/s'), rt.mhz, _('MHz')), + ht = rt.ht, vht = rt.vht, + mhz = rt.mhz, nss = rt.nss, + mcs = rt.mcs, sgi = rt.short_gi; + + if (ht || vht) { + if (vht) s += ', VHT-MCS\xa0%d'.format(mcs); + if (nss) s += ', VHT-NSS\xa0%d'.format(nss); + if (ht) s += ', MCS\xa0%s'.format(mcs); + if (sgi) s += ', ' + _('Short GI').replace(/ /g, '\xa0'); + } + + return s; + }, -return baseclass.extend({ - title: _('Wireless'), + handleDelClient: function(wifinet, mac, ev, cmd) { + var exec = cmd || 'disconnect'; - handleDelClient: function(wifinet, mac, ev) { dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5; ev.currentTarget.classList.add('spinning'); ev.currentTarget.disabled = true; ev.currentTarget.blur(); + if (exec == 'addlist') { + var macs = [ mac ] + + for (var mac in this.iface_maclist) { + macs.push(mac) + } + + uci.set('wireless', wifinet.sid, 'maclist', macs); + + return uci.save() + .then(L.bind(L.ui.changes.init, L.ui.changes)) + .then(L.bind(L.ui.changes.displayChanges, L.ui.changes)); + } + wifinet.disconnectClient(mac, true, 5, 60000); }, + handleGetWPSStatus: function(wifinet) { + return rpc.declare({ + object: 'hostapd.%s'.format(wifinet), + method: 'wps_status', + })() + }, + + handleCallWPS: function(wifinet, ev) { + ev.currentTarget.classList.add('spinning'); + ev.currentTarget.disabled = true; + ev.currentTarget.blur(); + + return rpc.declare({ + object: 'hostapd.%s'.format(wifinet), + method: 'wps_start', + })(); + }, + + handleCancelWPS: function(wifinet, ev) { + ev.currentTarget.classList.add('spinning'); + ev.currentTarget.disabled = true; + ev.currentTarget.blur(); + + return rpc.declare({ + object: 'hostapd.%s'.format(wifinet), + method: 'wps_cancel', + })(); + }, + + renderbox: function(radio, networks) { + var chan = null, + freq = null, + rate = null, + badges = []; + + for (var i = 0; i < networks.length; i++) { + var net = networks[i], + is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()), + quality = net.getSignalPercent(); + + var icon; + if (net.isDisabled()) + icon = L.resource('icons/signal-none.png'); + else if (quality <= 0) + icon = L.resource('icons/signal-0.png'); + else if (quality < 25) + icon = L.resource('icons/signal-0-25.png'); + else if (quality < 50) + icon = L.resource('icons/signal-25-50.png'); + else if (quality < 75) + icon = L.resource('icons/signal-50-75.png'); + else + icon = L.resource('icons/signal-75-100.png'); + + var WPS_button = null; + + if (this.isWPSEnabled[net.sid]) { + if (net.wps_status == 'Active') { + WPS_button = E('button', { + 'class' : 'cbi-button cbi-button-remove', + 'click': L.bind(this.handleCancelWPS, this, net.getIfname()), + }, [ _('Stop WPS') ]) + } else { + WPS_button = E('button', { + 'class' : 'cbi-button cbi-button-apply', + 'click': L.bind(this.handleCallWPS, this, net.getIfname()), + }, [ _('Start WPS') ]) + } + } + + var badge = renderBadge( + icon, + '%s: %d dBm / %s: %d%%'.format(_('Signal'), net.getSignal(), _('Quality'), quality), + _('SSID'), net.getActiveSSID() || '?', + _('Mode'), net.getActiveMode(), + _('BSSID'), is_assoc ? (net.getActiveBSSID() || '-') : null, + _('Encryption'), is_assoc ? net.getActiveEncryption() : null, + _('Associations'), is_assoc ? (net.assoclist.length || '-') : null, + null, is_assoc ? null : E('em', net.isDisabled() ? _('Wireless is disabled') : _('Wireless is not associated')), + _('WPS status'), this.WPSTranslateTbl[net.wps_status], + '', WPS_button + ); + + badges.push(badge); + + chan = (chan != null) ? chan : net.getChannel(); + freq = (freq != null) ? freq : net.getFrequency(); + rate = (rate != null) ? rate : net.getBitRate(); + } + + return E('div', { class: 'ifacebox' }, [ + E('div', { class: 'ifacebox-head center ' + (radio.isUp() ? 'active' : '') }, + E('strong', radio.getName())), + E('div', { class: 'ifacebox-body left' }, [ + L.itemlist(E('span'), [ + _('Type'), radio.getI18n().replace(/^Generic | Wireless Controller .+$/g, ''), + _('Channel'), chan ? '%d (%.3f %s)'.format(chan, freq, _('GHz')) : '-', + _('Bitrate'), rate ? '%d %s'.format(rate, _('Mbit/s')) : '-', + ]), + E('div', {}, badges) + ]) + ]); + }, + + isWPSEnabled: {}, + load: function() { return Promise.all([ network.getWifiDevices(), network.getWifiNetworks(), network.getHostHints(), - callSessionAccess('access-group', 'luci-mod-status-index-wifi', 'read'), - callSessionAccess('access-group', 'luci-mod-status-index-wifi', 'write') - ]).then(function(radios_networks_hints) { - var tasks = []; - - for (var i = 0; i < radios_networks_hints[1].length; i++) - tasks.push(L.resolveDefault(radios_networks_hints[1][i].getAssocList(), []).then(L.bind(function(net, list) { + this.callSessionAccess('access-group', 'luci-mod-status-index-wifi', 'read'), + this.callSessionAccess('access-group', 'luci-mod-status-index-wifi', 'write'), + uci.load('wireless') + ]).then(L.bind(function(data) { + var tasks = [], + radios_networks_hints = data[1], + hasWPS = L.hasSystemFeature('hostapd', 'wps'); + + for (var i = 0; i < radios_networks_hints.length; i++) { + tasks.push(L.resolveDefault(radios_networks_hints[i].getAssocList(), []).then(L.bind(function(net, list) { net.assoclist = list.sort(function(a, b) { return a.mac > b.mac }); - }, this, radios_networks_hints[1][i]))); + }, this, radios_networks_hints[i]))); + + if (hasWPS && uci.get('wireless', radios_networks_hints[i].sid, 'wps_pushbutton') == '1') { + this.isWPSEnabled[radios_networks_hints[i].sid] = true; + tasks.push(L.resolveDefault(this.handleGetWPSStatus(radios_networks_hints[i].getIfname()), null) + .then(L.bind(function(net, data) { + net.wps_status = data ? data.pbc_status : _('No Data'); + }, this, radios_networks_hints[i]))); + } + } return Promise.all(tasks).then(function() { - return radios_networks_hints; + return data; }); - }); + }, this)); }, + isDeviceAdded: {}, + render: function(data) { var seen = {}, radios = data[0], @@ -127,25 +217,36 @@ return baseclass.extend({ var table = E('div', { 'class': 'network-status-table' }); for (var i = 0; i < radios.sort(function(a, b) { a.getName() > b.getName() }).length; i++) - table.appendChild(renderbox(radios[i], + table.appendChild(this.renderbox(radios[i], networks.filter(function(net) { return net.getWifiDeviceName() == radios[i].getName() }))); if (!table.lastElementChild) return null; - var assoclist = E('div', { 'class': 'table assoclist' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th nowrap' }, _('Network')), - E('div', { 'class': 'th hide-xs' }, _('MAC-Address')), - E('div', { 'class': 'th' }, _('Host')), - E('div', { 'class': 'th' }, '%s / %s'.format(_('Signal'), _('Noise'))), - E('div', { 'class': 'th' }, '%s / %s'.format(_('RX Rate'), _('TX Rate'))) + var assoclist = E('table', { 'class': 'table assoclist' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th nowrap' }, _('Network')), + E('th', { 'class': 'th hide-xs' }, _('MAC-Address')), + E('th', { 'class': 'th' }, _('Host')), + E('th', { 'class': 'th' }, '%s / %s'.format(_('Signal'), _('Noise'))), + E('th', { 'class': 'th' }, '%s / %s'.format(_('RX Rate'), _('TX Rate'))) ]) ]); var rows = []; for (var i = 0; i < networks.length; i++) { + var macfilter = uci.get('wireless', networks[i].sid, 'macfilter'); + + if (macfilter != null && macfilter != 'disable') { + this.isDeviceAdded = {}; + var macs = L.toArray(uci.get('wireless', networks[i].sid, 'maclist')); + for (var j = 0; j < macs.length; j++) { + var mac = macs[j].toUpperCase(); + this.isDeviceAdded[mac] = true; + } + } + for (var k = 0; k < networks[i].assoclist.length; k++) { var bss = networks[i].assoclist[k], name = hosthints.getHostnameByMACAddr(bss.mac), @@ -215,20 +316,36 @@ return baseclass.extend({ ]) ]), E('span', {}, [ - E('span', wifirate(bss.rx)), + E('span', this.wifirate(bss.rx)), E('br'), - E('span', wifirate(bss.tx)) + E('span', this.wifirate(bss.tx)) ]) ]; if (networks[i].isClientDisconnectSupported() && hasWritePermission) { if (assoclist.firstElementChild.childNodes.length < 6) - assoclist.firstElementChild.appendChild(E('div', { 'class': 'th cbi-section-actions' })); - - row.push(E('button', { - 'class': 'cbi-button cbi-button-remove', - 'click': L.bind(this.handleDelClient, this, networks[i], bss.mac) - }, [ _('Disconnect') ])); + assoclist.firstElementChild.appendChild(E('th', { 'class': 'th cbi-section-actions' })); + + if (macfilter != null && macfilter != 'disable' && !this.isDeviceAdded[bss.mac]) { + row.push(new L.ui.ComboButton('button', { + 'addlist': macfilter == 'allow' ? _('Add to Whitelist') : _('Add to Blacklist'), + 'disconnect': _('Disconnect') + }, { + 'click': L.bind(this.handleDelClient, this, networks[i], bss.mac), + 'sort': [ 'disconnect', 'addlist' ], + 'classes': { + 'addlist': 'btn cbi-button cbi-button-remove', + 'disconnect': 'btn cbi-button cbi-button-remove' + } + }).render() + ) + } + else { + row.push(E('button', { + 'class': 'cbi-button cbi-button-remove', + 'click': L.bind(this.handleDelClient, this, networks[i], bss.mac) + }, [ _('Disconnect') ])); + } } else { row.push('-'); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js index 84d2b10556..2ce744c60e 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js @@ -58,18 +58,18 @@ return view.extend({ if (!cdiv) { cdiv = E('div', { 'data-chain': chain }, [ E('h4', { 'id': 'rule_%s-%s_%s'.format(is_ipv6 ? 'ipv6' : 'ipv4', table.toLowerCase(), chain) }, title), - E('div', { 'class': 'table' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th center' }, _('Pkts.')), - E('div', { 'class': 'th center' }, _('Traffic')), - E('div', { 'class': 'th' }, _('Target')), - E('div', { 'class': 'th' }, _('Prot.')), - E('div', { 'class': 'th' }, _('In')), - E('div', { 'class': 'th' }, _('Out')), - E('div', { 'class': 'th' }, _('Source')), - E('div', { 'class': 'th' }, _('Destination')), - E('div', { 'class': 'th' }, _('Options')), - E('div', { 'class': 'th' }, _('Comment')) + E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th center' }, _('Pkts.')), + E('th', { 'class': 'th center' }, _('Traffic')), + E('th', { 'class': 'th' }, _('Target')), + E('th', { 'class': 'th' }, _('Prot.')), + E('th', { 'class': 'th' }, _('In')), + E('th', { 'class': 'th' }, _('Out')), + E('th', { 'class': 'th' }, _('Source')), + E('th', { 'class': 'th' }, _('Destination')), + E('th', { 'class': 'th' }, _('Options')), + E('th', { 'class': 'th' }, _('Comment')) ]) ]) ]); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js index 3b302dc509..2766f5d1b5 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/load.js @@ -19,7 +19,7 @@ Math.log2 = Math.log2 || function(x) { return Math.log(x) * Math.LOG2E; }; return view.extend({ load: function() { return Promise.all([ - this.loadSVG(L.resource('load.svg')) + this.loadSVG(L.resource('svg/load.svg')) ]); }, @@ -226,36 +226,36 @@ return view.extend({ E('div', { 'class': 'right' }, E('small', { 'id': 'scale' }, '-')), E('br'), - E('div', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid #f00' }, [ _('1 Minute Load:') ])), - E('div', { 'class': 'td', 'id': 'lb_load01_cur' }, [ '0.00' ]), + E('table', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid #f00' }, [ _('1 Minute Load:') ])), + E('td', { 'class': 'td', 'id': 'lb_load01_cur' }, [ '0.00' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'lb_load01_avg' }, [ '0.00' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'lb_load01_avg' }, [ '0.00' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'lb_load01_peak' }, [ '0.00' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'lb_load01_peak' }, [ '0.00' ]) ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid #f60' }, [ _('5 Minute Load:') ])), - E('div', { 'class': 'td', 'id': 'lb_load05_cur' }, [ '0.00' ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid #f60' }, [ _('5 Minute Load:') ])), + E('td', { 'class': 'td', 'id': 'lb_load05_cur' }, [ '0.00' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'lb_load05_avg' }, [ '0.00' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'lb_load05_avg' }, [ '0.00' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'lb_load05_peak' }, [ '0.00' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'lb_load05_peak' }, [ '0.00' ]) ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid #fa0' }, [ _('15 Minute Load:') ])), - E('div', { 'class': 'td', 'id': 'lb_load15_cur' }, [ '0.00' ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid #fa0' }, [ _('15 Minute Load:') ])), + E('td', { 'class': 'td', 'id': 'lb_load15_cur' }, [ '0.00' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'lb_load15_avg' }, [ '0.00' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'lb_load15_avg' }, [ '0.00' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'lb_load15_peak' }, [ '0.00' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'lb_load15_peak' }, [ '0.00' ]) ]) ]) ]); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js index 8a77306e57..e7d094a7f9 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/processes.js @@ -64,14 +64,14 @@ return view.extend({ E('h2', _('Processes')), E('div', { 'class': 'cbi-map-descr' }, _('This list gives an overview over currently running system processes and their status.')), - E('div', { 'class': 'table' }, [ - E('div', { 'class': 'tr table-titles' }, [ - E('div', { 'class': 'th' }, _('PID')), - E('div', { 'class': 'th' }, _('Owner')), - E('div', { 'class': 'th' }, _('Command')), - E('div', { 'class': 'th' }, _('CPU usage (%)')), - E('div', { 'class': 'th' }, _('Memory usage (%)')), - E('div', { 'class': 'th center nowrap cbi-section-actions' }) + E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, _('PID')), + E('th', { 'class': 'th' }, _('Owner')), + E('th', { 'class': 'th' }, _('Command')), + E('th', { 'class': 'th' }, _('CPU usage (%)')), + E('th', { 'class': 'th' }, _('Memory usage (%)')), + E('th', { 'class': 'th center nowrap cbi-section-actions' }) ]) ]) ]); 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..9d959f34a5 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 @@ -135,7 +135,8 @@ return view.extend({ dest, (v6 ? flags.from : flags.via) || '-', String(flags.metric || 0), - flags.table || 'main' + flags.table || 'main', + flags.proto, ]); } @@ -149,39 +150,41 @@ return view.extend({ 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') ]) + var neigh4tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('IPv4-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' }, [ _('IPv4-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 neigh6tbl = E('table', { 'class': 'table' }, [ + E('tr', { 'class': 'tr table-titles' }, [ + E('th', { 'class': 'th' }, [ _('IPv6-Address') ]), + E('th', { 'class': 'th' }, [ _('MAC-Address') ]), + E('th', { 'class': 'th' }, [ _('Interface') ]) ]) ]); - 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 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') ]), ]) ]); diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js index 171899262a..a7fa69095c 100644 --- a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js +++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/wireless.js @@ -21,8 +21,8 @@ Math.log2 = Math.log2 || function(x) { return Math.log(x) * Math.LOG2E; }; return view.extend({ load: function() { return Promise.all([ - this.loadSVG(L.resource('wireless.svg')), - this.loadSVG(L.resource('wifirate.svg')), + this.loadSVG(L.resource('svg/wireless.svg')), + this.loadSVG(L.resource('svg/wifirate.svg')), network.getWifiDevices().then(function(radios) { var tasks = [], all_networks = []; @@ -255,26 +255,26 @@ return view.extend({ E('div', { 'class': 'right' }, E('small', { 'id': 'scale' }, '-')), E('br'), - E('div', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid blue' }, [ _('Signal:') ])), - E('div', { 'class': 'td', 'id': 'rssi_bw_cur' }, [ '0 ' + _('dBm') ]), + E('table', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid blue' }, [ _('Signal:') ])), + E('td', { 'class': 'td', 'id': 'rssi_bw_cur' }, [ '0 ' + _('dBm') ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'rssi_bw_avg' }, [ '0 ' + _('dBm') ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'rssi_bw_avg' }, [ '0 ' + _('dBm') ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'rssi_bw_peak' }, [ '0 ' + _('dBm') ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'rssi_bw_peak' }, [ '0 ' + _('dBm') ]) ]), - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid red' }, [ _('Noise:') ])), - E('div', { 'class': 'td', 'id': 'noise_bw_cur' }, [ '0 ' + _('dBm') ]), + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid red' }, [ _('Noise:') ])), + E('td', { 'class': 'td', 'id': 'noise_bw_cur' }, [ '0 ' + _('dBm') ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'noise_bw_avg' }, [ '0 ' + _('dBm') ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'noise_bw_avg' }, [ '0 ' + _('dBm') ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'noise_bw_peak' }, [ '0 ' + _('dBm') ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'noise_bw_peak' }, [ '0 ' + _('dBm') ]) ]) ]), E('br'), @@ -283,16 +283,16 @@ return view.extend({ E('div', { 'class': 'right' }, E('small', { 'id': 'scale2' }, '-')), E('br'), - E('div', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ - E('div', { 'class': 'tr' }, [ - E('div', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid green' }, [ _('Phy Rate:') ])), - E('div', { 'class': 'td', 'id': 'rate_bw_cur' }, [ '0 MBit/s' ]), + E('table', { 'class': 'table', 'style': 'width:100%;table-layout:fixed' }, [ + E('tr', { 'class': 'tr' }, [ + E('td', { 'class': 'td right top' }, E('strong', { 'style': 'border-bottom:2px solid green' }, [ _('Phy Rate:') ])), + E('td', { 'class': 'td', 'id': 'rate_bw_cur' }, [ '0 MBit/s' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), - E('div', { 'class': 'td', 'id': 'rate_bw_avg' }, [ '0 MBit/s' ]), + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Average:') ])), + E('td', { 'class': 'td', 'id': 'rate_bw_avg' }, [ '0 MBit/s' ]), - E('div', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), - E('div', { 'class': 'td', 'id': 'rate_bw_peak' }, [ '0 MBit/s' ]) + E('td', { 'class': 'td right top' }, E('strong', {}, [ _('Peak:') ])), + E('td', { 'class': 'td', 'id': 'rate_bw_peak' }, [ '0 MBit/s' ]) ]) ]) ])); diff --git a/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json b/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json index 4c9067db15..5029bbed47 100644 --- a/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json +++ b/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json @@ -134,7 +134,7 @@ }, "write": { "ubus": { - "hostapd.*": [ "del_client" ] + "hostapd.*": [ "del_client", "wps_start", "wps_cancel", "wps_status" ] } } } |