luci2: major changes to RPC implementation
[project/luci2/ui.git] / luci2 / htdocs / luci2 / view / status.overview.js
1 L.ui.view.extend({
2 title: L.tr('Status'),
3 execute: function() {
4 return $.when(
5 L.network.findWanInterfaces().then(function(wans) {
6 var wan = wans[0];
7 var wan6 = wans[1];
8
9 if (!wan && !wan6)
10 {
11 $('#network_status_table').empty();
12 return;
13 }
14
15 var networkTable = new L.ui.table({
16 caption: L.tr('Network'),
17 columns: [ {
18 width: '146px',
19 format: '%s'
20 }, {
21 width: '146px',
22 align: 'right',
23 format: function(v) {
24 return new L.ui.devicebadge(v).render();
25 }
26 }, {
27 format: function(v, n) {
28 var format_addr = function()
29 {
30 var rv = [ ];
31 if (n > 0)
32 {
33 for (var i = 0; i < v['ipv6-address'].length; i++)
34 rv.push('%s/%d'.format(v['ipv6-address'][i].address, v['ipv6-address'][i].mask));
35
36 for (var i = 0; i < v['ipv6-prefix-assignment'].length; i++)
37 rv.push('%s1/%d'.format(v['ipv6-prefix-assignment'][i].address, v['ipv6-prefix-assignment'][i].mask));
38 }
39 else
40 {
41 for (var i = 0; i < v['ipv4-address'].length; i++)
42 rv.push('%s/%d'.format(v['ipv4-address'][i].address, v['ipv4-address'][i].mask));
43 }
44 return rv.join(', ');
45 };
46
47 var format_dns = function()
48 {
49 var rv = [ ];
50 for (var i = 0; i < v['dns-server'].length; i++)
51 {
52 if ((n > 0 && v['dns-server'][i].indexOf(':') > -1) ||
53 (n == 0 && v['dns-server'][i].indexOf(':') == -1))
54 rv.push(v['dns-server'][i]);
55 }
56 return rv.join(', ');
57 };
58
59 var s = '<strong>' + L.tr('Type') + ':</strong> %s | ' +
60 '<strong>' + L.tr('Connected') + ':</strong> %t<br />' +
61 '<strong>' + L.tr('Address') + ':</strong> %s<br />';
62
63 s = s.format(v.proto, v.uptime, format_addr());
64
65 for (var i = 0; i < v.route.length; i++)
66 if (v.route[i].mask == 0 && v.route[i].nexthop != '::')
67 {
68 s += '<strong>' + L.tr('Gateway') + ':</strong> %s<br />'.format(v.route[i].nexthop);
69 break;
70 }
71
72 var dns = format_dns();
73 if (dns)
74 s += '<strong>' + L.tr('DNS') + ':</strong> %s<br />'.format(dns);
75
76 return s;
77 }
78 } ]
79 });
80
81 if (wan)
82 networkTable.row([ L.tr('IPv4 WAN Status'), wan, wan ]);
83
84 if (wan6)
85 networkTable.row([ L.tr('IPv6 WAN Status'), wan6, wan6 ]);
86
87 networkTable.insertInto('#network_status_table');
88 }),
89 L.network.getConntrackCount().then(function(count) {
90 var conntrackTable = new L.ui.table({
91 caption: L.tr('Connection Tracking'),
92 columns: [ {
93 width: '300px'
94 }, {
95 format: function(v) {
96 return new L.ui.progress({
97 value: v.count,
98 max: v.limit,
99 format: '%d / %d (%d%%)'
100 }).render();
101 }
102 } ]
103 });
104
105 conntrackTable.row([ L.tr('Active Connections'), count ]);
106 conntrackTable.insertInto('#conntrack_status_table');
107 }),
108 L.system.getInfo().then(function(info) {
109 var sysinfoTable = new L.ui.table({
110 caption: L.tr('System'),
111 columns: [ { width: '300px' }, { } ]
112 });
113
114 sysinfoTable.rows([
115 [ L.tr('Hostname'), info.hostname ],
116 [ L.tr('Model'), info.model ],
117 [ L.tr('Firmware Version'), info.release.description ],
118 [ L.tr('Kernel Version'), info.kernel ],
119 [ L.tr('Local Time'), (new Date(info.localtime * 1000)).toString() ],
120 [ L.tr('Uptime'), '%t'.format(info.uptime) ],
121 [ L.tr('Load Average'),
122 '%.2f %.2f %.2f'.format(
123 info.load[0] / 65535.0,
124 info.load[1] / 65535.0,
125 info.load[2] / 65535.0
126 ) ]
127 ]);
128
129 sysinfoTable.insertInto('#system_status_table');
130
131 var memoryTable = new L.ui.table({
132 caption: L.tr('Memory'),
133 columns: [ {
134 format: '%s',
135 width: '300px'
136 }, {
137 format: function(v) {
138 return new L.ui.progress({
139 value: v,
140 max: info.memory.total,
141 format: function(pc) {
142 return ('%d ' + L.tr('kB') + ' / %d ' + L.tr('kB') + ' (%d%%)').format(
143 v / 1024, info.memory.total / 1024, pc
144 );
145 }
146 }).toString();
147 }
148 } ]
149 });
150
151 memoryTable.rows([
152 [ L.tr('Total Available'), info.memory.free + info.memory.buffered ],
153 [ L.tr('Free'), info.memory.free ],
154 [ L.tr('Cached'), info.memory.shared ],
155 [ L.tr('Buffered'), info.memory.buffered ],
156 ]);
157
158 memoryTable.insertInto('#memory_status_table');
159
160 if (info.swap.total > 0)
161 {
162 var swapTable = new L.ui.table({
163 caption: L.tr('Swap'),
164 columns: [ {
165 format: '%s',
166 width: '300px'
167 }, {
168 format: function(v) {
169 return new L.ui.progress({
170 value: v,
171 max: info.swap.total,
172 format: function(pc) {
173 return ('%d ' + L.tr('kB') + ' / %d ' + L.tr('kB') + ' (%d%%)').format(
174 v / 1024, info.swap.total / 1024, pc
175 );
176 }
177 }).toString();
178 }
179 } ]
180 });
181
182 swapTable.row([ L.tr('Free'), info.swap.free ]);
183 swapTable.insertInto('#swap_status_table');
184 }
185
186 var diskTable = new L.ui.table({
187 caption: L.tr('Storage'),
188 columns: [ {
189 format: '%s',
190 width: '300px'
191 }, {
192 format: function(v) {
193 return new L.ui.progress({
194 value: v[0],
195 max: v[1],
196 format: function(pc) {
197 return ('%d ' + L.tr('kB') + ' / %d ' + L.tr('kB') + ' (%d%%)').format(
198 v[0] / 1024, v[1] / 1024, pc
199 );
200 }
201 }).toString();
202 }
203 } ]
204 });
205
206 diskTable.row([ '' + L.tr('Root Usage') + ' (/)', [ info.root.used, info.root.total ] ]);
207 diskTable.row([ '' + L.tr('Temporary Usage') + ' (/tmp)', [ info.tmp.used, info.tmp.total ] ]);
208 diskTable.insertInto('#disk_status_table');
209 }),
210 L.wireless.getWirelessStatus().then(function(radios) {
211 var phys = [ ];
212 for (var phy in radios)
213 phys.push(phy);
214
215 phys.sort();
216
217 $('#wifi_status_table').empty();
218
219 for (var i = 0; i < phys.length; i++)
220 {
221 var rows = [ ];
222 var radio = radios[phys[i]];
223
224 rows.push([false, {
225 name: radio.hardware
226 ? '%s 802.11%s (%s)'.format(
227 radio.hardware.name, radio.hwmodes.join(''),
228 radio.phy.replace(/^[^0-9]+/, 'radio'))
229 : ('802.11%s ' + L.tr('Radio') + ' (%s)').format(
230 radio.hwmodes.join(''),
231 radio.phy.replace(/^[^0-9]+/, 'radio')),
232 channel: radio.channel,
233 frequency: radio.frequency,
234 txpower: radio.txpower
235 }]);
236
237 for (var j = 0; j < radio.networks.length; j++)
238 {
239 var network = radio.networks[j];
240
241 if (network.bssid && network.bssid != '00:00:00:00:00:00' && radio.channel)
242 rows[0][0] = true;
243
244 rows.push([{
245 signal: network.signal,
246 noise: network.noise,
247 device: network.device
248 }, {
249 ssid: network.ssid,
250 bssid: network.bssid,
251 mode: network.mode,
252 encryption: network.encryption,
253 bitrate: network.bitrate
254 }]);
255 }
256
257 var wifiTable = new L.ui.table({
258 caption: i ? null : L.tr('Wireless'),
259 columns: [ {
260 width: '34px',
261 align: 'right',
262 format: function(v, n)
263 {
264 if (typeof(v) != 'boolean')
265 {
266 return new L.ui.devicebadge(v).render();
267 }
268 else
269 {
270 var img = document.createElement('img');
271 img.src = L.globals.resource + '/icons/wifi_big' + (v ? '' : '_disabled') + '.png';
272
273 return img;
274 }
275 }
276 }, {
277 format: function(v, n)
278 {
279 if (typeof(rows[n][0]) != 'boolean')
280 {
281 var s = '<strong>' + L.tr('Mode') + ':</strong> %s | ' +
282 '<strong>' + L.tr('Bitrate') + ':</strong> %s | ' +
283 '<strong>' + L.tr('SSID') + ':</strong> %s<br />' +
284 '<strong>' + L.tr('BSSID') + ':</strong> %s | ' +
285 '<strong>' + L.tr('Encryption') + ':</strong> %s';
286
287 return s.format(
288 v.mode, v.bitrate ? ('~ %.1f ' + L.tr('Mbit/s')).format(v.bitrate / 1000) : '?',
289 v.ssid, v.bssid, L.wireless.formatEncryption(v.encryption)
290 );
291 }
292 else
293 {
294 var s = '<big><strong>%s</strong></big><br />' +
295 '<strong>' + L.tr('Channel') + ':</strong> %d (%.3f ' + L.tr('GHz') + ') | ' +
296 '<strong>' + L.tr('TX Power') + ':</strong> %d ' + L.tr('dBm') + '';
297
298 return s.format(
299 v.name,
300 v.channel, v.frequency / 1000,
301 v.txpower
302 );
303 }
304 }
305 } ]
306 });
307
308 wifiTable.rows(rows);
309 $('#wifi_status_table').append(wifiTable.render());
310 }
311 }),
312 L.wireless.getAssocLists().then(function(assoclist) {
313 var formatRate = function(v)
314 {
315 return (typeof v.mcs != 'undefined')
316 ? ('%.1f ' + L.tr('Mbit/s') + ', MCS %d, %d%s').format(v.rate / 1000, v.mcs, v['40mhz'] ? 40 : 20, L.tr('MHz'))
317 : ('%.1f ' + L.tr('Mbit/s')).format(v.rate / 1000);
318 };
319
320 var assocTable = new L.ui.table({
321 caption: L.tr('Associated Stations'),
322 placeholder: L.tr('No information available'),
323 columns: [ {
324 format: function(v, n) {
325 return new L.ui.devicebadge(assoclist[n]).render();
326 },
327 width: '34px',
328 align: 'right',
329 key: 'signal'
330 }, {
331 caption: L.tr('MAC-Address'),
332 key: 'mac'
333 }, {
334 caption: L.tr('Signal'),
335 format: '%d ' + L.tr('dBm') + '',
336 key: 'signal'
337 }, {
338 caption: L.tr('Noise'),
339 format: '%d ' + L.tr('dBm') + '',
340 key: 'noise'
341 }, {
342 caption: L.tr('RX Rate'),
343 format: formatRate,
344 key: 'rx'
345 }, {
346 caption: L.tr('TX Rate'),
347 format: formatRate,
348 key: 'tx'
349 } ]
350 });
351
352 assocTable.rows(assoclist);
353 assocTable.insertInto('#wifi_assoc_table');
354 }),
355 L.network.getDHCPLeases().then(function(leases) {
356 var leaseTable = new L.ui.table({
357 caption: L.tr('DHCP Leases'),
358 placeholder: L.tr('There are no active leases.'),
359 columns: [ {
360 caption: L.tr('Hostname'),
361 placeholder: '?',
362 key: 'hostname'
363 }, {
364 caption: L.tr('IPv4-Address'),
365 key: 'ipaddr'
366 }, {
367 caption: L.tr('MAC-Address'),
368 key: 'macaddr'
369 }, {
370 caption: L.tr('Leasetime remaining'),
371 key: 'expires',
372 format: function(v) {
373 return (v <= 0) ? L.tr('expired') : '%t'.format(v);
374 }
375 } ]
376 });
377
378 leaseTable.rows(leases);
379 leaseTable.insertInto('#lease_status_table');
380 }),
381 L.network.getDHCPv6Leases().then(function(leases) {
382 if (!leases.length)
383 return;
384
385 var leaseTable = new L.ui.table({
386 caption: L.tr('DHCPv6 Leases'),
387 columns: [ {
388 caption: L.tr('Hostname'),
389 placeholder: '?',
390 key: 'hostname'
391 }, {
392 caption: L.tr('IPv6-Address'),
393 key: 'ip6addr'
394 }, {
395 caption: L.tr('DUID'),
396 key: 'duid'
397 }, {
398 caption: L.tr('Leasetime remaining'),
399 key: 'expires',
400 format: function(v) {
401 return (v <= 0) ? L.tr('expired') : '%t'.format(v);
402 }
403 } ]
404 });
405
406 leaseTable.rows(leases);
407 leaseTable.insertInto('#lease6_status_table');
408 })
409 )
410 }
411 });