1667eca6ff56eb62c06932f36ace8e7b72c8b8b2
[project/luci.git] / modules / luci-mod-dashboard / htdocs / luci-static / resources / view / dashboard / include / 10_router.js
1 'use strict';
2 'require baseclass';
3 'require fs';
4 'require rpc';
5 'require network';
6
7 var callSystemBoard = rpc.declare({
8 object: 'system',
9 method: 'board'
10 });
11
12 var callSystemInfo = rpc.declare({
13 object: 'system',
14 method: 'info'
15 });
16
17 return baseclass.extend({
18
19 params: [],
20
21 load: function() {
22 return Promise.all([
23 network.getWANNetworks(),
24 network.getWAN6Networks(),
25 L.resolveDefault(callSystemBoard(), {}),
26 L.resolveDefault(callSystemInfo(), {})
27 ]);
28 },
29
30 renderHtml: function(data, type) {
31
32 var icon = type;
33 var title = 'router' == type ? _('System') : _('Internet');
34 var container_wapper = E('div', { 'class': type + '-status-self dashboard-bg box-s1'});
35 var container_box = E('div', { 'class': type + '-status-info'});
36 var container_item = E('div', { 'class': 'settings-info'});
37
38 if ('internet' == type) {
39 icon = (data.v4.connected.value || data.v6.connected.value) ? type : 'not-internet';
40 }
41
42 container_box.appendChild(E('div', { 'class': 'title'}, [
43 E('img', {
44 'src': L.resource('view/dashboard/icons/' + icon + '.svg'),
45 'width': 'router' == type ? 64 : 54,
46 'title': title,
47 'class': 'middle'
48 }),
49 E('h3', title)
50 ]));
51
52 container_box.appendChild(E('hr'));
53
54 if ('internet' == type) {
55 var container_internet_v4 = E('div');
56 var container_internet_v6 = E('div');
57
58 for(var idx in data) {
59
60 for(var ver in data[idx]) {
61 var classname = ver,
62 suppelements = '',
63 visible = data[idx][ver].visible;
64
65 if('connected' === ver) {
66 classname = data[idx][ver].value ? 'label label-success' : 'label label-danger';
67 data[idx][ver].value = data[idx][ver].value ? _('yes') : _('no');
68 }
69
70 if ('v4' === idx) {
71
72 if ('title' === ver) {
73 container_internet_v4.appendChild(
74 E('p', { 'class': 'mt-2'}, [
75 E('span', {'class': ''}, [ data[idx].title ]),
76 ])
77 );
78 continue;
79 }
80
81 if ('addrsv4' === ver) {
82 var addrs = data[idx][ver].value;
83 if(Array.isArray(addrs) && addrs.length) {
84 for(var ip in addrs) {
85 data[idx][ver].value = addrs[ip].split('/')[0];
86 }
87 }
88 }
89
90 if (visible) {
91 container_internet_v4.appendChild(
92 E('p', { 'class': 'mt-2'}, [
93 E('span', {'class': ''}, [ data[idx][ver].title + ':' ]),
94 E('span', {'class': classname }, [ data[idx][ver].value ]),
95 suppelements
96 ])
97 );
98 }
99
100 } else {
101
102 if ('title' === ver) {
103 container_internet_v6.appendChild(
104 E('p', { 'class': 'mt-2'}, [
105 E('span', {'class': ''}, [ data[idx].title ]),
106 ])
107 );
108 continue;
109 }
110
111 if (visible) {
112 container_internet_v6.appendChild(
113 E('p', {'class': 'mt-2'}, [
114 E('span', {'class': ''}, [data[idx][ver].title + ':']),
115 E('span', {'class': classname}, [data[idx][ver].value]),
116 suppelements
117 ])
118 );
119 }
120 }
121 }
122 }
123
124 container_item.appendChild(container_internet_v4);
125 container_item.appendChild(container_internet_v6);
126 } else {
127 for(var idx in data) {
128 container_item.appendChild(
129 E('p', { 'class': 'mt-2'}, [
130 E('span', {'class': ''}, [ data[idx].title + ':' ]),
131 E('span', {'class': ''}, [ data[idx].value ])
132 ])
133 );
134 }
135 }
136
137 container_box.appendChild(container_item);
138 container_box.appendChild(E('hr'));
139 container_wapper.appendChild(container_box);
140 return container_wapper;
141 },
142
143 renderUpdateWanData: function(data, v6) {
144
145 var min_metric = 2000000000;
146 var min_metric_i = 0;
147 for (var i = 0; i < data.length; i++) {
148 var metric = data[i].getMetric();
149 if (metric < min_metric) {
150 min_metric = metric;
151 min_metric_i = i;
152 }
153 }
154
155 var ifc = data[min_metric_i];
156
157 if (v6) {
158 var uptime = ifc.getUptime();
159 this.params.internet.v6.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-';
160 this.params.internet.v6.ipprefixv6.value = ifc.getIP6Prefix() || '-';
161 this.params.internet.v6.gatewayv6.value = ifc.getGateway6Addr() || '-';
162 this.params.internet.v6.protocol.value= ifc.getI18n() || E('em', _('Not connected'));
163 this.params.internet.v6.addrsv6.value = ifc.getIP6Addrs() || [ '-' ];
164 this.params.internet.v6.dnsv6.value = ifc.getDNS6Addrs() || [ '-' ];
165 this.params.internet.v6.connected.value = ifc.isUp();
166 } else {
167 var uptime = ifc.getUptime();
168 this.params.internet.v4.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-';
169 this.params.internet.v4.protocol.value= ifc.getI18n() || E('em', _('Not connected'));
170 this.params.internet.v4.gatewayv4.value = ifc.getGatewayAddr() || '0.0.0.0';
171 this.params.internet.v4.connected.value = ifc.isUp();
172 this.params.internet.v4.addrsv4.value = ifc.getIPAddrs() || [ '-'];
173 this.params.internet.v4.dnsv4.value = ifc.getDNSAddrs() || [ '-' ];
174 }
175 },
176
177 renderInternetBox: function(data) {
178
179 this.params.internet = {
180
181 v4: {
182 title: _('IPv4 Internet'),
183
184 connected: {
185 title: _('Connected'),
186 visible: true,
187 value: false
188 },
189
190 uptime: {
191 title: _('Uptime'),
192 visible: true,
193 value: '-'
194 },
195
196 protocol: {
197 title: _('Protocol'),
198 visible: true,
199 value: '-'
200 },
201
202 addrsv4: {
203 title: _('IPv4'),
204 visible: true,
205 value: [ '-' ]
206 },
207
208 gatewayv4: {
209 title: _('GatewayV4'),
210 visible: true,
211 value: '-'
212 },
213
214 dnsv4: {
215 title: _('DNSv4'),
216 visible: true,
217 value: ['-']
218 }
219 },
220
221 v6: {
222 title: _('IPv6 Internet'),
223
224 connected: {
225 title: _('Connected'),
226 visible: true,
227 value: false
228 },
229
230 uptime: {
231 title: _('Uptime'),
232 visible: true,
233 value: '-'
234 },
235
236 protocol: {
237 title: _('Protocol'),
238 visible: true,
239 value: ' - '
240 },
241
242 ipprefixv6 : {
243 title: _('IPv6 prefix'),
244 visible: true,
245 value: ' - '
246 },
247
248 addrsv6: {
249 title: _('IPv6'),
250 visible: false,
251 value: [ '-' ]
252 },
253
254 gatewayv6: {
255 title: _('GatewayV6'),
256 visible: true,
257 value: '-'
258 },
259
260 dnsv6: {
261 title: _('DNSv6'),
262 visible: true,
263 value: [ '-' ]
264 }
265 }
266 };
267
268 this.renderUpdateWanData(data[0], false);
269 this.renderUpdateWanData(data[1], true);
270
271 return this.renderHtml(this.params.internet, 'internet');
272 },
273
274 renderRouterBox: function(data) {
275
276 var boardinfo = data[2],
277 systeminfo = data[3];
278
279 var datestr = null;
280
281 if (systeminfo.localtime) {
282 var date = new Date(systeminfo.localtime * 1000);
283
284 datestr = '%04d-%02d-%02d %02d:%02d:%02d'.format(
285 date.getUTCFullYear(),
286 date.getUTCMonth() + 1,
287 date.getUTCDate(),
288 date.getUTCHours(),
289 date.getUTCMinutes(),
290 date.getUTCSeconds()
291 );
292 }
293
294 this.params.router = {
295 uptime: {
296 title: _('Uptime'),
297 value: systeminfo.uptime ? '%t'.format(systeminfo.uptime) : null,
298 },
299
300 localtime: {
301 title: _('Local Time'),
302 value: datestr
303 },
304
305 kernel: {
306 title: _('Kernel Version'),
307 value: boardinfo.kernel
308 },
309
310 model: {
311 title: _('Model'),
312 value: boardinfo.model
313 },
314
315 system: {
316 title: _('Architecture'),
317 value: boardinfo.system
318 },
319
320 release: {
321 title: _('Firmware Version'),
322 value: boardinfo.release.description
323 }
324 };
325
326 return this.renderHtml(this.params.router, 'router');
327 },
328
329 render: function(data) {
330 return [this.renderInternetBox(data), this.renderRouterBox(data)];
331 }
332 });