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
.network
.refreshStatus().then(function() {
26 var wan
= L
.network
.findWAN();
27 var wan6
= L
.network
.findWAN6();
31 $('#network_status_table').empty();
35 var networkTable
= new L
.ui
.grid({
36 caption
: L
.tr('Network'),
46 var dev
= L
.network
.resolveAlias(v
.getDevice());
50 .attr('title', dev
.description())
51 .append($('<img />').attr('src', dev
.icon()))
52 .append(' %s'.format(dev
.name()));
59 format: function(v
, n
) {
60 return new L
.ui
.hlist({ items
: [
61 L
.tr('Type'), v
.getProtocol().description
,
62 L
.tr('Connected'), '%t'.format(v
.getUptime()),
63 L
.tr('Address'), (n
? v
.getIPv6Addrs() : v
.getIPv4Addrs()).join(', '),
64 L
.tr('Gateway'), v
.getIPv4Gateway(),
65 L
.tr('DNS'), (n
? v
.getIPv6DNS() : v
.getIPv4DNS()).join(', ')
72 networkTable
.row([ L
.tr('IPv4 WAN Status'), wan
, wan
]);
75 networkTable
.row([ L
.tr('IPv6 WAN Status'), wan6
, wan6
]);
77 networkTable
.insertInto('#network_status_table');
79 self
.getConntrackCount().then(function(count
) {
80 var conntrackTable
= new L
.ui
.grid({
81 caption
: L
.tr('Connection Tracking'),
86 return new L
.ui
.progress({
89 format
: '%d / %d (%d%%)'
95 conntrackTable
.row([ L
.tr('Active Connections'), count
]);
96 conntrackTable
.insertInto('#conntrack_status_table');
98 L
.system
.getInfo().then(function(info
) {
99 var sysinfoTable
= new L
.ui
.grid({
100 caption
: L
.tr('System'),
110 [ L
.tr('Hostname'), info
.hostname
],
111 [ L
.tr('Model'), info
.model
],
112 [ L
.tr('Firmware Version'), info
.release
.description
],
113 [ L
.tr('Kernel Version'), info
.kernel
],
114 [ L
.tr('Local Time'), (new Date(info
.localtime
* 1000)).toString() ],
115 [ L
.tr('Uptime'), '%t'.format(info
.uptime
) ],
116 [ L
.tr('Load Average'),
117 '%.2f %.2f %.2f'.format(
118 info
.load
[0] / 65535.0,
119 info
.load
[1] / 65535.0,
120 info
.load
[2] / 65535.0
124 sysinfoTable
.insertInto('#system_status_table');
126 var memoryTable
= new L
.ui
.grid({
127 caption
: L
.tr('Memory'),
132 format: function(v
) {
133 return new L
.ui
.progress({
135 max
: info
.memory
.total
,
136 format: function(pc
) {
137 return ('%d ' + L
.tr('kB') + ' / %d ' + L
.tr('kB') + ' (%d%%)').format(
138 v
/ 1024, info
.memory
.total
/ 1024, pc
147 [ L
.tr('Total Available'), info
.memory
.free
+ info
.memory
.buffered
],
148 [ L
.tr('Free'), info
.memory
.free
],
149 [ L
.tr('Cached'), info
.memory
.shared
],
150 [ L
.tr('Buffered'), info
.memory
.buffered
],
153 memoryTable
.insertInto('#memory_status_table');
155 if (info
.swap
.total
> 0)
157 var swapTable
= new L
.ui
.grid({
158 caption
: L
.tr('Swap'),
163 format: function(v
) {
164 return new L
.ui
.progress({
166 max
: info
.swap
.total
,
167 format: function(pc
) {
168 return ('%d ' + L
.tr('kB') + ' / %d ' + L
.tr('kB') + ' (%d%%)').format(
169 v
/ 1024, info
.swap
.total
/ 1024, pc
177 swapTable
.row([ L
.tr('Free'), info
.swap
.free
]);
178 swapTable
.insertInto('#swap_status_table');
181 var diskTable
= new L
.ui
.grid({
182 caption
: L
.tr('Storage'),
187 format: function(v
) {
188 return new L
.ui
.progress({
191 format: function(pc
) {
192 return ('%d ' + L
.tr('kB') + ' / %d ' + L
.tr('kB') + ' (%d%%)').format(
193 v
[0] / 1024, v
[1] / 1024, pc
201 diskTable
.row([ '' + L
.tr('Root Usage') + ' (/)', [ info
.root
.used
, info
.root
.total
] ]);
202 diskTable
.row([ '' + L
.tr('Temporary Usage') + ' (/tmp)', [ info
.tmp
.used
, info
.tmp
.total
] ]);
203 diskTable
.insertInto('#disk_status_table');
205 L
.wireless
.getWirelessStatus().then(function(radios
) {
207 for (var phy
in radios
)
212 $('#wifi_status_table').empty();
214 for (var i
= 0; i
< phys
.length
; i
++)
217 var radio
= radios
[phys
[i
]];
221 ? '%s 802.11%s (%s)'.format(
222 radio
.hardware
.name
, radio
.hwmodes
.join(''),
223 radio
.phy
.replace(/^[^0-9]+/, 'radio'))
224 : ('802.11%s ' + L
.tr('Radio') + ' (%s)').format(
225 radio
.hwmodes
.join(''),
226 radio
.phy
.replace(/^[^0-9]+/, 'radio')),
227 channel
: radio
.channel
,
228 frequency
: radio
.frequency
,
229 txpower
: radio
.txpower
232 for (var j
= 0; j
< radio
.networks
.length
; j
++)
234 var network
= radio
.networks
[j
];
236 if (network
.bssid
&& network
.bssid
!= '00:00:00:00:00:00' && radio
.channel
)
240 signal
: network
.signal
,
241 noise
: network
.noise
,
242 device
: network
.device
245 bssid
: network
.bssid
,
247 encryption
: network
.encryption
,
248 bitrate
: network
.bitrate
252 var wifiTable
= new L
.ui
.grid({
253 caption
: i
? null : L
.tr('Wireless'),
258 format: function(v
, n
)
260 if (typeof(v
) != 'boolean')
261 return new L
.ui
.devicebadge(v
).render();
263 return L
.ui
.icon('wifi_big' + (v
? '' : '_disabled'));
268 format: function(v
, n
)
270 if (typeof(rows
[n
][0]) != 'boolean')
272 return new L
.ui
.hlist({ items
: [
273 L
.tr('Mode'), v
.mode
,
274 L
.tr('Bitrate'), v
.bitrate
? ('~ %.1f ' + L
.tr('Mbit/s')).format(v
.bitrate
/ 1000) : undefined,
275 L
.tr('SSID'), v
.ssid
,
276 L
.tr('BSSID'), v
.bssid
,
277 L
.tr('Encryption'), L
.wireless
.formatEncryption(v
.encryption
)
283 .append($('<strong />')
287 .add(new L
.ui
.hlist({ items
: [
288 L
.tr('Channel'), '%d (%.3f %s)'.format(v
.channel
, v
.frequency
/ 1000, L
.tr('GHz')),
289 L
.tr('TX Power'), '%d %s'.format(v
.txpower
, L
.tr('dBm'))
296 wifiTable
.rows(rows
);
297 $('#wifi_status_table').append(wifiTable
.render());
300 L
.wireless
.getAssocLists().then(function(assoclist
) {
301 var formatRate = function(v
)
303 return '<span class="nowrap">%s</span>'.format(
304 (!isNaN(v
.mcs
) && v
.mcs
> 0)
305 ? ('%.1f ' + L
.tr('Mbit/s') + ', MCS %d, %d%s').format(v
.rate
/ 1000, v
.mcs
, v
['40mhz'] ? 40 : 20, L
.tr('MHz'))
306 : ('%.1f ' + L
.tr('Mbit/s')).format(v
.rate
/ 1000));
309 var assocTable
= new L
.ui
.grid({
310 caption
: L
.tr('Associated Stations'),
311 placeholder
: L
.tr('No information available'),
313 format: function(v
, n
) {
314 return new L
.ui
.devicebadge(assoclist
[n
]).render();
322 caption
: L
.tr('MAC-Address'),
325 caption
: L
.tr('Signal'),
326 format
: '%d ' + L
.tr('dBm') + '',
331 caption
: L
.tr('Noise'),
332 format
: '%d ' + L
.tr('dBm') + '',
337 caption
: L
.tr('RX Rate'),
342 caption
: L
.tr('TX Rate'),
349 assocTable
.rows(assoclist
);
350 assocTable
.insertInto('#wifi_assoc_table');
352 self
.getDHCPLeases().then(function(leases
) {
353 var leaseTable
= new L
.ui
.grid({
354 caption
: L
.tr('DHCP Leases'),
355 placeholder
: L
.tr('There are no active leases.'),
357 caption
: L
.tr('Hostname'),
363 caption
: L
.tr('IPv4-Address'),
366 format
: '255.255.255.255'
368 caption
: L
.tr('MAC-Address'),
372 caption
: L
.tr('Leasetime remaining'),
376 format: function(v
) {
377 return (v
<= 0) ? L
.tr('expired') : '%t'.format(v
);
382 leaseTable
.rows(leases
);
383 leaseTable
.insertInto('#lease_status_table');
385 self
.getDHCPv6Leases().then(function(leases
) {
389 var leaseTable
= new L
.ui
.grid({
390 caption
: L
.tr('DHCPv6 Leases'),
392 caption
: L
.tr('Hostname'),
397 caption
: L
.tr('IPv6-Address'),
401 caption
: L
.tr('DUID'),
405 caption
: L
.tr('Leasetime remaining'),
408 format: function(v
) {
409 return (v
<= 0) ? L
.tr('expired') : '%t'.format(v
);
414 leaseTable
.rows(leases
);
415 leaseTable
.insertInto('#lease6_status_table');
423 return L
.network
.load().then(function() {
424 self
.repeat(self
.renderContents
, 5000);