luci-mod-status: 60_wifi.js: use new network.js functions for wifi status

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 9fac447bc8)
This commit is contained in:
Jo-Philipp Wich 2019-11-07 12:12:15 +01:00
parent bba3fdcccf
commit 1bcf09280f

View file

@ -1,15 +1,14 @@
'use strict'; 'use strict';
'require rpc';
'require network'; 'require network';
function renderbox(radio) { function renderbox(radio, networks) {
var chan = null, var chan = null,
freq = null, freq = null,
rate = null, rate = null,
badges = []; badges = [];
for (var i = 0; i < radio.networks.length; i++) { for (var i = 0; i < networks.length; i++) {
var net = radio.networks[i], var net = networks[i],
is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()), is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()),
quality = net.getSignalPercent(); quality = net.getSignalPercent();
@ -80,89 +79,64 @@ function wifirate(rt) {
return L.Class.extend({ return L.Class.extend({
title: _('Wireless'), title: _('Wireless'),
handleDelClient: function(ifname, mac, ev) { handleDelClient: function(wifinet, mac, ev) {
L.dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5;
ev.currentTarget.classList.add('spinning'); ev.currentTarget.classList.add('spinning');
ev.currentTarget.disabled = true; ev.currentTarget.disabled = true;
ev.currentTarget.blur(); ev.currentTarget.blur();
return rpc.declare({ wifinet.disconnectClient(mac, true, 5, 60000);
object: 'hostapd.%s'.format(ifname),
method: 'del_client',
params: [ 'addr', 'deauth', 'reason', 'ban_time' ]
})(mac, true, 5, 60000);
}, },
load: function() { load: function() {
return L.resolveDefault(network.getWifiDevices(), []).then(function(devices) { return Promise.all([
network.getWifiDevices(),
network.getWifiNetworks(),
network.getHostHints()
]).then(function(radios_networks_hints) {
var tasks = []; var tasks = [];
for (var i = 0; i < devices.length; i++) for (var i = 0; i < radios_networks_hints[1].length; i++)
tasks.push(L.resolveDefault(devices[i].getWifiNetworks(), []).then(L.bind(function(r, l) { tasks.push(L.resolveDefault(radios_networks_hints[1][i].getAssocList(), []).then(L.bind(function(net, list) {
r.networks = l; net.assoclist = list.sort(function(a, b) { return a.mac > b.mac });
}, this, devices[i]))); }, this, radios_networks_hints[1][i])));
return Promise.all(tasks).then(function() { return Promise.all(tasks).then(function() {
return devices; return radios_networks_hints;
});
}).then(function(devices) {
var tasks = [], deauth = {};
for (var i = 0; i < devices.length; i++) {
for (var j = 0; j < devices[i].networks.length; j++) {
tasks.push(L.resolveDefault(devices[i].networks[j].getAssocList(), []).then(L.bind(function(n, l) {
n.assoclist = l.sort(function(a, b) { return a.mac > b.mac });
}, this, devices[i].networks[j])));
tasks.push(L.resolveDefault(rpc.list('hostapd.%s'.format(devices[i].networks[j].getIfname())), {}).then(L.bind(function(n, l) {
for (var k in L.isObject(l) ? l : {})
n.supports_deauth = l[k].hasOwnProperty('del_client');
}, this, devices[i].networks[j])));
}
}
return Promise.all(tasks).then(function() {
return network.getHostHints().then(function(hosthints) {
return [ devices, hosthints ];
});
}); });
}); });
}, },
render: function(data) { render: function(data) {
var devices = data[0], var seen = {},
hosthints = data[1]; radios = data[0],
networks = data[1],
hosthints = data[2];
var table = E('div', { 'class': 'network-status-table' }); var table = E('div', { 'class': 'network-status-table' });
for (var i = 0; i < devices.length; i++) for (var i = 0; i < radios.sort(function(a, b) { a.getName() > b.getName() }).length; i++)
table.appendChild(renderbox(devices[i])); table.appendChild(renderbox(radios[i],
networks.filter(function(net) { return net.getWifiDeviceName() == radios[i].getName() })));
if (!table.lastElementChild) if (!table.lastElementChild)
return null; return null;
var supports_deauth = false;
for (var i = 0; i < devices.length; i++)
for (var j = 0; j < devices[i].networks.length; j++)
supports_deauth = supports_deauth || devices[i].networks[j].supports_deauth;
var assoclist = E('div', { 'class': 'table' }, [ var assoclist = E('div', { 'class': 'table' }, [
E('div', { 'class': 'tr table-titles' }, [ E('div', { 'class': 'tr table-titles' }, [
E('div', { 'class': 'th nowrap' }, _('Network')), E('div', { 'class': 'th nowrap' }, _('Network')),
E('div', { 'class': 'th hide-xs' }, _('MAC-Address')), E('div', { 'class': 'th hide-xs' }, _('MAC-Address')),
E('div', { 'class': 'th' }, _('Host')), E('div', { 'class': 'th' }, _('Host')),
E('div', { 'class': 'th nowrap' }, '%s / %s'.format(_('Signal'), _('Noise'))), E('div', { 'class': 'th nowrap' }, '%s / %s'.format(_('Signal'), _('Noise'))),
E('div', { 'class': 'th nowrap' }, '%s / %s'.format(_('RX Rate'), _('TX Rate'))), E('div', { 'class': 'th nowrap' }, '%s / %s'.format(_('RX Rate'), _('TX Rate')))
supports_deauth ? E('div', { 'class': 'th nowrap right' }, _('Disconnect')) : E([])
]) ])
]); ]);
var rows = []; var rows = [];
for (var i = 0; i < devices.length; i++) { for (var i = 0; i < networks.length; i++) {
for (var j = 0; j < devices[i].networks.length; j++) { for (var k = 0; k < networks[i].assoclist.length; k++) {
for (var k = 0; k < devices[i].networks[j].assoclist.length; k++) { var bss = networks[i].assoclist[k],
var bss = devices[i].networks[j].assoclist[k],
name = hosthints.getHostnameByMACAddr(bss.mac), name = hosthints.getHostnameByMACAddr(bss.mac),
ipv4 = hosthints.getIPAddrByMACAddr(bss.mac), ipv4 = hosthints.getIPAddrByMACAddr(bss.mac),
ipv6 = hosthints.getIP6AddrByMACAddr(bss.mac); ipv6 = hosthints.getIP6AddrByMACAddr(bss.mac);
@ -203,11 +177,11 @@ return L.Class.extend({
else else
hint = name || ipv4 || ipv6 || '?'; hint = name || ipv4 || ipv6 || '?';
rows.push([ var row = [
E('span', { 'class': 'ifacebadge', 'title': devices[i].networks[j].getI18n() }, [ E('span', { 'class': 'ifacebadge', 'title': networks[i].getI18n() }, [
E('img', { 'src': L.resource('icons/wifi.png') }), E('img', { 'src': L.resource('icons/wifi.png') }),
' ', devices[i].networks[j].getShortName(), ' ', networks[i].getShortName(),
E('small', {}, [ ' (', devices[i].networks[j].getIfname(), ')' ]) E('small', {}, [ ' (', networks[i].getIfname(), ')' ])
]), ]),
bss.mac, bss.mac,
hint, hint,
@ -219,13 +193,23 @@ return L.Class.extend({
E('span', wifirate(bss.rx)), E('span', wifirate(bss.rx)),
E('br'), E('br'),
E('span', wifirate(bss.tx)) E('span', wifirate(bss.tx))
]), ])
devices[i].networks[j].supports_deauth ? E('button', { ];
if (networks[i].isClientDisconnectSupported()) {
if (assoclist.firstElementChild.childNodes.length < 6)
assoclist.firstElementChild.appendChild(E('div', { 'class': 'th nowrap right' }, [ _('Disconnect') ]));
row.push(E('button', {
'class': 'cbi-button cbi-button-remove', 'class': 'cbi-button cbi-button-remove',
'click': L.bind(this.handleDelClient, this, devices[i].networks[j].getIfname(), bss.mac) 'click': L.bind(this.handleDelClient, this, networks[i], bss.mac)
}, [ _('Disconnect') ]) : '-' }, [ _('Disconnect') ]));
]);
} }
else {
row.push('-');
}
rows.push(row);
} }
} }