3 function format_signal(bss) {
4 var qval = bss.quality || 0,
5 qmax = bss.quality_max || 100,
6 scale = 100 / qmax * qval,
9 if (!bss.bssid || bss.bssid == '00:00:00:00:00:00')
24 title: '%s: %d%s / %s: %d/%d'.format(_('Signal'), bss.signal, _('dB'), _('Quality'), qval, qmax)
26 E('img', { src: L.resource('icons/signal-%s.png').format(range) }),
31 function format_encryption(bss) {
32 var enc = bss.encryption || { }
38 title: 'Pairwise: %h / Group: %h'.format(
39 enc.pair_ciphers.join(', '),
40 enc.group_ciphers.join(', '))
43 (enc.wpa === 3) ? _('mixed WPA/WPA2') : (enc.wpa === 2 ? 'WPA2' : 'WPA'),
44 enc.auth_suites.join(', ')));
46 return E('em', enc.enabled ? _('unknown') : _('open'));
49 function format_actions(dev, type, bss) {
50 var enc = bss.encryption || { },
52 E('input', { type: 'submit', class: 'cbi-button cbi-button-action important', value: _('Join Network') }),
53 E('input', { type: 'hidden', name: 'token', value: L.env.token }),
54 E('input', { type: 'hidden', name: 'device', value: dev }),
55 E('input', { type: 'hidden', name: 'join', value: bss.ssid }),
56 E('input', { type: 'hidden', name: 'mode', value: bss.mode }),
57 E('input', { type: 'hidden', name: 'bssid', value: bss.bssid }),
58 E('input', { type: 'hidden', name: 'channel', value: bss.channel }),
59 E('input', { type: 'hidden', name: 'clbridge', value: type === 'wl' ? 1 : 0 }),
60 E('input', { type: 'hidden', name: 'wep', value: enc.wep ? 1 : 0 })
64 input.push(E('input', { type: 'hidden', name: 'wpa_version', value: enc.wpa }));
66 enc.auth_suites.forEach(function(s) {
67 input.push(E('input', { type: 'hidden', name: 'wpa_suites', value: s }));
70 enc.group_ciphers.forEach(function(s) {
71 input.push(E('input', { type: 'hidden', name: 'wpa_group', value: s }));
74 enc.pair_ciphers.forEach(function(s) {
75 input.push(E('input', { type: 'hidden', name: 'wpa_pairwise', value: s }));
82 action: L.url('admin/network/wireless_join')
86 function fade(bss, content) {
88 return E('span', { style: 'opacity:0.5' }, content);
101 var tbl = document.querySelector('[data-wifi-scan]'),
102 dev = tbl.getAttribute('data-wifi-scan'),
103 type = tbl.getAttribute('data-wifi-type');
105 cbi_update_table(tbl, [], E('em', { class: 'spinning' }, _('Starting wireless scan...')));
107 L.post(L.url('admin/network/wireless_scan_trigger', dev), null, function(s) {
108 if (s.status !== 204) {
109 cbi_update_table(tbl, [], E('em', _('Scan request failed')));
115 poll = L.poll(3, L.url('admin/network/wireless_scan_results', dev), null, function(s, results) {
116 if (Array.isArray(results)) {
119 results.sort(function(a, b) {
120 var diff = (b.quality - a.quality) || (a.channel - b.channel);
127 else if (a.ssid > b.ssid)
130 if (a.bssid < b.bssid)
132 else if (a.bssid > b.bssid)
134 }).forEach(function(res) {
136 fade(res, format_signal(res)),
137 fade(res, res.ssid ? '%h'.format(res.ssid) : E('em', {}, _('hidden'))),
138 fade(res, res.channel),
140 fade(res, res.bssid),
141 fade(res, format_encryption(res)),
142 format_actions(dev, type, res)
146 cbi_update_table(tbl, bss, E('em', { class: 'spinning' }, _('No scan results available yet...')));
151 L.post(L.url('admin/network/wireless_scan_trigger', dev, 1), null, function() {});
159 document.addEventListener('DOMContentLoaded', scan);