luci2: don't re-set timeout if view is finished already, re-set timeout even if the...
[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 });