1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
'use strict';
'require uci';
'require view';
'require dawn.dawn-common as dawn';
return view.extend({
handleSaveApply: null,
handleSave: null,
handleReset: null,
load: function() {
return Promise.all([
dawn.isDawnRPCAvailable().then(function(isAvailable) {
return ( isAvailable ? dawn.callDawnGetNetwork() : null );
}),
dawn.callHostHints()
]);
},
render: function(data) {
const dawnNetworkData = data[0];
const hostHintsData = data[1];
if (!dawnNetworkData) {
return dawn.getDawnServiceNotRunningErrorMessage();
}
const body = E([
E('h2', _('Network Overview'))
]);
let client_table = {};
for (let network in dawnNetworkData) {
body.appendChild(
E('h3', 'SSID: ' + network)
);
let ap_table = E('table', { 'class': 'table cbi-section-table' }, [
E('tr', { 'class': 'tr table-titles' }, [
E('th', { 'class': 'th left cbi-section-actions' }, _('Access Point')),
E('th', { 'class': 'th left cbi-section-actions' }, _('Interface')),
E('th', { 'class': 'th left cbi-section-actions' }, _('MAC')),
E('th', { 'class': 'th left cbi-section-actions' }, _('Utilization')),
E('th', { 'class': 'th left cbi-section-actions' }, _('Frequency')),
E('th', { 'class': 'th left cbi-section-actions' }, _('Stations Connected')),
E('th', { 'class': 'th left cbi-section-actions' }, E('span', { 'data-tooltip': _('High Throughput') }, [ _('HT') ])),
E('th', { 'class': 'th left cbi-section-actions' }, E('span', { 'data-tooltip': _('Very High Throughput') }, [ _('VHT') ])),
E('th', { 'class': 'th center cbi-section-actions' }, _('Clients')),
])
]);
let aps = Object.entries(dawnNetworkData[network]).map(function(ap) {
client_table[ap[0]] = E('table', { 'class': 'table cbi-section-table', 'style': 'display: table' }, [
E('tr', { 'class': 'tr table-titles' }, [
E('th', { 'class': 'th' }, _('Client')),
E('th', { 'class': 'th' }, E('span', { 'data-tooltip': _('High Throughput') }, [ _('HT') ])),
E('th', { 'class': 'th' }, E('span', { 'data-tooltip': _('Very High Throughput') }, [ _('VHT') ])),
E('th', { 'class': 'th' }, _('Signal'))
])
]);
let clients = [];
let clientData = Object.entries(ap[1]);
for (let i = 0; i < clientData.length; i++) {
if (typeof clientData[i][1] === 'object') {
clients.push([
dawn.getHostnameFromMAC(hostHintsData ,clientData[i][0]),
dawn.getAvailableText(clientData[i][1].ht),
dawn.getAvailableText(clientData[i][1].vht),
clientData[i][1].signal
]);
}
}
cbi_update_table(client_table[ap[0]], clients, E('em', _('No clients connected.')));
return [
ap[1].hostname,
ap[1].iface,
ap[0],
dawn.getFormattedNumber(ap[1].channel_utilization, 2, 2.55) + '%',
dawn.getFormattedNumber(ap[1].freq, 3, 1000) + ' GHz (' + _('Channel') + ': ' + dawn.getChannelFromFrequency(ap[1].freq) + ')',
ap[1].num_sta,
dawn.getAvailableText(ap[1].ht_support),
dawn.getAvailableText(ap[1].vht_support),
ap[1].num_sta > 0 ? client_table[ap[0]] : E('em', { 'style': 'display: inline' }, _('No clients connected.'))
]
});
cbi_update_table(ap_table, aps, E('em', _('No access points available.')));
body.appendChild(ap_table);
}
return body;
}
});
|