@depup/systeminformation 5.31.4-depup.0

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.
package/lib/docker.js ADDED
@@ -0,0 +1,803 @@
1
+ 'use strict';
2
+ // @ts-check
3
+ // ==================================================================================
4
+ // docker.js
5
+ // ----------------------------------------------------------------------------------
6
+ // Description: System Information - library
7
+ // for Node.js
8
+ // Copyright: (c) 2014 - 2026
9
+ // Author: Sebastian Hildebrandt
10
+ // ----------------------------------------------------------------------------------
11
+ // License: MIT
12
+ // ==================================================================================
13
+ // 13. Docker
14
+ // ----------------------------------------------------------------------------------
15
+
16
+ const util = require('./util');
17
+ const DockerSocket = require('./dockerSocket');
18
+
19
+ const _platform = process.platform;
20
+ const _windows = _platform === 'win32';
21
+
22
+ const _docker_container_stats = {};
23
+ let _docker_socket;
24
+ let _docker_last_read = 0;
25
+
26
+ // --------------------------
27
+ // get containers (parameter all: get also inactive/exited containers)
28
+
29
+ function dockerInfo(callback) {
30
+ return new Promise((resolve) => {
31
+ process.nextTick(() => {
32
+ if (!_docker_socket) {
33
+ _docker_socket = new DockerSocket();
34
+ }
35
+ const result = {};
36
+
37
+ _docker_socket.getInfo((data) => {
38
+ result.id = data.ID;
39
+ result.containers = data.Containers;
40
+ result.containersRunning = data.ContainersRunning;
41
+ result.containersPaused = data.ContainersPaused;
42
+ result.containersStopped = data.ContainersStopped;
43
+ result.images = data.Images;
44
+ result.driver = data.Driver;
45
+ result.memoryLimit = data.MemoryLimit;
46
+ result.swapLimit = data.SwapLimit;
47
+ result.kernelMemory = data.KernelMemory;
48
+ result.cpuCfsPeriod = data.CpuCfsPeriod;
49
+ result.cpuCfsQuota = data.CpuCfsQuota;
50
+ result.cpuShares = data.CPUShares;
51
+ result.cpuSet = data.CPUSet;
52
+ result.ipv4Forwarding = data.IPv4Forwarding;
53
+ result.bridgeNfIptables = data.BridgeNfIptables;
54
+ result.bridgeNfIp6tables = data.BridgeNfIp6tables;
55
+ result.debug = data.Debug;
56
+ result.nfd = data.NFd;
57
+ result.oomKillDisable = data.OomKillDisable;
58
+ result.ngoroutines = data.NGoroutines;
59
+ result.systemTime = data.SystemTime;
60
+ result.loggingDriver = data.LoggingDriver;
61
+ result.cgroupDriver = data.CgroupDriver;
62
+ result.nEventsListener = data.NEventsListener;
63
+ result.kernelVersion = data.KernelVersion;
64
+ result.operatingSystem = data.OperatingSystem;
65
+ result.osType = data.OSType;
66
+ result.architecture = data.Architecture;
67
+ result.ncpu = data.NCPU;
68
+ result.memTotal = data.MemTotal;
69
+ result.dockerRootDir = data.DockerRootDir;
70
+ result.httpProxy = data.HttpProxy;
71
+ result.httpsProxy = data.HttpsProxy;
72
+ result.noProxy = data.NoProxy;
73
+ result.name = data.Name;
74
+ result.labels = data.Labels;
75
+ result.experimentalBuild = data.ExperimentalBuild;
76
+ result.serverVersion = data.ServerVersion;
77
+ result.clusterStore = data.ClusterStore;
78
+ result.clusterAdvertise = data.ClusterAdvertise;
79
+ result.defaultRuntime = data.DefaultRuntime;
80
+ result.liveRestoreEnabled = data.LiveRestoreEnabled;
81
+ result.isolation = data.Isolation;
82
+ result.initBinary = data.InitBinary;
83
+ result.productLicense = data.ProductLicense;
84
+ if (callback) {
85
+ callback(result);
86
+ }
87
+ resolve(result);
88
+ });
89
+ });
90
+ });
91
+ }
92
+
93
+ exports.dockerInfo = dockerInfo;
94
+
95
+ function dockerImages(all, callback) {
96
+ // fallback - if only callback is given
97
+ if (util.isFunction(all) && !callback) {
98
+ callback = all;
99
+ all = false;
100
+ }
101
+ if (typeof all === 'string' && all === 'true') {
102
+ all = true;
103
+ }
104
+ if (typeof all !== 'boolean' && all !== undefined) {
105
+ all = false;
106
+ }
107
+
108
+ all = all || false;
109
+ let result = [];
110
+ return new Promise((resolve) => {
111
+ process.nextTick(() => {
112
+ if (!_docker_socket) {
113
+ _docker_socket = new DockerSocket();
114
+ }
115
+ const workload = [];
116
+
117
+ _docker_socket.listImages(all, (data) => {
118
+ let dockerImages = {};
119
+ try {
120
+ dockerImages = data;
121
+ if (dockerImages && Object.prototype.toString.call(dockerImages) === '[object Array]' && dockerImages.length > 0) {
122
+ dockerImages.forEach((element) => {
123
+ if (element.Names && Object.prototype.toString.call(element.Names) === '[object Array]' && element.Names.length > 0) {
124
+ element.Name = element.Names[0].replace(/^\/|\/$/g, '');
125
+ }
126
+ workload.push(dockerImagesInspect(element.Id.trim(), element));
127
+ });
128
+ if (workload.length) {
129
+ Promise.all(workload).then((data) => {
130
+ if (callback) {
131
+ callback(data);
132
+ }
133
+ resolve(data);
134
+ });
135
+ } else {
136
+ if (callback) {
137
+ callback(result);
138
+ }
139
+ resolve(result);
140
+ }
141
+ } else {
142
+ if (callback) {
143
+ callback(result);
144
+ }
145
+ resolve(result);
146
+ }
147
+ } catch {
148
+ if (callback) {
149
+ callback(result);
150
+ }
151
+ resolve(result);
152
+ }
153
+ });
154
+ });
155
+ });
156
+ }
157
+
158
+ // --------------------------
159
+ // container inspect (for one container)
160
+
161
+ function dockerImagesInspect(imageID, payload) {
162
+ return new Promise((resolve) => {
163
+ process.nextTick(() => {
164
+ imageID = imageID || '';
165
+ if (typeof imageID !== 'string') {
166
+ return resolve();
167
+ }
168
+ const imageIDSanitized = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(imageID, true)).trim();
169
+ if (imageIDSanitized) {
170
+ if (!_docker_socket) {
171
+ _docker_socket = new DockerSocket();
172
+ }
173
+
174
+ _docker_socket.inspectImage(imageIDSanitized.trim(), (data) => {
175
+ try {
176
+ resolve({
177
+ id: payload.Id,
178
+ container: data.Container,
179
+ comment: data.Comment,
180
+ os: data.Os,
181
+ architecture: data.Architecture,
182
+ parent: data.Parent,
183
+ dockerVersion: data.DockerVersion,
184
+ size: data.Size,
185
+ sharedSize: payload.SharedSize,
186
+ virtualSize: data.VirtualSize,
187
+ author: data.Author,
188
+ created: data.Created ? Math.round(new Date(data.Created).getTime() / 1000) : 0,
189
+ containerConfig: data.ContainerConfig ? data.ContainerConfig : {},
190
+ graphDriver: data.GraphDriver ? data.GraphDriver : {},
191
+ repoDigests: data.RepoDigests ? data.RepoDigests : {},
192
+ repoTags: data.RepoTags ? data.RepoTags : {},
193
+ config: data.Config ? data.Config : {},
194
+ rootFS: data.RootFS ? data.RootFS : {}
195
+ });
196
+ } catch {
197
+ resolve();
198
+ }
199
+ });
200
+ } else {
201
+ resolve();
202
+ }
203
+ });
204
+ });
205
+ }
206
+
207
+ exports.dockerImages = dockerImages;
208
+
209
+ function dockerContainers(all, callback) {
210
+ function inContainers(containers, id) {
211
+ const filtered = containers.filter((obj) => {
212
+ /**
213
+ * @namespace
214
+ * @property {string} Id
215
+ */
216
+ return obj.Id && obj.Id === id;
217
+ });
218
+ return filtered.length > 0;
219
+ }
220
+
221
+ // fallback - if only callback is given
222
+ if (util.isFunction(all) && !callback) {
223
+ callback = all;
224
+ all = false;
225
+ }
226
+ if (typeof all === 'string' && all === 'true') {
227
+ all = true;
228
+ }
229
+ if (typeof all !== 'boolean' && all !== undefined) {
230
+ all = false;
231
+ }
232
+
233
+ all = all || false;
234
+ let result = [];
235
+ return new Promise((resolve) => {
236
+ process.nextTick(() => {
237
+ if (!_docker_socket) {
238
+ _docker_socket = new DockerSocket();
239
+ }
240
+ const workload = [];
241
+
242
+ _docker_socket.listContainers(all, (data) => {
243
+ let docker_containers = {};
244
+ try {
245
+ docker_containers = data;
246
+ if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
247
+ // GC in _docker_container_stats
248
+ for (let key in _docker_container_stats) {
249
+ if ({}.hasOwnProperty.call(_docker_container_stats, key)) {
250
+ if (!inContainers(docker_containers, key)) {
251
+ delete _docker_container_stats[key];
252
+ }
253
+ }
254
+ }
255
+
256
+ docker_containers.forEach((element) => {
257
+ if (element.Names && Object.prototype.toString.call(element.Names) === '[object Array]' && element.Names.length > 0) {
258
+ element.Name = element.Names[0].replace(/^\/|\/$/g, '');
259
+ }
260
+ workload.push(dockerContainerInspect(element.Id.trim(), element));
261
+ });
262
+ if (workload.length) {
263
+ Promise.all(workload).then((data) => {
264
+ if (callback) {
265
+ callback(data);
266
+ }
267
+ resolve(data);
268
+ });
269
+ } else {
270
+ if (callback) {
271
+ callback(result);
272
+ }
273
+ resolve(result);
274
+ }
275
+ } else {
276
+ if (callback) {
277
+ callback(result);
278
+ }
279
+ resolve(result);
280
+ }
281
+ } catch (err) {
282
+ // GC in _docker_container_stats
283
+ for (let key in _docker_container_stats) {
284
+ if ({}.hasOwnProperty.call(_docker_container_stats, key)) {
285
+ if (!inContainers(docker_containers, key)) {
286
+ delete _docker_container_stats[key];
287
+ }
288
+ }
289
+ }
290
+ if (callback) {
291
+ callback(result);
292
+ }
293
+ resolve(result);
294
+ }
295
+ });
296
+ });
297
+ });
298
+ }
299
+
300
+ // --------------------------
301
+ // container inspect (for one container)
302
+
303
+ function dockerContainerInspect(containerID, payload) {
304
+ return new Promise((resolve) => {
305
+ process.nextTick(() => {
306
+ containerID = containerID || '';
307
+ if (typeof containerID !== 'string') {
308
+ return resolve();
309
+ }
310
+ const containerIdSanitized = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(containerID, true)).trim();
311
+ if (containerIdSanitized) {
312
+ if (!_docker_socket) {
313
+ _docker_socket = new DockerSocket();
314
+ }
315
+
316
+ _docker_socket.getInspect(containerIdSanitized.trim(), (data) => {
317
+ try {
318
+ resolve({
319
+ id: payload.Id,
320
+ name: payload.Name,
321
+ image: payload.Image,
322
+ imageID: payload.ImageID,
323
+ command: payload.Command,
324
+ created: payload.Created,
325
+ started: data.State && data.State.StartedAt ? Math.round(new Date(data.State.StartedAt).getTime() / 1000) : 0,
326
+ finished: data.State && data.State.FinishedAt && !data.State.FinishedAt.startsWith('0001-01-01') ? Math.round(new Date(data.State.FinishedAt).getTime() / 1000) : 0,
327
+ createdAt: data.Created ? data.Created : '',
328
+ startedAt: data.State && data.State.StartedAt ? data.State.StartedAt : '',
329
+ finishedAt: data.State && data.State.FinishedAt && !data.State.FinishedAt.startsWith('0001-01-01') ? data.State.FinishedAt : '',
330
+ state: payload.State,
331
+ restartCount: data.RestartCount || 0,
332
+ platform: data.Platform || '',
333
+ driver: data.Driver || '',
334
+ ports: payload.Ports,
335
+ mounts: payload.Mounts
336
+ // hostconfig: payload.HostConfig,
337
+ // network: payload.NetworkSettings
338
+ });
339
+ } catch {
340
+ resolve();
341
+ }
342
+ });
343
+ } else {
344
+ resolve();
345
+ }
346
+ });
347
+ });
348
+ }
349
+
350
+ exports.dockerContainers = dockerContainers;
351
+
352
+ // --------------------------
353
+ // helper functions for calculation of docker stats
354
+
355
+ function docker_calcCPUPercent(cpu_stats, precpu_stats) {
356
+ /**
357
+ * @namespace
358
+ * @property {object} cpu_usage
359
+ * @property {number} cpu_usage.total_usage
360
+ * @property {number} system_cpu_usage
361
+ * @property {object} cpu_usage
362
+ * @property {Array} cpu_usage.percpu_usage
363
+ */
364
+
365
+ if (!_windows) {
366
+ let cpuPercent = 0.0;
367
+ // calculate the change for the cpu usage of the container in between readings
368
+ let cpuDelta = cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage;
369
+ // calculate the change for the entire system between readings
370
+ let systemDelta = cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage;
371
+
372
+ if (systemDelta > 0.0 && cpuDelta > 0.0) {
373
+ // calculate the change for the cpu usage of the container in between readings
374
+ if (precpu_stats.online_cpus) {
375
+ cpuPercent = (cpuDelta / systemDelta) * precpu_stats.online_cpus * 100.0;
376
+ } else {
377
+ cpuPercent = (cpuDelta / systemDelta) * cpu_stats.cpu_usage.percpu_usage.length * 100.0;
378
+ }
379
+ }
380
+
381
+ return cpuPercent;
382
+ } else {
383
+ let nanoSecNow = util.nanoSeconds();
384
+ let cpuPercent = 0.0;
385
+ if (_docker_last_read > 0) {
386
+ let possIntervals = nanoSecNow - _docker_last_read; // / 100 * os.cpus().length;
387
+ let intervalsUsed = cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage;
388
+ if (possIntervals > 0) {
389
+ cpuPercent = (100.0 * intervalsUsed) / possIntervals;
390
+ }
391
+ }
392
+ _docker_last_read = nanoSecNow;
393
+ return cpuPercent;
394
+ }
395
+ }
396
+
397
+ function docker_calcNetworkIO(networks) {
398
+ let rx;
399
+ let wx;
400
+ for (let key in networks) {
401
+ // skip loop if the property is from prototype
402
+ if (!{}.hasOwnProperty.call(networks, key)) {
403
+ continue;
404
+ }
405
+
406
+ /**
407
+ * @namespace
408
+ * @property {number} rx_bytes
409
+ * @property {number} tx_bytes
410
+ */
411
+ const obj = networks[key];
412
+ rx = +obj.rx_bytes;
413
+ wx = +obj.tx_bytes;
414
+ }
415
+ return {
416
+ rx,
417
+ wx
418
+ };
419
+ }
420
+
421
+ function docker_calcBlockIO(blkio_stats) {
422
+ let result = {
423
+ r: 0,
424
+ w: 0
425
+ };
426
+
427
+ /**
428
+ * @namespace
429
+ * @property {Array} io_service_bytes_recursive
430
+ */
431
+ if (
432
+ blkio_stats &&
433
+ blkio_stats.io_service_bytes_recursive &&
434
+ Object.prototype.toString.call(blkio_stats.io_service_bytes_recursive) === '[object Array]' &&
435
+ blkio_stats.io_service_bytes_recursive.length > 0
436
+ ) {
437
+ blkio_stats.io_service_bytes_recursive.forEach((element) => {
438
+ /**
439
+ * @namespace
440
+ * @property {string} op
441
+ * @property {number} value
442
+ */
443
+
444
+ if (element.op && element.op.toLowerCase() === 'read' && element.value) {
445
+ result.r += element.value;
446
+ }
447
+ if (element.op && element.op.toLowerCase() === 'write' && element.value) {
448
+ result.w += element.value;
449
+ }
450
+ });
451
+ }
452
+ return result;
453
+ }
454
+
455
+ function dockerContainerStats(containerIDs, callback) {
456
+ let containerArray = [];
457
+ return new Promise((resolve) => {
458
+ process.nextTick(() => {
459
+ // fallback - if only callback is given
460
+ if (util.isFunction(containerIDs) && !callback) {
461
+ callback = containerIDs;
462
+ containerArray = ['*'];
463
+ } else {
464
+ containerIDs = containerIDs || '*';
465
+ if (typeof containerIDs !== 'string') {
466
+ if (callback) {
467
+ callback([]);
468
+ }
469
+ return resolve([]);
470
+ }
471
+ let containerIDsSanitized = '';
472
+ try {
473
+ containerIDsSanitized.__proto__.toLowerCase = util.stringToLower;
474
+ containerIDsSanitized.__proto__.replace = util.stringReplace;
475
+ containerIDsSanitized.__proto__.toString = util.stringToString;
476
+ containerIDsSanitized.__proto__.substr = util.stringSubstr;
477
+ containerIDsSanitized.__proto__.substring = util.stringSubstring;
478
+ containerIDsSanitized.__proto__.trim = util.stringTrim;
479
+ containerIDsSanitized.__proto__.startsWith = util.stringStartWith;
480
+ } catch (e) {
481
+ Object.setPrototypeOf(containerIDsSanitized, util.stringObj);
482
+ }
483
+
484
+ containerIDsSanitized = containerIDs;
485
+ containerIDsSanitized = containerIDsSanitized.trim();
486
+ if (containerIDsSanitized !== '*') {
487
+ containerIDsSanitized = '';
488
+ const s = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(containerIDs, true)).trim();
489
+ const l = util.mathMin(s.length, 2000);
490
+ for (let i = 0; i <= l; i++) {
491
+ if (s[i] !== undefined) {
492
+ s[i].__proto__.toLowerCase = util.stringToLower;
493
+ const sl = s[i].toLowerCase();
494
+ if (sl && sl[0] && !sl[1]) {
495
+ containerIDsSanitized = containerIDsSanitized + sl[0];
496
+ }
497
+ }
498
+ }
499
+ }
500
+
501
+ containerIDsSanitized = containerIDsSanitized.trim().toLowerCase().replace(/,+/g, '|');
502
+ containerArray = containerIDsSanitized.split('|');
503
+ }
504
+
505
+ const result = [];
506
+
507
+ const workload = [];
508
+ if (containerArray.length && containerArray[0].trim() === '*') {
509
+ containerArray = [];
510
+ dockerContainers().then((allContainers) => {
511
+ for (let container of allContainers) {
512
+ containerArray.push(container.id.substring(0, 12));
513
+ }
514
+ if (containerArray.length) {
515
+ dockerContainerStats(containerArray.join(',')).then((result) => {
516
+ if (callback) {
517
+ callback(result);
518
+ }
519
+ resolve(result);
520
+ });
521
+ } else {
522
+ if (callback) {
523
+ callback(result);
524
+ }
525
+ resolve(result);
526
+ }
527
+ });
528
+ } else {
529
+ for (let containerID of containerArray) {
530
+ workload.push(dockerContainerStatsSingle(containerID.trim()));
531
+ }
532
+ if (workload.length) {
533
+ Promise.all(workload).then((data) => {
534
+ if (callback) {
535
+ callback(data);
536
+ }
537
+ resolve(data);
538
+ });
539
+ } else {
540
+ if (callback) {
541
+ callback(result);
542
+ }
543
+ resolve(result);
544
+ }
545
+ }
546
+ });
547
+ });
548
+ }
549
+
550
+ // --------------------------
551
+ // container stats (for one container)
552
+
553
+ function dockerContainerStatsSingle(containerID) {
554
+ containerID = containerID || '';
555
+ const result = {
556
+ id: containerID,
557
+ memUsage: 0,
558
+ memLimit: 0,
559
+ memPercent: 0,
560
+ cpuPercent: 0,
561
+ pids: 0,
562
+ netIO: {
563
+ rx: 0,
564
+ wx: 0
565
+ },
566
+ blockIO: {
567
+ r: 0,
568
+ w: 0
569
+ },
570
+ restartCount: 0,
571
+ cpuStats: {},
572
+ precpuStats: {},
573
+ memoryStats: {},
574
+ networks: {}
575
+ };
576
+ return new Promise((resolve) => {
577
+ process.nextTick(() => {
578
+ if (containerID) {
579
+ if (!_docker_socket) {
580
+ _docker_socket = new DockerSocket();
581
+ }
582
+
583
+ _docker_socket.getInspect(containerID, (dataInspect) => {
584
+ try {
585
+ _docker_socket.getStats(containerID, (data) => {
586
+ try {
587
+ let stats = data;
588
+ if (!stats.message) {
589
+ if (data.id) {
590
+ result.id = data.id;
591
+ }
592
+ result.memUsage = stats.memory_stats && stats.memory_stats.usage ? stats.memory_stats.usage : 0;
593
+ result.memLimit = stats.memory_stats && stats.memory_stats.limit ? stats.memory_stats.limit : 0;
594
+ result.memPercent = stats.memory_stats && stats.memory_stats.usage && stats.memory_stats.limit ? (stats.memory_stats.usage / stats.memory_stats.limit) * 100.0 : 0;
595
+ result.cpuPercent = stats.cpu_stats && stats.precpu_stats ? docker_calcCPUPercent(stats.cpu_stats, stats.precpu_stats) : 0;
596
+ result.pids = stats.pids_stats && stats.pids_stats.current ? stats.pids_stats.current : 0;
597
+ result.restartCount = dataInspect.RestartCount ? dataInspect.RestartCount : 0;
598
+ if (stats.networks) {
599
+ result.netIO = docker_calcNetworkIO(stats.networks);
600
+ }
601
+ if (stats.blkio_stats) {
602
+ result.blockIO = docker_calcBlockIO(stats.blkio_stats);
603
+ }
604
+ result.cpuStats = stats.cpu_stats ? stats.cpu_stats : {};
605
+ result.precpuStats = stats.precpu_stats ? stats.precpu_stats : {};
606
+ result.memoryStats = stats.memory_stats ? stats.memory_stats : {};
607
+ result.networks = stats.networks ? stats.networks : {};
608
+ }
609
+ } catch {
610
+ util.noop();
611
+ }
612
+ // }
613
+ resolve(result);
614
+ });
615
+ } catch {
616
+ util.noop();
617
+ }
618
+ });
619
+ } else {
620
+ resolve(result);
621
+ }
622
+ });
623
+ });
624
+ }
625
+
626
+ exports.dockerContainerStats = dockerContainerStats;
627
+
628
+ // --------------------------
629
+ // container processes (for one container)
630
+
631
+ function dockerContainerProcesses(containerID, callback) {
632
+ let result = [];
633
+ return new Promise((resolve) => {
634
+ process.nextTick(() => {
635
+ containerID = containerID || '';
636
+ if (typeof containerID !== 'string') {
637
+ return resolve(result);
638
+ }
639
+ const containerIdSanitized = (util.isPrototypePolluted() ? '' : util.sanitizeShellString(containerID, true)).trim();
640
+
641
+ if (containerIdSanitized) {
642
+ if (!_docker_socket) {
643
+ _docker_socket = new DockerSocket();
644
+ }
645
+
646
+ _docker_socket.getProcesses(containerIdSanitized, (data) => {
647
+ /**
648
+ * @namespace
649
+ * @property {Array} Titles
650
+ * @property {Array} Processes
651
+ **/
652
+ try {
653
+ if (data && data.Titles && data.Processes) {
654
+ let titles = data.Titles.map(function (value) {
655
+ return value.toUpperCase();
656
+ });
657
+ let pos_pid = titles.indexOf('PID');
658
+ let pos_ppid = titles.indexOf('PPID');
659
+ let pos_pgid = titles.indexOf('PGID');
660
+ let pos_vsz = titles.indexOf('VSZ');
661
+ let pos_time = titles.indexOf('TIME');
662
+ let pos_elapsed = titles.indexOf('ELAPSED');
663
+ let pos_ni = titles.indexOf('NI');
664
+ let pos_ruser = titles.indexOf('RUSER');
665
+ let pos_user = titles.indexOf('USER');
666
+ let pos_rgroup = titles.indexOf('RGROUP');
667
+ let pos_group = titles.indexOf('GROUP');
668
+ let pos_stat = titles.indexOf('STAT');
669
+ let pos_rss = titles.indexOf('RSS');
670
+ let pos_command = titles.indexOf('COMMAND');
671
+
672
+ data.Processes.forEach((process) => {
673
+ result.push({
674
+ pidHost: pos_pid >= 0 ? process[pos_pid] : '',
675
+ ppid: pos_ppid >= 0 ? process[pos_ppid] : '',
676
+ pgid: pos_pgid >= 0 ? process[pos_pgid] : '',
677
+ user: pos_user >= 0 ? process[pos_user] : '',
678
+ ruser: pos_ruser >= 0 ? process[pos_ruser] : '',
679
+ group: pos_group >= 0 ? process[pos_group] : '',
680
+ rgroup: pos_rgroup >= 0 ? process[pos_rgroup] : '',
681
+ stat: pos_stat >= 0 ? process[pos_stat] : '',
682
+ time: pos_time >= 0 ? process[pos_time] : '',
683
+ elapsed: pos_elapsed >= 0 ? process[pos_elapsed] : '',
684
+ nice: pos_ni >= 0 ? process[pos_ni] : '',
685
+ rss: pos_rss >= 0 ? process[pos_rss] : '',
686
+ vsz: pos_vsz >= 0 ? process[pos_vsz] : '',
687
+ command: pos_command >= 0 ? process[pos_command] : ''
688
+ });
689
+ });
690
+ }
691
+ } catch {
692
+ util.noop();
693
+ }
694
+ if (callback) {
695
+ callback(result);
696
+ }
697
+ resolve(result);
698
+ });
699
+ } else {
700
+ if (callback) {
701
+ callback(result);
702
+ }
703
+ resolve(result);
704
+ }
705
+ });
706
+ });
707
+ }
708
+
709
+ exports.dockerContainerProcesses = dockerContainerProcesses;
710
+
711
+ function dockerVolumes(callback) {
712
+ let result = [];
713
+ return new Promise((resolve) => {
714
+ process.nextTick(() => {
715
+ if (!_docker_socket) {
716
+ _docker_socket = new DockerSocket();
717
+ }
718
+ _docker_socket.listVolumes((data) => {
719
+ let dockerVolumes = {};
720
+ try {
721
+ dockerVolumes = data;
722
+ if (dockerVolumes && dockerVolumes.Volumes && Object.prototype.toString.call(dockerVolumes.Volumes) === '[object Array]' && dockerVolumes.Volumes.length > 0) {
723
+ dockerVolumes.Volumes.forEach((element) => {
724
+ result.push({
725
+ name: element.Name,
726
+ driver: element.Driver,
727
+ labels: element.Labels,
728
+ mountpoint: element.Mountpoint,
729
+ options: element.Options,
730
+ scope: element.Scope,
731
+ created: element.CreatedAt ? Math.round(new Date(element.CreatedAt).getTime() / 1000) : 0
732
+ });
733
+ });
734
+ if (callback) {
735
+ callback(result);
736
+ }
737
+ resolve(result);
738
+ } else {
739
+ if (callback) {
740
+ callback(result);
741
+ }
742
+ resolve(result);
743
+ }
744
+ } catch {
745
+ if (callback) {
746
+ callback(result);
747
+ }
748
+ resolve(result);
749
+ }
750
+ });
751
+ });
752
+ });
753
+ }
754
+
755
+ exports.dockerVolumes = dockerVolumes;
756
+
757
+ function dockerAll(callback) {
758
+ return new Promise((resolve) => {
759
+ process.nextTick(() => {
760
+ dockerContainers(true).then((result) => {
761
+ if (result && Object.prototype.toString.call(result) === '[object Array]' && result.length > 0) {
762
+ let l = result.length;
763
+ result.forEach((element) => {
764
+ dockerContainerStats(element.id).then((res) => {
765
+ // include stats in array
766
+ element.memUsage = res[0].memUsage;
767
+ element.memLimit = res[0].memLimit;
768
+ element.memPercent = res[0].memPercent;
769
+ element.cpuPercent = res[0].cpuPercent;
770
+ element.pids = res[0].pids;
771
+ element.netIO = res[0].netIO;
772
+ element.blockIO = res[0].blockIO;
773
+ element.cpuStats = res[0].cpuStats;
774
+ element.precpuStats = res[0].precpuStats;
775
+ element.memoryStats = res[0].memoryStats;
776
+ element.networks = res[0].networks;
777
+
778
+ dockerContainerProcesses(element.id).then((processes) => {
779
+ element.processes = processes;
780
+
781
+ l -= 1;
782
+ if (l === 0) {
783
+ if (callback) {
784
+ callback(result);
785
+ }
786
+ resolve(result);
787
+ }
788
+ });
789
+ // all done??
790
+ });
791
+ });
792
+ } else {
793
+ if (callback) {
794
+ callback(result);
795
+ }
796
+ resolve(result);
797
+ }
798
+ });
799
+ });
800
+ });
801
+ }
802
+
803
+ exports.dockerAll = dockerAll;