4 getConntrackCount
: L
.rpc
.declare({
5 object
: 'luci2.network',
6 method
: 'conntrack_count',
7 expect
: { '': { count
: 0, limit
: 0 } }
10 getDHCPLeases
: L
.rpc
.declare({
11 object
: 'luci2.network',
12 method
: 'dhcp_leases',
13 expect
: { leases
: [ ] }
16 getDHCPv6Leases
: L
.rpc
.declare({
17 object
: 'luci2.network',
18 method
: 'dhcp6_leases',
19 expect
: { leases
: [ ] }
22 renderContents: function() {
25 L
.NetworkModel
.refreshStatus().then(function() {
26 var wan
= L
.NetworkModel
.findWAN();
27 var wan6
= L
.NetworkModel
.findWAN6();
31 $('#network_status_table').empty();
35 var networkTable
= new L
.ui
.table({
36 caption
: L
.tr('Network'),
44 var dev
= L
.NetworkModel
.resolveAlias(v
.getDevice());
48 .attr('title', dev
.description())
49 .append($('<img />').attr('src', dev
.icon()))
50 .append(' %s'.format(dev
.name()));
55 format: function(v
, n
) {
56 var s
= '<strong>' + L
.tr('Type') + ':</strong> %s | ' +
57 '<strong>' + L
.tr('Connected') + ':</strong> %t<br />';
59 s
= s
.format(v
.getProtocol().description
, v
.getUptime(),
60 n
? v
.getIPv6Addrs(true).join(', ')
61 : v
.getIPv4Addrs(true).join(', '));
63 var addr
= n
? v
.getIPv6Addrs() : v
.getIPv4Addrs();
65 s
+= '<strong>' + L
.tr('Address') + ':</strong> %s<br />'.format(addr
.join(', '));
67 var gw
= v
.getIPv4Gateway();
69 s
+= '<strong>' + L
.tr('Gateway') + ':</strong> %s<br />'.format(gw
);
71 var dns
= n
? v
.getIPv6DNS() : v
.getIPv4DNS();
73 s
+= '<strong>' + L
.tr('DNS') + ':</strong> %s<br />'.format(dns
.join(', '));
81 networkTable
.row([ L
.tr('IPv4 WAN Status'), wan
, wan
]);
84 networkTable
.row([ L
.tr('IPv6 WAN Status'), wan6
, wan6
]);
86 networkTable
.insertInto('#network_status_table');
88 self
.getConntrackCount().then(function(count
) {
89 var conntrackTable
= new L
.ui
.table({
90 caption
: L
.tr('Connection Tracking'),
95 return new L
.ui
.progress({
98 format
: '%d / %d (%d%%)'
104 conntrackTable
.row([ L
.tr('Active Connections'), count
]);
105 conntrackTable
.insertInto('#conntrack_status_table');
107 L
.system
.getInfo().then(function(info
) {
108 var sysinfoTable
= new L
.ui
.table({
109 caption
: L
.tr('System'),
110 columns
: [ { width
: '300px' }, { } ]
114 [ L
.tr('Hostname'), info
.hostname
],
115 [ L
.tr('Model'), info
.model
],
116 [ L
.tr('Firmware Version'), info
.release
.description
],
117 [ L
.tr('Kernel Version'), info
.kernel
],
118 [ L
.tr('Local Time'), (new Date(info
.localtime
* 1000)).toString() ],
119 [ L
.tr('Uptime'), '%t'.format(info
.uptime
) ],
120 [ L
.tr('Load Average'),
121 '%.2f %.2f %.2f'.format(
122 info
.load
[0] / 65535.0,
123 info
.load
[1] / 65535.0,
124 info
.load
[2] / 65535.0
128 sysinfoTable
.insertInto('#system_status_table');
130 var memoryTable
= new L
.ui
.table({
131 caption
: L
.tr('Memory'),
136 format: function(v
) {
137 return new L
.ui
.progress({
139 max
: info
.memory
.total
,
140 format: function(pc
) {
141 return ('%d ' + L
.tr('kB') + ' / %d ' + L
.tr('kB') + ' (%d%%)').format(
142 v
/ 1024, info
.memory
.total
/ 1024, pc
151 [ L
.tr('Total Available'), info
.memory
.free
+ info
.memory
.buffered
],
152 [ L
.tr('Free'), info
.memory
.free
],
153 [ L
.tr('Cached'), info
.memory
.shared
],
154 [ L
.tr('Buffered'), info
.memory
.buffered
],
157 memoryTable
.insertInto('#memory_status_table');
159 if (info
.swap
.total
> 0)
161 var swapTable
= new L
.ui
.table({
162 caption
: L
.tr('Swap'),
167 format: function(v
) {
168 return new L
.ui
.progress({
170 max
: info
.swap
.total
,
171 format: function(pc
) {
172 return ('%d ' + L
.tr('kB') + ' / %d ' + L
.tr('kB') + ' (%d%%)').format(
173 v
/ 1024, info
.swap
.total
/ 1024, pc
181 swapTable
.row([ L
.tr('Free'), info
.swap
.free
]);
182 swapTable
.insertInto('#swap_status_table');
185 var diskTable
= new L
.ui
.table({
186 caption
: L
.tr('Storage'),
191 format: function(v
) {
192 return new L
.ui
.progress({
195 format: function(pc
) {
196 return ('%d ' + L
.tr('kB') + ' / %d ' + L
.tr('kB') + ' (%d%%)').format(
197 v
[0] / 1024, v
[1] / 1024, pc
205 diskTable
.row([ '' + L
.tr('Root Usage') + ' (/)', [ info
.root
.used
, info
.root
.total
] ]);
206 diskTable
.row([ '' + L
.tr('Temporary Usage') + ' (/tmp)', [ info
.tmp
.used
, info
.tmp
.total
] ]);
207 diskTable
.insertInto('#disk_status_table');
209 L
.wireless
.getWirelessStatus().then(function(radios
) {
211 for (var phy
in radios
)
216 $('#wifi_status_table').empty();
218 for (var i
= 0; i
< phys
.length
; i
++)
221 var radio
= radios
[phys
[i
]];
225 ? '%s 802.11%s (%s)'.format(
226 radio
.hardware
.name
, radio
.hwmodes
.join(''),
227 radio
.phy
.replace(/^[^0-9]+/, 'radio'))
228 : ('802.11%s ' + L
.tr('Radio') + ' (%s)').format(
229 radio
.hwmodes
.join(''),
230 radio
.phy
.replace(/^[^0-9]+/, 'radio')),
231 channel
: radio
.channel
,
232 frequency
: radio
.frequency
,
233 txpower
: radio
.txpower
236 for (var j
= 0; j
< radio
.networks
.length
; j
++)
238 var network
= radio
.networks
[j
];
240 if (network
.bssid
&& network
.bssid
!= '00:00:00:00:00:00' && radio
.channel
)
244 signal
: network
.signal
,
245 noise
: network
.noise
,
246 device
: network
.device
249 bssid
: network
.bssid
,
251 encryption
: network
.encryption
,
252 bitrate
: network
.bitrate
256 var wifiTable
= new L
.ui
.table({
257 caption
: i
? null : L
.tr('Wireless'),
261 format: function(v
, n
)
263 if (typeof(v
) != 'boolean')
265 return new L
.ui
.devicebadge(v
).render();
269 var img
= document
.createElement('img');
270 img
.src
= L
.globals
.resource
+ '/icons/wifi_big' + (v
? '' : '_disabled') + '.png';
276 format: function(v
, n
)
278 if (typeof(rows
[n
][0]) != 'boolean')
280 var s
= '<strong>' + L
.tr('Mode') + ':</strong> %s | ' +
281 '<strong>' + L
.tr('Bitrate') + ':</strong> %s | ' +
282 '<strong>' + L
.tr('SSID') + ':</strong> %s<br />' +
283 '<strong>' + L
.tr('BSSID') + ':</strong> %s | ' +
284 '<strong>' + L
.tr('Encryption') + ':</strong> %s';
287 v
.mode
, v
.bitrate
? ('~ %.1f ' + L
.tr('Mbit/s')).format(v
.bitrate
/ 1000) : '?',
288 v
.ssid
, v
.bssid
, L
.wireless
.formatEncryption(v
.encryption
)
293 var s
= '<big><strong>%s</strong></big><br />' +
294 '<strong>' + L
.tr('Channel') + ':</strong> %d (%.3f ' + L
.tr('GHz') + ') | ' +
295 '<strong>' + L
.tr('TX Power') + ':</strong> %d ' + L
.tr('dBm') + '';
299 v
.channel
, v
.frequency
/ 1000,
307 wifiTable
.rows(rows
);
308 $('#wifi_status_table').append(wifiTable
.render());
311 L
.wireless
.getAssocLists().then(function(assoclist
) {
312 var formatRate = function(v
)
314 return (typeof v
.mcs
!= 'undefined')
315 ? ('%.1f ' + L
.tr('Mbit/s') + ', MCS %d, %d%s').format(v
.rate
/ 1000, v
.mcs
, v
['40mhz'] ? 40 : 20, L
.tr('MHz'))
316 : ('%.1f ' + L
.tr('Mbit/s')).format(v
.rate
/ 1000);
319 var assocTable
= new L
.ui
.table({
320 caption
: L
.tr('Associated Stations'),
321 placeholder
: L
.tr('No information available'),
323 format: function(v
, n
) {
324 return new L
.ui
.devicebadge(assoclist
[n
]).render();
330 caption
: L
.tr('MAC-Address'),
333 caption
: L
.tr('Signal'),
334 format
: '%d ' + L
.tr('dBm') + '',
337 caption
: L
.tr('Noise'),
338 format
: '%d ' + L
.tr('dBm') + '',
341 caption
: L
.tr('RX Rate'),
345 caption
: L
.tr('TX Rate'),
351 assocTable
.rows(assoclist
);
352 assocTable
.insertInto('#wifi_assoc_table');
354 self
.getDHCPLeases().then(function(leases
) {
355 var leaseTable
= new L
.ui
.table({
356 caption
: L
.tr('DHCP Leases'),
357 placeholder
: L
.tr('There are no active leases.'),
359 caption
: L
.tr('Hostname'),
363 caption
: L
.tr('IPv4-Address'),
366 caption
: L
.tr('MAC-Address'),
369 caption
: L
.tr('Leasetime remaining'),
371 format: function(v
) {
372 return (v
<= 0) ? L
.tr('expired') : '%t'.format(v
);
377 leaseTable
.rows(leases
);
378 leaseTable
.insertInto('#lease_status_table');
380 self
.getDHCPv6Leases().then(function(leases
) {
384 var leaseTable
= new L
.ui
.table({
385 caption
: L
.tr('DHCPv6 Leases'),
387 caption
: L
.tr('Hostname'),
391 caption
: L
.tr('IPv6-Address'),
394 caption
: L
.tr('DUID'),
397 caption
: L
.tr('Leasetime remaining'),
399 format: function(v
) {
400 return (v
<= 0) ? L
.tr('expired') : '%t'.format(v
);
405 leaseTable
.rows(leases
);
406 leaseTable
.insertInto('#lease6_status_table');
414 return L
.NetworkModel
.init().then(function() {
415 self
.repeat(self
.renderContents
, 5000);