@iobroker/js-controller-cli 4.0.0-alpha.8-20210909-001a711c → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,843 @@
1
+ /**
2
+ * List different objects for CLI
3
+ *
4
+ * Copyright 2013-2022 bluefox <dogafox@gmail.com>
5
+ *
6
+ * MIT License
7
+ *
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ /** @class */
13
+ function List(options) {
14
+ const that = this;
15
+
16
+ options = options || {};
17
+
18
+ if (!options.states) {
19
+ throw new Error('Invalid Modified arguments: states is missing');
20
+ }
21
+ if (!options.objects) {
22
+ throw new Error('Invalid arguments: objects is missing');
23
+ }
24
+ if (!options.processExit) {
25
+ throw new Error('Invalid arguments: processExit is missing');
26
+ }
27
+
28
+ const { tools } = require('@iobroker/js-controller-common');
29
+ const fs = require('fs-extra');
30
+ const { EXIT_CODES } = require('@iobroker/js-controller-common');
31
+
32
+ this.config = fs.readJSONSync(tools.getConfigFileName());
33
+
34
+ const objects = options.objects;
35
+ const states = options.states;
36
+ const processExit = options.processExit;
37
+
38
+ function perm2str(perm) {
39
+ let result = '';
40
+ // user
41
+ result += perm & 0x400 ? 'r' : '-';
42
+ result += perm & 0x200 ? 'w' : '-';
43
+ result += perm & 0x100 ? 'x' : '-';
44
+ // group
45
+ result += perm & 0x040 ? 'r' : '-';
46
+ result += perm & 0x020 ? 'w' : '-';
47
+ result += perm & 0x010 ? 'x' : '-';
48
+ // any
49
+ result += perm & 0x004 ? 'r' : '-';
50
+ result += perm & 0x002 ? 'w' : '-';
51
+ result += perm & 0x001 ? 'x' : '-';
52
+ return result;
53
+ }
54
+
55
+ this.showFileHeader = function (adapter) {
56
+ adapter && console.log(`\n-- ${adapter} --`);
57
+ console.log(' Modified at |Permission| User | Group | Size | Name');
58
+ console.log('----------------+----------+--------------+--------------+------+---------');
59
+ };
60
+
61
+ this.showFile = (adapter, path, file) => {
62
+ //drwxr-xr-x 1 odroid odroid 43 Oct 3 2013 .xsessionrc
63
+ let text = '';
64
+ let time;
65
+ if (file.modifiedAt) {
66
+ const ts = new Date(file.modifiedAt);
67
+ time = ts.toISOString();
68
+ time = time.replace('T', ' ');
69
+ time = time.substring(0, 16) + ' ';
70
+ } else {
71
+ time = new Array(18).join(' ');
72
+ }
73
+ text += time;
74
+
75
+ if (file.acl) {
76
+ text += (file.isDir ? 'd' : '-') + perm2str(file.acl.permissions || 0);
77
+ let owner = file.acl.owner;
78
+ if (owner) {
79
+ owner = owner.substring(12);
80
+ if (owner.length < 15) {
81
+ owner = new Array(15 - owner.length).join(' ') + owner;
82
+ }
83
+ } else {
84
+ owner = new Array(15).join(' ');
85
+ }
86
+ text += ' ' + owner;
87
+ let group = file.acl.ownerGroup;
88
+ if (group) {
89
+ group = group.substring(13);
90
+ if (group.length < 15) {
91
+ group = new Array(15 - group.length).join(' ') + group;
92
+ }
93
+ } else {
94
+ group = new Array(15).join(' ');
95
+ }
96
+
97
+ text += ' ' + group;
98
+ } else {
99
+ text += (file.isDir ? 'd' : '-') + '?????????' + new Array(31).join(' ');
100
+ }
101
+ let size = file.stats && file.stats.size ? file.stats.size.toString() : '';
102
+ if (size.length < 7) {
103
+ size = new Array(7 - size.length).join(' ') + size;
104
+ }
105
+
106
+ text += ' ' + size + ' ' + adapter + (!path || path[0] === '/' ? '' : '/') + path + '/' + file.file;
107
+ if (file.isDir) {
108
+ text += '/';
109
+ console.log(text);
110
+ } else {
111
+ console.log(text);
112
+ }
113
+ };
114
+
115
+ this.showObjectHeader = () => {
116
+ console.log('ObjectAC | StateAC | User | Group | ID');
117
+ console.log('---------+---------+--------------+--------------+--------------');
118
+ };
119
+
120
+ this.showObject = obj => {
121
+ //drwxr-xr-x 1 odroid odroid 43 Oct 3 2013 .xsessionrc
122
+ let text = '';
123
+ if (obj.acl) {
124
+ text +=
125
+ perm2str(obj.acl.object || 0) +
126
+ ' ' +
127
+ (obj.type === 'state' ? perm2str(obj.acl.state || 0) : ' ');
128
+ let owner = obj.acl.owner;
129
+ if (owner) {
130
+ owner = owner.substring(12);
131
+ if (owner.length < 15) {
132
+ owner = new Array(15 - owner.length).join(' ') + owner;
133
+ }
134
+ } else {
135
+ owner = new Array(15).join(' ');
136
+ }
137
+ text += ' ' + owner;
138
+ let group = obj.acl.ownerGroup;
139
+ if (group) {
140
+ group = group.substring(13);
141
+ if (group.length < 15) {
142
+ group = new Array(15 - group.length).join(' ') + group;
143
+ }
144
+ } else {
145
+ group = new Array(15).join(' ');
146
+ }
147
+ text += ' ' + group;
148
+ } else {
149
+ text += '?????????' + (obj.type === 'state' ? ' ?????????' : ' ') + new Array(31).join(' ');
150
+ }
151
+ text += ' ' + obj._id;
152
+ console.log(text);
153
+ };
154
+
155
+ this.listDirectory = (adapter, path, allFiles, callback) => {
156
+ if (typeof path === 'function') {
157
+ callback = path;
158
+ path = '';
159
+ allFiles = [];
160
+ }
161
+ if (typeof allFiles === 'function') {
162
+ callback = allFiles;
163
+ allFiles = [];
164
+ }
165
+ allFiles = allFiles || [];
166
+
167
+ path = path || '';
168
+
169
+ objects.readDir(adapter, path, null, (err, files) => {
170
+ if (err && err.code === 'ENOTDIR') {
171
+ const pos = path.lastIndexOf('/');
172
+ if (pos !== -1) {
173
+ const dir = path.substring(0, pos);
174
+ const fname = path.substring(pos + 1);
175
+ objects.readDir(adapter, dir, null, function (err, files) {
176
+ if (err) {
177
+ console.log('Cannot read "' + path + '": ' + err);
178
+ typeof callback === 'function' && callback(allFiles);
179
+ } else {
180
+ for (let f = 0; f < files.length; f++) {
181
+ if (files[f].file === '.' || files[f].file === '..') {
182
+ continue;
183
+ }
184
+ if (files[f].file === fname) {
185
+ allFiles.push({ adapter: adapter, path: path, file: files[f] });
186
+ break;
187
+ }
188
+ }
189
+ typeof callback === 'function' && callback(allFiles);
190
+ }
191
+ });
192
+ } else if (typeof callback === 'function') {
193
+ callback(allFiles);
194
+ }
195
+ } else {
196
+ let count = 0;
197
+ for (let f = 0; f < files.length; f++) {
198
+ if (files[f].file === '.' || files[f].file === '..') {
199
+ continue;
200
+ }
201
+ allFiles.push({ adapter: adapter, path: path, file: files[f] });
202
+ if (files[f].isDir) {
203
+ count++;
204
+ that.listDirectory(adapter, path + '/' + files[f].file, allFiles, function () {
205
+ if (!--count && callback) {
206
+ typeof callback === 'function' && callback(allFiles);
207
+ }
208
+ });
209
+ }
210
+ }
211
+ if (!count && typeof callback === 'function') {
212
+ callback(allFiles);
213
+ }
214
+ }
215
+ });
216
+ };
217
+
218
+ function sortFiles(a, b) {
219
+ let a1 = a.path + a.file.file;
220
+ if (a1[0] !== '/') {
221
+ a1 = '/' + a1;
222
+ }
223
+ let b1 = b.path + b.file.file;
224
+ if (b1[0] !== '/') {
225
+ b1 = '/' + b1;
226
+ }
227
+ return a1.localeCompare(b1);
228
+ }
229
+
230
+ this.listAdaptersFiles = (adapters, filter, callback) => {
231
+ if (typeof filter === 'function') {
232
+ callback = filter;
233
+ filter = null;
234
+ }
235
+ if (filter) {
236
+ filter = filter.replace(/\*/g, '');
237
+ if (filter[filter.length - 1] === '/') {
238
+ filter = filter.substring(0, filter.length - 1);
239
+ }
240
+ }
241
+
242
+ if (adapters && adapters.length) {
243
+ const adapter = adapters.shift();
244
+ this.listDirectory(adapter, filter, files => {
245
+ files.sort(sortFiles);
246
+ that.showFileHeader(adapter);
247
+
248
+ files
249
+ .filter(f => !filter || (f.path + '/' + f.file.file).startsWith(filter))
250
+ .forEach(f => that.showFile(f.adapter, f.path, f.file));
251
+
252
+ that.listAdaptersFiles(adapters, callback);
253
+ });
254
+ } else {
255
+ typeof callback === 'function' && callback();
256
+ }
257
+ };
258
+
259
+ function readOnlineState(lines, flags, cb, _result) {
260
+ _result = _result || [];
261
+ if (!lines || !lines.length) {
262
+ cb(_result);
263
+ } else {
264
+ const task = lines.shift();
265
+ const id = task.id + '.alive';
266
+ states.getState(id, (err, state) => {
267
+ if (state && state.val) {
268
+ _result.push('+ ' + task.value);
269
+ } else if (!flags.alive) {
270
+ _result.push(' ' + task.value);
271
+ }
272
+ setImmediate(readOnlineState, lines, flags, cb, _result);
273
+ });
274
+ }
275
+ }
276
+
277
+ this.list = (type, filter, flags) => {
278
+ objects.getObject('system.config', (err, systemConf) => {
279
+ const lang = (systemConf && systemConf.common && systemConf.common.language) || 'en';
280
+ switch (type) {
281
+ case 'objects':
282
+ case 'o':
283
+ objects.getObjectList(null, (err, objs) => {
284
+ const reg = filter ? new RegExp(tools.pattern2RegEx(filter)) : null;
285
+ for (let i = 0; i < objs.rows.length; i++) {
286
+ let name =
287
+ objs.rows[i].value && objs.rows[i].value.common && objs.rows[i].value.common.name;
288
+ if (tools.isObject(name)) {
289
+ name = name[lang] || name.en;
290
+ }
291
+ if (
292
+ !reg ||
293
+ reg.test(objs.rows[i].value._id) ||
294
+ (objs.rows[i].value.common && reg.test(name))
295
+ ) {
296
+ if (objs.rows[i].value.type) {
297
+ let id = objs.rows[i].value._id;
298
+ let type = objs.rows[i].value.type;
299
+ if (id.length < 40) {
300
+ id += new Array(40 - id.length).join(' ');
301
+ }
302
+ if (type.length < 10) {
303
+ type += new Array(10 - type.length).join(' ');
304
+ }
305
+
306
+ console.log(id + ': ' + type + ' - ' + (name || ''));
307
+ } else {
308
+ console.log(objs.rows[i].value._id);
309
+ }
310
+ }
311
+ }
312
+ setTimeout(processExit, 1000, null);
313
+ });
314
+ break;
315
+
316
+ case 'states':
317
+ case 's':
318
+ states.getKeys(filter || '*', (err, keys) => {
319
+ if (err) {
320
+ console.error(err);
321
+ processExit(EXIT_CODES.CANNOT_GET_STATES);
322
+ }
323
+ states.getStates(keys, (err, states) => {
324
+ if (err) {
325
+ console.error(err);
326
+ return processExit(EXIT_CODES.CANNOT_GET_STATES);
327
+ }
328
+ for (let i = 0; i < states.length; i++) {
329
+ let id = keys[i];
330
+ let from = states[i].from || '';
331
+ let type = typeof states[i].val;
332
+ if (type.length < 10) {
333
+ type += new Array(10 - type.length).join(' ');
334
+ }
335
+ if (id.length < 40) {
336
+ id += new Array(40 - id.length).join(' ');
337
+ }
338
+ if (from.length < 30) {
339
+ from += new Array(30 - from.length).join(' ');
340
+ }
341
+ console.log(
342
+ id +
343
+ ': from [' +
344
+ from +
345
+ '] (' +
346
+ type +
347
+ ') ' +
348
+ (states[i].ack ? ' ack' : 'not ack') +
349
+ ' ' +
350
+ JSON.stringify(states[i].val)
351
+ );
352
+ }
353
+ setTimeout(processExit, 1000, null);
354
+ });
355
+ });
356
+ break;
357
+
358
+ case 'adapters':
359
+ case 'a':
360
+ objects.getObjectList(
361
+ { startkey: 'system.adapter.', endkey: 'system.adapter.\u9999' },
362
+ (err, objs) => {
363
+ const reg = filter ? new RegExp(tools.pattern2RegEx('system.adapter.' + filter)) : null;
364
+ for (let i = 0; i < objs.rows.length; i++) {
365
+ if (objs.rows[i].value.type !== 'adapter') {
366
+ continue;
367
+ }
368
+ if (
369
+ !reg ||
370
+ reg.test(objs.rows[i].value._id) ||
371
+ (objs.rows[i].value.common && reg.test(objs.rows[i].value.common.name))
372
+ ) {
373
+ let id = objs.rows[i].value._id;
374
+ let name = objs.rows[i].value.common.name;
375
+ if (typeof name === 'object') {
376
+ name = name[lang] || name.en;
377
+ }
378
+ if (id.length < 40) {
379
+ id += new Array(40 - id.length).join(' ');
380
+ }
381
+ if (name.length < 15) {
382
+ name += new Array(15 - name.length).join(' ');
383
+ }
384
+
385
+ const text = id + ': ' + name + ' - v' + objs.rows[i].value.common.version;
386
+
387
+ console.log(text);
388
+ }
389
+ }
390
+ setTimeout(processExit, 1000, null);
391
+ }
392
+ );
393
+ break;
394
+
395
+ case 'instances':
396
+ case 'i':
397
+ objects.getObjectList(
398
+ { startkey: 'system.adapter.', endkey: 'system.adapter.\u9999' },
399
+ (err, objs) => {
400
+ const reg = filter ? new RegExp(tools.pattern2RegEx('system.adapter.' + filter)) : null;
401
+ objs.rows.sort((a, b) => {
402
+ if (a.id > b.id) {
403
+ return 1;
404
+ } else if (a.id < b.id) {
405
+ return -1;
406
+ }
407
+ return 0;
408
+ });
409
+ const lines = [];
410
+ for (const row of objs.rows) {
411
+ if (row.value.type !== 'instance') {
412
+ continue;
413
+ }
414
+ if (
415
+ !reg ||
416
+ reg.test(row.value._id) ||
417
+ (row.value.common && reg.test(row.value.common.name))
418
+ ) {
419
+ if (flags.enabled && !row.value.common.enabled) {
420
+ continue;
421
+ }
422
+ if (flags.disabled && row.value.common.enabled) {
423
+ continue;
424
+ }
425
+ if (flags.port && row.value.native.port === undefined) {
426
+ continue;
427
+ }
428
+ if (flags.ssl && row.value.native.secure === undefined) {
429
+ continue;
430
+ }
431
+ if (flags.ip && row.value.native.bind === undefined) {
432
+ continue;
433
+ }
434
+
435
+ let id = row.value._id;
436
+ let name = row.value.common.name;
437
+ let host = row.value.common.host;
438
+ if (typeof name === 'object') {
439
+ name = name[lang] || name.en;
440
+ }
441
+ if (id.length < 40) {
442
+ id = id.padEnd(40);
443
+ }
444
+ if (name && name.length < 22) {
445
+ name = name.padEnd(22);
446
+ }
447
+
448
+ if (host && host.length < 40) {
449
+ host = host.padEnd(40);
450
+ }
451
+
452
+ let text = `${id}: ${name || ''}: ${host} - ${
453
+ row.value.common.enabled ? ' enabled' : 'disabled'
454
+ }`;
455
+
456
+ if (this.config.system && this.config.system.compact && row.value.common.compact) {
457
+ text +=
458
+ ', compact ' +
459
+ (row.value.common.compact && row.value.common.runAsCompactMode
460
+ ? 'enabled (group ' +
461
+ (row.value.common.compactGroup !== undefined
462
+ ? row.value.common.compactGroup
463
+ : 1) +
464
+ ')'
465
+ : 'disabled');
466
+ }
467
+
468
+ if (row.value.native && row.value.native.port) {
469
+ text += `, port: ${row.value.native.port}`;
470
+ }
471
+ if (row.value.native && row.value.native.bind) {
472
+ text += `, bind: ${row.value.native.bind}`;
473
+ }
474
+ if (row.value.native && row.value.native.secure) {
475
+ text += ' (SSL)';
476
+ }
477
+ if (row.value.native && row.value.native.defaultUser) {
478
+ text += `, run as: ${row.value.native.defaultUser}`;
479
+ }
480
+ lines.push({ id: row.value._id, value: text });
481
+ }
482
+ }
483
+ readOnlineState(lines, flags, result => {
484
+ console.log(result.join('\n'));
485
+ console.log('\n+ instance is alive');
486
+ setTimeout(processExit, 1000, null);
487
+ });
488
+ }
489
+ );
490
+ break;
491
+
492
+ case 'users':
493
+ case 'u':
494
+ objects.getObjectList({ startkey: 'system.user.', endkey: 'system.user.\u9999' }, (err, objs) => {
495
+ objects.getObjectList(
496
+ { startkey: 'system.group.', endkey: 'system.group.\u9999' },
497
+ (err, groups) => {
498
+ const reg = filter ? new RegExp(tools.pattern2RegEx('system.user.' + filter)) : null;
499
+ console.log(' ID | Name | Active | Groups');
500
+ console.log(
501
+ '---------------------------------------+-------------+----------+--------------'
502
+ );
503
+ for (let i = 0; i < objs.rows.length; i++) {
504
+ if (objs.rows[i].value.type !== 'user') {
505
+ continue;
506
+ }
507
+
508
+ if (
509
+ !reg ||
510
+ reg.test(objs.rows[i].value._id) ||
511
+ (objs.rows[i].value.common && reg.test(objs.rows[i].value.common.name))
512
+ ) {
513
+ let id = objs.rows[i].value._id;
514
+ let name = objs.rows[i].value.common.name;
515
+ if (typeof name === 'object') {
516
+ name = name[lang] || name.en;
517
+ }
518
+ if (id.length < 40) {
519
+ id += new Array(40 - id.length).join(' ');
520
+ }
521
+ if (name.length < 12) {
522
+ name += new Array(12 - name.length).join(' ');
523
+ }
524
+
525
+ const text =
526
+ id +
527
+ '| ' +
528
+ name +
529
+ ' | ' +
530
+ (objs.rows[i].value.common.enabled ? ' enabled' : 'disabled') +
531
+ ' |';
532
+ const gs = [];
533
+ // find all groups
534
+ for (let g = 0; g < groups.rows.length; g++) {
535
+ if (
536
+ groups.rows[g].value.common.members &&
537
+ groups.rows[g].value.common.members.indexOf(objs.rows[i].value._id) !==
538
+ -1
539
+ ) {
540
+ gs.push(groups.rows[g].value._id.substring(13));
541
+ }
542
+ }
543
+ console.log(text + ' ' + gs.join(', '));
544
+ }
545
+ }
546
+ setTimeout(processExit, 1000, null);
547
+ }
548
+ );
549
+ });
550
+ break;
551
+
552
+ case 'groups':
553
+ case 'g':
554
+ objects.getObjectList({ startkey: 'system.group.', endkey: 'system.group.\u9999' }, (err, objs) => {
555
+ const reg = filter ? new RegExp(tools.pattern2RegEx('system.group.' + filter)) : null;
556
+ console.log('');
557
+ console.log(
558
+ ' system.group | object | state | file | user | others | users'
559
+ );
560
+ console.log(
561
+ ' | l r w d | l r w d | l r w c d | w c d | |'
562
+ );
563
+ console.log(
564
+ '--------------------+---------+---------+-----------+-------+------------------------+---------'
565
+ );
566
+ for (let i = 0; i < objs.rows.length; i++) {
567
+ if (objs.rows[i].value.type !== 'group') {
568
+ continue;
569
+ }
570
+ if (
571
+ !reg ||
572
+ reg.test(objs.rows[i].value._id) ||
573
+ (objs.rows[i].value.common && reg.test(objs.rows[i].value.common.name))
574
+ ) {
575
+ let id = objs.rows[i].value._id.substring(13);
576
+ //let name = objs.rows[i].value.common.name;
577
+
578
+ if (id === 'administrator') {
579
+ objs.rows[i].value.common.acl = {
580
+ file: {
581
+ read: true,
582
+ write: true,
583
+ delete: true,
584
+ create: true,
585
+ list: true
586
+ },
587
+ object: {
588
+ read: true,
589
+ write: true,
590
+ delete: true,
591
+ list: true
592
+ },
593
+ state: {
594
+ read: true,
595
+ write: true,
596
+ delete: true,
597
+ create: true,
598
+ list: true
599
+ },
600
+ user: {
601
+ write: true,
602
+ create: true,
603
+ delete: true
604
+ },
605
+ other: {
606
+ execute: true,
607
+ http: true,
608
+ sendto: true
609
+ }
610
+ };
611
+ }
612
+
613
+ if (id.length < 20) {
614
+ id += new Array(20 - id.length).join(' ');
615
+ }
616
+ let text = id;
617
+ text += ' | ';
618
+ if (objs.rows[i].value.common.acl && objs.rows[i].value.common.acl.object) {
619
+ text += (objs.rows[i].value.common.acl.object.list ? '+' : '-') + ' ';
620
+ text += (objs.rows[i].value.common.acl.object.read ? '+' : '-') + ' ';
621
+ text += (objs.rows[i].value.common.acl.object.write ? '+' : '-') + ' ';
622
+ text += (objs.rows[i].value.common.acl.object.delete ? '+' : '-') + ' ';
623
+ text += '|';
624
+ } else {
625
+ text += ' |';
626
+ }
627
+ if (objs.rows[i].value.common.acl && objs.rows[i].value.common.acl.state) {
628
+ text += ' ';
629
+ text += (objs.rows[i].value.common.acl.state.list ? '+' : '-') + ' ';
630
+ text += (objs.rows[i].value.common.acl.state.read ? '+' : '-') + ' ';
631
+ text += (objs.rows[i].value.common.acl.state.write ? '+' : '-') + ' ';
632
+ text += (objs.rows[i].value.common.acl.state.delete ? '+' : '-') + ' ';
633
+ text += '|';
634
+ } else {
635
+ text += ' |';
636
+ }
637
+ if (objs.rows[i].value.common.acl && objs.rows[i].value.common.acl.file) {
638
+ text += ' ';
639
+ text += (objs.rows[i].value.common.acl.file.list ? '+' : '-') + ' ';
640
+ text += (objs.rows[i].value.common.acl.file.read ? '+' : '-') + ' ';
641
+ text += (objs.rows[i].value.common.acl.file.write ? '+' : '-') + ' ';
642
+ text += (objs.rows[i].value.common.acl.file.create ? '+' : '-') + ' ';
643
+ text += (objs.rows[i].value.common.acl.file.delete ? '+' : '-') + ' ';
644
+ text += '|';
645
+ } else {
646
+ text += ' |';
647
+ }
648
+ if (objs.rows[i].value.common.acl && objs.rows[i].value.common.acl.users) {
649
+ text += ' ';
650
+ text += (objs.rows[i].value.common.acl.users.write ? '+' : '-') + ' ';
651
+ text += (objs.rows[i].value.common.acl.users.create ? '+' : '-') + ' ';
652
+ text += (objs.rows[i].value.common.acl.users.delete ? '+' : '-') + ' ';
653
+ text += '|';
654
+ } else {
655
+ text += ' |';
656
+ }
657
+ if (objs.rows[i].value.common.acl && objs.rows[i].value.common.acl.other) {
658
+ text += ' ';
659
+ let others = '';
660
+ for (const r of Object.keys(objs.rows[i].value.common.acl.other)) {
661
+ others += r + (objs.rows[i].value.common.acl.other[r] ? '+' : '-') + ' ';
662
+ }
663
+ if (others.length < 23) {
664
+ others += new Array(23 - others.length).join(' ');
665
+ }
666
+ text += others + '|';
667
+ } else {
668
+ text += new Array(25).join(' ') + '|';
669
+ }
670
+
671
+ //if (name.length < 30) name += new Array(30 - name.length).join(' ');
672
+ if (objs.rows[i].value.common.members) {
673
+ for (let m = 0; m < objs.rows[i].value.common.members.length; m++) {
674
+ objs.rows[i].value.common.members[m] =
675
+ objs.rows[i].value.common.members[m].substring(12);
676
+ }
677
+ text += ' ' + objs.rows[i].value.common.members.join(', ');
678
+ }
679
+ //text += '| (' + name + ')';
680
+ console.log(text);
681
+ }
682
+ }
683
+
684
+ console.log(
685
+ '--------------------+---------+---------+-----------+-------+------------------------+---------'
686
+ );
687
+ console.log('Legend: (l)ist, (r)ead, (w)rite, (c)reate, (d)elete');
688
+ setTimeout(processExit, 1000, null);
689
+ });
690
+ break;
691
+
692
+ case 'h':
693
+ case 'hosts':
694
+ objects.getObjectList({ startkey: 'system.host.', endkey: 'system.host.\u9999' }, (err, objs) => {
695
+ states.getKeys('system.host.*', (err, keys) => {
696
+ states.getStates(keys, (err, states) => {
697
+ const reg = filter ? new RegExp(tools.pattern2RegEx('system.host.' + filter)) : null;
698
+
699
+ for (let i = 0; i < objs.rows.length; i++) {
700
+ if (objs.rows[i].value.type !== 'host') {
701
+ continue;
702
+ }
703
+ if (
704
+ !reg ||
705
+ reg.test(objs.rows[i].value._id) ||
706
+ (objs.rows[i].value.common && reg.test(objs.rows[i].value.common.name))
707
+ ) {
708
+ let id = objs.rows[i].value._id.substring(12);
709
+ let name = objs.rows[i].value.common.name;
710
+ if (typeof name === 'object') {
711
+ name = name[lang] || name.en;
712
+ }
713
+ if (id.length < 20) {
714
+ id += new Array(20 - id.length).join(' ');
715
+ }
716
+ let hostname = objs.rows[i].value.common.hostname;
717
+ if (hostname.length < 15) {
718
+ hostname += new Array(15 - hostname.length).join(' ');
719
+ }
720
+ const version = objs.rows[i].value.common.installedVersion;
721
+ let alive = '';
722
+ let uptime = '';
723
+ for (let k = 0; k < keys.length; k++) {
724
+ if (keys[k] === objs.rows[i].value._id + '.alive') {
725
+ alive = states[k].val;
726
+ }
727
+ if (keys[k] === objs.rows[i].value._id + '.uptime') {
728
+ uptime = states[k].val;
729
+ }
730
+ }
731
+ alive = alive ? 'alive' : ' dead';
732
+ //if (uptime.toString().length < 10) uptime = new Array(10 - uptime.toString().length).join(' ') + uptime.toString();
733
+ if (!uptime) {
734
+ uptime = '-';
735
+ }
736
+ const text =
737
+ id +
738
+ ' ' +
739
+ name +
740
+ ' (version: ' +
741
+ version +
742
+ ', hostname: ' +
743
+ hostname +
744
+ ', ' +
745
+ alive +
746
+ ', uptime: ' +
747
+ uptime +
748
+ ')';
749
+ // todo
750
+ console.log(text);
751
+ }
752
+ }
753
+
754
+ setTimeout(processExit, 1000, null);
755
+ });
756
+ });
757
+ });
758
+ break;
759
+
760
+ case 'enums':
761
+ case 'e':
762
+ objects.getObjectList({ startkey: 'enum.', endkey: 'enum.\u9999' }, (err, objs) => {
763
+ const reg = filter ? new RegExp(tools.pattern2RegEx('enum.' + filter)) : null;
764
+ for (let i = 0; i < objs.rows.length; i++) {
765
+ if (objs.rows[i].value.type !== 'enum') {
766
+ continue;
767
+ }
768
+ if (
769
+ !reg ||
770
+ reg.test(objs.rows[i].value._id) ||
771
+ (objs.rows[i].value.common && reg.test(objs.rows[i].value.common.name))
772
+ ) {
773
+ console.log(
774
+ '\n====================================================================================='
775
+ );
776
+ let id = objs.rows[i].value._id.substring(5);
777
+ let name = objs.rows[i].value.common.name;
778
+ if (typeof name === 'object') {
779
+ name = name[lang] || name.en;
780
+ }
781
+ if (id.length < 20) {
782
+ id += new Array(20 - id.length).join(' ');
783
+ }
784
+ console.log(id + '(' + name + ')');
785
+ console.log(
786
+ '-------------------------------------------------------------------------------------'
787
+ );
788
+
789
+ if (objs.rows[i].value.common.members) {
790
+ console.log(objs.rows[i].value.common.members.join(', '));
791
+ }
792
+ }
793
+ }
794
+ setTimeout(processExit, 1000, null);
795
+ });
796
+ break;
797
+
798
+ case 'files':
799
+ case 'f':
800
+ objects.getObjectList({ startkey: '', endkey: '\u9999' }, (err, objs) => {
801
+ const adapter = filter || null;
802
+ const names = filter ? filter.split('/') : null;
803
+ if (names && !names[0]) {
804
+ names.splice(0, 1);
805
+ }
806
+
807
+ const adapters = objs.rows
808
+ .filter(
809
+ row =>
810
+ row.value.type === 'meta' &&
811
+ !(
812
+ adapter &&
813
+ row.value._id !== names[0] &&
814
+ !row.value._id.startsWith(`${names[0]}.`)
815
+ )
816
+ )
817
+ .map(row => row.value._id);
818
+
819
+ names && names.shift();
820
+
821
+ that.listAdaptersFiles(adapters, names ? names.join('/') : null, () =>
822
+ setTimeout(processExit, 1000, null)
823
+ );
824
+ });
825
+ break;
826
+
827
+ default:
828
+ if (type) {
829
+ console.error('Unknown type: ' + type);
830
+ processExit(EXIT_CODES.INVALID_ARGUMENTS);
831
+ } else {
832
+ console.log(
833
+ 'Please specify type: objects, states, instances, adapters, users, groups, enums, files'
834
+ );
835
+ processExit();
836
+ }
837
+ break;
838
+ }
839
+ });
840
+ };
841
+ }
842
+
843
+ module.exports = List;