luci-mod-status: reimplement index status page as client side view
[project/luci.git] / modules / luci-mod-status / htdocs / luci-static / resources / view / status / include / 30_network.js
1 'use strict';
2 'require fs';
3 'require network';
4
5 function progressbar(value, max, byte) {
6 var vn = parseInt(value) || 0,
7 mn = parseInt(max) || 100,
8 fv = byte ? String.format('%1024.2mB', value) : value,
9 fm = byte ? String.format('%1024.2mB', max) : max,
10 pc = Math.floor((100 / mn) * vn);
11
12 return E('div', {
13 'class': 'cbi-progressbar',
14 'title': '%s / %s (%d%%)'.format(fv, fm, pc)
15 }, E('div', { 'style': 'width:%.2f%%'.format(pc) }));
16 }
17
18 function renderbox(ifc, ipv6) {
19 var dev = ifc.getL3Device(),
20 active = (dev && ifc.getProtocol() != 'none'),
21 addrs = (ipv6 ? ifc.getIP6Addrs() : ifc.getIPAddrs()) || [],
22 dnssrv = (ipv6 ? ifc.getDNS6Addrs() : ifc.getDNSAddrs()) || [],
23 expires = (ipv6 ? null : ifc.getExpiry()),
24 uptime = ifc.getUptime();
25
26 return E('div', { class: 'ifacebox' }, [
27 E('div', { class: 'ifacebox-head center ' + (active ? 'active' : '') },
28 E('strong', ipv6 ? _('IPv6 Upstream') : _('IPv4 Upstream'))),
29 E('div', { class: 'ifacebox-body left' }, [
30 L.itemlist(E('span'), [
31 _('Protocol'), ifc.getI18n() || E('em', _('Not connected')),
32 _('Prefix Delegated'), ipv6 ? ifc.getIP6Prefix() : null,
33 _('Address'), addrs[0],
34 _('Address'), addrs[1],
35 _('Address'), addrs[2],
36 _('Address'), addrs[3],
37 _('Address'), addrs[4],
38 _('Address'), addrs[5],
39 _('Address'), addrs[6],
40 _('Address'), addrs[7],
41 _('Address'), addrs[8],
42 _('Address'), addrs[9],
43 _('Gateway'), ipv6 ? (ifc.getGateway6Addr() || '::') : (ifc.getGatewayAddr() || '0.0.0.0'),
44 _('DNS') + ' 1', dnssrv[0],
45 _('DNS') + ' 2', dnssrv[1],
46 _('DNS') + ' 3', dnssrv[2],
47 _('DNS') + ' 4', dnssrv[3],
48 _('DNS') + ' 5', dnssrv[4],
49 _('Expires'), (expires != null && expires > -1) ? '%t'.format(expires) : null,
50 _('Connected'), (uptime > 0) ? '%t'.format(uptime) : null
51 ]),
52 E('div', {}, renderBadge(
53 L.resource('icons/%s.png').format(dev ? dev.getType() : 'ethernet_disabled'), null,
54 _('Device'), dev ? dev.getI18n() : '-',
55 _('MAC-Address'), dev.getMAC())
56 )
57 ])
58 ]);
59 }
60
61 return L.Class.extend({
62 title: _('Network'),
63
64 load: function() {
65 return Promise.all([
66 fs.trimmed('/proc/sys/net/netfilter/nf_conntrack_count'),
67 fs.trimmed('/proc/sys/net/netfilter/nf_conntrack_max'),
68 network.getWANNetworks(),
69 network.getWAN6Networks()
70 ]);
71 },
72
73 render: function(data) {
74 var ct_count = +data[0],
75 ct_max = +data[1],
76 wan_nets = data[2],
77 wan6_nets = data[3];
78
79 var fields = [
80 _('Active Connections'), ct_max ? ct_count : null
81 ];
82
83 var ctstatus = E('div', { 'class': 'table' });
84
85 for (var i = 0; i < fields.length; i += 2) {
86 ctstatus.appendChild(E('div', { 'class': 'tr' }, [
87 E('div', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]),
88 E('div', { 'class': 'td left' }, [
89 (fields[i + 1] != null) ? progressbar(fields[i + 1], ct_max) : '?'
90 ])
91 ]));
92 }
93
94 var netstatus = E('div', { 'class': 'network-status-table' });
95
96 for (var i = 0; i < wan_nets.length; i++)
97 netstatus.appendChild(renderbox(wan_nets[i], false));
98
99 for (var i = 0; i < wan6_nets.length; i++)
100 netstatus.appendChild(renderbox(wan6_nets[i], true));
101
102 return E([
103 netstatus,
104 ctstatus
105 ]);
106 }
107 });