5 L.network.findWanInterfaces(function(wans) {
11 $('#network_status_table').empty();
15 var networkTable = new L.ui.table({
16 caption: L.tr('Network'),
24 return new L.ui.devicebadge(v).render();
27 format: function(v, n) {
28 var format_addr = function()
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));
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));
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));
47 var format_dns = function()
50 for (var i = 0; i < v['dns-server'].length; i++)
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]);
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 />';
63 s = s.format(v.proto, v.uptime, format_addr());
65 for (var i = 0; i < v.route.length; i++)
66 if (v.route[i].mask == 0 && v.route[i].nexthop != '::')
68 s += '<strong>' + L.tr('Gateway') + ':</strong> %s<br />'.format(v.route[i].nexthop);
72 var dns = format_dns();
74 s += '<strong>' + L.tr('DNS') + ':</strong> %s<br />'.format(dns);
82 networkTable.row([ L.tr('IPv4 WAN Status'), wan, wan ]);
85 networkTable.row([ L.tr('IPv6 WAN Status'), wan6, wan6 ]);
87 networkTable.insertInto('#network_status_table');
89 L.network.getConntrackCount(function(count) {
90 var conntrackTable = new L.ui.table({
91 caption: L.tr('Connection Tracking'),
96 return new L.ui.progress({
99 format: '%d / %d (%d%%)'
105 conntrackTable.row([ L.tr('Active Connections'), count ]);
106 conntrackTable.insertInto('#conntrack_status_table');
108 L.system.getInfo(function(info) {
109 var sysinfoTable = new L.ui.table({
110 caption: L.tr('System'),
111 columns: [ { width: '300px' }, { } ]
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
129 sysinfoTable.insertInto('#system_status_table');
131 var memoryTable = new L.ui.table({
132 caption: L.tr('Memory'),
137 format: function(v) {
138 return new L.ui.progress({
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
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 ],
158 memoryTable.insertInto('#memory_status_table');
160 if (info.swap.total > 0)
162 var swapTable = new L.ui.table({
163 caption: L.tr('Swap'),
168 format: function(v) {
169 return new L.ui.progress({
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
182 swapTable.row([ L.tr('Free'), info.swap.free ]);
183 swapTable.insertInto('#swap_status_table');
186 var diskTable = new L.ui.table({
187 caption: L.tr('Storage'),
192 format: function(v) {
193 return new L.ui.progress({
196 format: function(pc) {
197 return ('%d ' + L.tr('kB') + ' / %d ' + L.tr('kB') + ' (%d%%)').format(
198 v[0] / 1024, v[1] / 1024, pc
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');
210 L.wireless.getInfo(null, function(radios) {
212 for (var phy in radios)
217 $('#wifi_status_table').empty();
219 for (var i = 0; i < phys.length; i++)
222 var radio = radios[phys[i]];
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
237 for (var j = 0; j < radio.networks.length; j++)
239 var network = radio.networks[j];
241 if (network.bssid && network.bssid != '00:00:00:00:00:00' && radio.channel)
245 signal: network.signal,
246 noise: network.noise,
247 device: network.device
250 bssid: network.bssid,
252 encryption: network.encryption,
253 bitrate: network.bitrate
257 var wifiTable = new L.ui.table({
258 caption: i ? null : L.tr('Wireless'),
262 format: function(v, n)
264 if (typeof(v) != 'boolean')
266 return new L.ui.devicebadge(v).render();
270 var img = document.createElement('img');
271 img.src = L.globals.resource + '/icons/wifi_big' + (v ? '' : '_disabled') + '.png';
277 format: function(v, n)
279 if (typeof(rows[n][0]) != 'boolean')
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';
288 v.mode, v.bitrate ? ('~ %.1f ' + L.tr('Mbit/s')).format(v.bitrate / 1000) : '?',
289 v.ssid, v.bssid, L.wireless.formatEncryption(v.encryption)
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') + '';
300 v.channel, v.frequency / 1000,
308 wifiTable.rows(rows);
309 $('#wifi_status_table').append(wifiTable.render());
312 L.wireless.getAssocList(null, function(assoclist) {
313 var formatRate = function(v)
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);
320 var assocTable = new L.ui.table({
321 caption: L.tr('Associated Stations'),
322 placeholder: L.tr('No information available'),
324 format: function(v, n) {
325 return new L.ui.devicebadge(assoclist[n]).render();
331 caption: L.tr('MAC-Address'),
334 caption: L.tr('Signal'),
335 format: '%d ' + L.tr('dBm') + '',
338 caption: L.tr('Noise'),
339 format: '%d ' + L.tr('dBm') + '',
342 caption: L.tr('RX Rate'),
346 caption: L.tr('TX Rate'),
352 assocTable.rows(assoclist);
353 assocTable.insertInto('#wifi_assoc_table');
355 L.network.getDHCPLeases(function(leases) {
356 var leaseTable = new L.ui.table({
357 caption: L.tr('DHCP Leases'),
358 placeholder: L.tr('There are no active leases.'),
360 caption: L.tr('Hostname'),
364 caption: L.tr('IPv4-Address'),
367 caption: L.tr('MAC-Address'),
370 caption: L.tr('Leasetime remaining'),
372 format: function(v) {
373 return (v <= 0) ? L.tr('expired') : '%t'.format(v);
378 leaseTable.rows(leases);
379 leaseTable.insertInto('#lease_status_table');
381 L.network.getDHCPv6Leases(function(leases) {
385 var leaseTable = new L.ui.table({
386 caption: L.tr('DHCPv6 Leases'),
388 caption: L.tr('Hostname'),
392 caption: L.tr('IPv6-Address'),
395 caption: L.tr('DUID'),
398 caption: L.tr('Leasetime remaining'),
400 format: function(v) {
401 return (v <= 0) ? L.tr('expired') : '%t'.format(v);
406 leaseTable.rows(leases);
407 leaseTable.insertInto('#lease6_status_table');