summaryrefslogtreecommitdiffhomepage
path: root/modules/luci-mod-network/htdocs
diff options
context:
space:
mode:
Diffstat (limited to 'modules/luci-mod-network/htdocs')
-rw-r--r--modules/luci-mod-network/htdocs/luci-static/resources/view/network/iface_status.js42
-rw-r--r--modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_join.js159
-rw-r--r--modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_status.js59
3 files changed, 260 insertions, 0 deletions
diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/iface_status.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/iface_status.js
new file mode 100644
index 0000000000..88f48d189a
--- /dev/null
+++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/iface_status.js
@@ -0,0 +1,42 @@
+requestAnimationFrame(function() {
+ document.querySelectorAll('[data-iface-status]').forEach(function(container) {
+ var network = container.getAttribute('data-iface-status'),
+ icon = container.querySelector('img'),
+ info = container.querySelector('span');
+
+ L.poll(5, L.url('admin/network/iface_status', network), null, function(xhr, ifaces) {
+ var ifc = Array.isArray(ifaces) ? ifaces[0] : null;
+ if (!ifc)
+ return;
+
+ L.itemlist(info, [
+ _('Device'), ifc.ifname,
+ _('Uptime'), ifc.is_up ? '%t'.format(ifc.uptime) : null,
+ _('MAC'), ifc.ifname ? ifc.macaddr : null,
+ _('RX'), ifc.ifname ? '%.2mB (%d %s)'.format(ifc.rx_bytes, ifc.rx_packets, _('Pkts.')) : null,
+ _('TX'), ifc.ifname ? '%.2mB (%d %s)'.format(ifc.tx_bytes, ifc.tx_packets, _('Pkts.')) : null,
+ _('IPv4'), ifc.ipaddrs ? ifc.ipaddrs[0] : null,
+ _('IPv4'), ifc.ipaddrs ? ifc.ipaddrs[1] : null,
+ _('IPv4'), ifc.ipaddrs ? ifc.ipaddrs[2] : null,
+ _('IPv4'), ifc.ipaddrs ? ifc.ipaddrs[3] : null,
+ _('IPv4'), ifc.ipaddrs ? ifc.ipaddrs[4] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[0] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[1] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[2] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[3] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[4] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[5] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[6] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[7] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[8] : null,
+ _('IPv6'), ifc.ip6addrs ? ifc.ip6addrs[9] : null,
+ _('IPv6-PD'), ifc.ip6prefix,
+ null, ifc.ifname ? null : E('em', _('Interface not present or not connected yet.'))
+ ]);
+
+ icon.src = L.resource('icons/%s%s.png').format(ifc.type, ifc.is_up ? '' : '_disabled');
+ });
+
+ L.run();
+ });
+});
diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_join.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_join.js
new file mode 100644
index 0000000000..d5bd7b0a6d
--- /dev/null
+++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_join.js
@@ -0,0 +1,159 @@
+var poll = null;
+
+function format_signal(bss) {
+ var qval = bss.quality || 0,
+ qmax = bss.quality_max || 100,
+ scale = 100 / qmax * qval,
+ range = 'none';
+
+ if (!bss.bssid || bss.bssid == '00:00:00:00:00:00')
+ range = 'none';
+ else if (scale < 15)
+ range = '0';
+ else if (scale < 35)
+ range = '0-25';
+ else if (scale < 55)
+ range = '25-50';
+ else if (scale < 75)
+ range = '50-75';
+ else
+ range = '75-100';
+
+ return E('span', {
+ class: 'ifacebadge',
+ title: '%s: %d%s / %s: %d/%d'.format(_('Signal'), bss.signal, _('dB'), _('Quality'), qval, qmax)
+ }, [
+ E('img', { src: L.resource('icons/signal-%s.png').format(range) }),
+ ' %d%%'.format(scale)
+ ]);
+}
+
+function format_encryption(bss) {
+ var enc = bss.encryption || { }
+
+ if (enc.wep === true)
+ return 'WEP';
+ else if (enc.wpa > 0)
+ return E('abbr', {
+ title: 'Pairwise: %h / Group: %h'.format(
+ enc.pair_ciphers.join(', '),
+ enc.group_ciphers.join(', '))
+ },
+ '%h - %h'.format(
+ (enc.wpa === 3) ? _('mixed WPA/WPA2') : (enc.wpa === 2 ? 'WPA2' : 'WPA'),
+ enc.auth_suites.join(', ')));
+ else
+ return E('em', enc.enabled ? _('unknown') : _('open'));
+}
+
+function format_actions(dev, type, bss) {
+ var enc = bss.encryption || { },
+ input = [
+ E('input', { type: 'submit', class: 'cbi-button cbi-button-action important', value: _('Join Network') }),
+ E('input', { type: 'hidden', name: 'token', value: L.env.token }),
+ E('input', { type: 'hidden', name: 'device', value: dev }),
+ E('input', { type: 'hidden', name: 'join', value: bss.ssid }),
+ E('input', { type: 'hidden', name: 'mode', value: bss.mode }),
+ E('input', { type: 'hidden', name: 'bssid', value: bss.bssid }),
+ E('input', { type: 'hidden', name: 'channel', value: bss.channel }),
+ E('input', { type: 'hidden', name: 'clbridge', value: type === 'wl' ? 1 : 0 }),
+ E('input', { type: 'hidden', name: 'wep', value: enc.wep ? 1 : 0 })
+ ];
+
+ if (enc.wpa) {
+ input.push(E('input', { type: 'hidden', name: 'wpa_version', value: enc.wpa }));
+
+ enc.auth_suites.forEach(function(s) {
+ input.push(E('input', { type: 'hidden', name: 'wpa_suites', value: s }));
+ });
+
+ enc.group_ciphers.forEach(function(s) {
+ input.push(E('input', { type: 'hidden', name: 'wpa_group', value: s }));
+ });
+
+ enc.pair_ciphers.forEach(function(s) {
+ input.push(E('input', { type: 'hidden', name: 'wpa_pairwise', value: s }));
+ });
+ }
+
+ return E('form', {
+ class: 'inline',
+ method: 'post',
+ action: L.url('admin/network/wireless_join')
+ }, input);
+}
+
+function fade(bss, content) {
+ if (bss.stale)
+ return E('span', { style: 'opacity:0.5' }, content);
+ else
+ return content;
+}
+
+function flush() {
+ L.stop(poll);
+ L.halt();
+
+ scan();
+}
+
+function scan() {
+ var tbl = document.querySelector('[data-wifi-scan]'),
+ dev = tbl.getAttribute('data-wifi-scan'),
+ type = tbl.getAttribute('data-wifi-type');
+
+ cbi_update_table(tbl, [], E('em', { class: 'spinning' }, _('Starting wireless scan...')));
+
+ L.post(L.url('admin/network/wireless_scan_trigger', dev), null, function(s) {
+ if (s.status !== 204) {
+ cbi_update_table(tbl, [], E('em', _('Scan request failed')));
+ return;
+ }
+
+ var count = 0;
+
+ poll = L.poll(3, L.url('admin/network/wireless_scan_results', dev), null, function(s, results) {
+ if (Array.isArray(results)) {
+ var bss = [];
+
+ results.sort(function(a, b) {
+ var diff = (b.quality - a.quality) || (a.channel - b.channel);
+
+ if (diff)
+ return diff;
+
+ if (a.ssid < b.ssid)
+ return -1;
+ else if (a.ssid > b.ssid)
+ return 1;
+
+ if (a.bssid < b.bssid)
+ return -1;
+ else if (a.bssid > b.bssid)
+ return 1;
+ }).forEach(function(res) {
+ bss.push([
+ fade(res, format_signal(res)),
+ fade(res, res.ssid ? '%h'.format(res.ssid) : E('em', {}, _('hidden'))),
+ fade(res, res.channel),
+ fade(res, res.mode),
+ fade(res, res.bssid),
+ fade(res, format_encryption(res)),
+ format_actions(dev, type, res)
+ ]);
+ });
+
+ cbi_update_table(tbl, bss, E('em', { class: 'spinning' }, _('No scan results available yet...')));
+ }
+
+ if (count++ >= 3) {
+ count = 0;
+ L.post(L.url('admin/network/wireless_scan_trigger', dev, 1), null, function() {});
+ }
+ });
+
+ L.run();
+ });
+}
+
+document.addEventListener('DOMContentLoaded', scan);
diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_status.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_status.js
new file mode 100644
index 0000000000..7e14d999bd
--- /dev/null
+++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wifi_status.js
@@ -0,0 +1,59 @@
+requestAnimationFrame(function() {
+ document.querySelectorAll('[data-wifi-status]').forEach(function(container) {
+ var ifname = container.getAttribute('data-wifi-status'),
+ small = container.querySelector('small'),
+ info = container.querySelector('span');
+
+ L.poll(5, L.url('admin/network/wireless_status', ifname), null, function(xhr, iws) {
+ var iw = Array.isArray(iws) ? iws[0] : null;
+ if (!iw)
+ return;
+
+ var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && !iw.disabled);
+ var p = iw.quality;
+ var q = iw.disabled ? -1 : p;
+
+ var icon;
+ if (q < 0)
+ icon = L.resource('icons/signal-none.png');
+ else if (q == 0)
+ icon = L.resource('icons/signal-0.png');
+ else if (q < 25)
+ icon = L.resource('icons/signal-0-25.png');
+ else if (q < 50)
+ icon = L.resource('icons/signal-25-50.png');
+ else if (q < 75)
+ icon = L.resource('icons/signal-50-75.png');
+ else
+ icon = L.resource('icons/signal-75-100.png');
+
+ L.dom.content(small, [
+ E('img', {
+ src: icon,
+ title: '%s: %d %s / %s: %d %s'.format(
+ _('Signal'), iw.signal, _('dBm'),
+ _('Noise'), iw.noise, _('dBm'))
+ }),
+ '\u00a0', E('br'), '%d%%\u00a0'.format(p)
+ ]);
+
+ L.itemlist(info, [
+ _('Mode'), iw.mode,
+ _('SSID'), '%h'.format(iw.ssid || '?'),
+ _('BSSID'), is_assoc ? iw.bssid : null,
+ _('Encryption'), is_assoc ? iw.encryption || _('None') : null,
+ _('Channel'), is_assoc ? '%d (%.3f %s)'.format(iw.channel, iw.frequency || 0, _('GHz')) : null,
+ _('Tx-Power'), is_assoc ? '%d %s'.format(iw.txpower, _('dBm')) : null,
+ _('Signal'), is_assoc ? '%d %s'.format(iw.signal, _('dBm')) : null,
+ _('Noise'), is_assoc ? '%d %s'.format(iw.noise, _('dBm')) : null,
+ _('Bitrate'), is_assoc ? '%.1f %s'.format(iw.bitrate || 0, _('Mbit/s')) : null,
+ _('Country'), is_assoc ? iw.country : null
+ ], [ ' | ', E('br'), E('br'), E('br'), E('br'), E('br'), ' | ', E('br'), ' | ' ]);
+
+ if (!is_assoc)
+ L.dom.append(info, E('em', iw.disabled ? _('Wireless is disabled') : _('Wireless is not associated')));
+ });
+
+ L.run();
+ });
+});