@zappinginc/zm2 6.0.14

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.
Files changed (133) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/.gitattributes +4 -0
  3. package/.mocharc.js +14 -0
  4. package/CHANGELOG.md +2416 -0
  5. package/CLAUDE.md +84 -0
  6. package/CONTRIBUTING.md +124 -0
  7. package/GNU-AGPL-3.0.txt +665 -0
  8. package/LICENSE +1 -0
  9. package/README.md +248 -0
  10. package/bin/zm2 +3 -0
  11. package/bin/zm2-dev +3 -0
  12. package/bin/zm2-docker +3 -0
  13. package/bin/zm2-runtime +3 -0
  14. package/bin/zm2-windows +3 -0
  15. package/bin/zm2.ps1 +3 -0
  16. package/bun.lock +421 -0
  17. package/constants.js +114 -0
  18. package/index.js +13 -0
  19. package/lib/API/Configuration.js +212 -0
  20. package/lib/API/Containerizer.js +335 -0
  21. package/lib/API/Dashboard.js +459 -0
  22. package/lib/API/Deploy.js +117 -0
  23. package/lib/API/Extra.js +775 -0
  24. package/lib/API/ExtraMgmt/Docker.js +30 -0
  25. package/lib/API/Log.js +315 -0
  26. package/lib/API/LogManagement.js +371 -0
  27. package/lib/API/Modules/LOCAL.js +122 -0
  28. package/lib/API/Modules/Modularizer.js +148 -0
  29. package/lib/API/Modules/NPM.js +445 -0
  30. package/lib/API/Modules/TAR.js +362 -0
  31. package/lib/API/Modules/flagExt.js +46 -0
  32. package/lib/API/Modules/index.js +120 -0
  33. package/lib/API/Monit.js +247 -0
  34. package/lib/API/Serve.js +343 -0
  35. package/lib/API/Startup.js +629 -0
  36. package/lib/API/UX/helpers.js +213 -0
  37. package/lib/API/UX/index.js +9 -0
  38. package/lib/API/UX/pm2-describe.js +193 -0
  39. package/lib/API/UX/pm2-ls-minimal.js +31 -0
  40. package/lib/API/UX/pm2-ls.js +483 -0
  41. package/lib/API/Version.js +382 -0
  42. package/lib/API/interpreter.json +12 -0
  43. package/lib/API/pm2-plus/PM2IO.js +372 -0
  44. package/lib/API/pm2-plus/auth-strategies/CliAuth.js +288 -0
  45. package/lib/API/pm2-plus/auth-strategies/WebAuth.js +187 -0
  46. package/lib/API/pm2-plus/helpers.js +97 -0
  47. package/lib/API/pm2-plus/link.js +126 -0
  48. package/lib/API/pm2-plus/pres/motd +16 -0
  49. package/lib/API/pm2-plus/pres/motd.update +26 -0
  50. package/lib/API/pm2-plus/pres/welcome +28 -0
  51. package/lib/API/pm2-plus/process-selector.js +52 -0
  52. package/lib/API/schema.json +379 -0
  53. package/lib/API.js +1931 -0
  54. package/lib/Client.js +776 -0
  55. package/lib/Common.js +911 -0
  56. package/lib/Configuration.js +304 -0
  57. package/lib/Daemon.js +456 -0
  58. package/lib/Event.js +37 -0
  59. package/lib/God/ActionMethods.js +909 -0
  60. package/lib/God/ClusterMode.js +97 -0
  61. package/lib/God/ForkMode.js +297 -0
  62. package/lib/God/Methods.js +265 -0
  63. package/lib/God/Reload.js +240 -0
  64. package/lib/God.js +632 -0
  65. package/lib/HttpInterface.js +76 -0
  66. package/lib/ProcessContainer.js +305 -0
  67. package/lib/ProcessContainerBun.js +360 -0
  68. package/lib/ProcessContainerFork.js +42 -0
  69. package/lib/ProcessContainerForkBun.js +33 -0
  70. package/lib/ProcessUtils.js +55 -0
  71. package/lib/TreeKill.js +118 -0
  72. package/lib/Utility.js +430 -0
  73. package/lib/VersionCheck.js +46 -0
  74. package/lib/Watcher.js +117 -0
  75. package/lib/Worker.js +169 -0
  76. package/lib/binaries/CLI.js +1041 -0
  77. package/lib/binaries/DevCLI.js +183 -0
  78. package/lib/binaries/Runtime.js +101 -0
  79. package/lib/binaries/Runtime4Docker.js +192 -0
  80. package/lib/completion.js +229 -0
  81. package/lib/completion.sh +40 -0
  82. package/lib/motd +36 -0
  83. package/lib/templates/Dockerfiles/Dockerfile-java.tpl +7 -0
  84. package/lib/templates/Dockerfiles/Dockerfile-nodejs.tpl +8 -0
  85. package/lib/templates/Dockerfiles/Dockerfile-ruby.tpl +7 -0
  86. package/lib/templates/ecosystem-es.tpl +24 -0
  87. package/lib/templates/ecosystem-simple-es.tpl +8 -0
  88. package/lib/templates/ecosystem-simple.tpl +6 -0
  89. package/lib/templates/ecosystem.tpl +22 -0
  90. package/lib/templates/init-scripts/launchd.tpl +35 -0
  91. package/lib/templates/init-scripts/openrc.tpl +52 -0
  92. package/lib/templates/init-scripts/pm2-init-amazon.sh +86 -0
  93. package/lib/templates/init-scripts/rcd-openbsd.tpl +41 -0
  94. package/lib/templates/init-scripts/rcd.tpl +44 -0
  95. package/lib/templates/init-scripts/smf.tpl +43 -0
  96. package/lib/templates/init-scripts/systemd-online.tpl +22 -0
  97. package/lib/templates/init-scripts/systemd.tpl +22 -0
  98. package/lib/templates/init-scripts/upstart.tpl +103 -0
  99. package/lib/templates/logrotate.d/pm2 +10 -0
  100. package/lib/templates/sample-apps/http-server/README.md +14 -0
  101. package/lib/templates/sample-apps/http-server/api.js +9 -0
  102. package/lib/templates/sample-apps/http-server/ecosystem.config.js +14 -0
  103. package/lib/templates/sample-apps/http-server/package.json +11 -0
  104. package/lib/templates/sample-apps/pm2-plus-metrics-actions/README.md +45 -0
  105. package/lib/templates/sample-apps/pm2-plus-metrics-actions/custom-metrics.js +66 -0
  106. package/lib/templates/sample-apps/pm2-plus-metrics-actions/ecosystem.config.js +12 -0
  107. package/lib/templates/sample-apps/pm2-plus-metrics-actions/package.json +11 -0
  108. package/lib/templates/sample-apps/python-app/README.md +4 -0
  109. package/lib/templates/sample-apps/python-app/echo.py +7 -0
  110. package/lib/templates/sample-apps/python-app/ecosystem.config.js +12 -0
  111. package/lib/templates/sample-apps/python-app/package.json +11 -0
  112. package/lib/tools/Config.js +248 -0
  113. package/lib/tools/IsAbsolute.js +20 -0
  114. package/lib/tools/copydirSync.js +101 -0
  115. package/lib/tools/deleteFolderRecursive.js +19 -0
  116. package/lib/tools/find-package-json.js +74 -0
  117. package/lib/tools/fmt.js +72 -0
  118. package/lib/tools/isbinaryfile.js +94 -0
  119. package/lib/tools/json5.js +752 -0
  120. package/lib/tools/open.js +63 -0
  121. package/lib/tools/passwd.js +58 -0
  122. package/lib/tools/promise.min.js +1 -0
  123. package/lib/tools/sexec.js +55 -0
  124. package/lib/tools/treeify.js +113 -0
  125. package/lib/tools/which.js +120 -0
  126. package/lib/tools/xdg-open +861 -0
  127. package/package.json +219 -0
  128. package/paths.js +93 -0
  129. package/pm2 +11 -0
  130. package/preinstall.js +24 -0
  131. package/run.sh +9 -0
  132. package/types/index.d.ts +722 -0
  133. package/types/tsconfig.json +14 -0
@@ -0,0 +1,483 @@
1
+
2
+ const cst = require('../../../constants')
3
+ const Common = require('../../Common')
4
+ const Configuration = require('../../Configuration')
5
+ const UxHelpers = require('./helpers.js')
6
+ const chalk = require('ansis')
7
+ const Table = require('cli-tableau')
8
+ const Passwd = require('../../tools/passwd.js')
9
+
10
+ const List = {}
11
+
12
+ const CONDENSED_MODE = (process.stdout.columns || 300) < 134
13
+
14
+ /**
15
+ * Check if dump file contains same apps that the one managed by PM2
16
+ */
17
+ function checkIfProcessAreDumped(list) {
18
+ try {
19
+ var dump_raw = require('fs').readFileSync(cst.DUMP_FILE_PATH)
20
+ var dump = JSON.parse(dump_raw)
21
+ var apps_dumped = dump.map(proc => proc.name)
22
+ var apps_running = list
23
+ .filter(proc => proc.pm2_env.pmx_module != true)
24
+ .map(proc => proc.name)
25
+ var diff = apps_dumped.filter(a => !apps_running.includes(a))
26
+ if (diff.length > 0) {
27
+ Common.warn(`Current process list is not synchronized with saved list. App ${chalk.bold(diff.join(' '))} differs. Type 'pm2 save' to synchronize.`)
28
+ }
29
+ else if (apps_dumped.length != apps_running.length) {
30
+ Common.warn(`Current process list is not synchronized with saved list. Type 'pm2 save' to synchronize.`)
31
+ }
32
+ } catch(e) {
33
+ }
34
+ }
35
+
36
+ var proc_id = 0
37
+
38
+ /**
39
+ * List Applications and Modules managed by PM2
40
+ */
41
+ function listModulesAndAppsManaged(list, commander) {
42
+ var name_col_size = 11
43
+
44
+ if (list && list.length > 0)
45
+ name_col_size = (list.reduce((p, c) => (p.name.length > c.name.length) ? p : c)).name.length + 5
46
+
47
+ var id_width = Math.max(
48
+ 2 + (Math.max(...list.map((l) => String(l.pm2_env.pm_id || 0).length)) || 0),
49
+ 4
50
+ );
51
+
52
+ var app_head = {
53
+ id: id_width,
54
+ name: name_col_size,
55
+ namespace: 13,
56
+ version: 9,
57
+ mode: 9,
58
+ pid: 10,
59
+ uptime: 8,
60
+ '↺': 6,
61
+ status: 11,
62
+ cpu: 10,
63
+ mem: 10,
64
+ user: 10,
65
+ watching: 10
66
+ }
67
+
68
+ var mod_head = {
69
+ id: id_width,
70
+ module: 30,
71
+ version: 15,
72
+ pid: 10,
73
+ status: 10,
74
+ '↺': 6,
75
+ cpu: 10,
76
+ mem: 10,
77
+ user: 10
78
+ }
79
+
80
+ if (CONDENSED_MODE) {
81
+ app_head = {
82
+ id: id_width,
83
+ name: 20,
84
+ mode: 10,
85
+ '↺': 6,
86
+ status: 11,
87
+ cpu: 10,
88
+ memory: 10
89
+ }
90
+
91
+ mod_head = {
92
+ id: id_width,
93
+ name: 20,
94
+ status: 10,
95
+ cpu: 10,
96
+ mem: 10
97
+ }
98
+ }
99
+
100
+ var app_table = new Table({
101
+ head : Object.keys(app_head),
102
+ colWidths: Object.keys(app_head).map(k => app_head[k]),
103
+ colAligns : ['left'],
104
+ style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
105
+ })
106
+
107
+ var module_table = new Table({
108
+ head : Object.keys(mod_head),
109
+ colWidths: Object.keys(mod_head).map(k => mod_head[k]),
110
+ colAligns : ['left'],
111
+ style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
112
+ })
113
+
114
+ var sortField = 'name', sortOrder = 'asc', sort,
115
+ fields = {
116
+ name: 'pm2_env.name',
117
+ namespace: 'pm2_env.namespace',
118
+ pid: 'pid',
119
+ id: 'pm_id',
120
+ cpu: 'monit.cpu',
121
+ memory: 'monit.memory',
122
+ uptime: 'pm2_env.pm_uptime',
123
+ status: 'pm2_env.status'
124
+ }
125
+
126
+ if (commander && commander.sort) {
127
+ sort = commander.sort.split(':');
128
+
129
+ if(fields[sort[0].toLowerCase()]) {
130
+ sortField = sort[0].toLowerCase();
131
+ sortOrder = sort.length === 2 ? sort[1] : 'asc';
132
+ }
133
+ }
134
+
135
+ list.sort(function(a, b) {
136
+ var fieldA = UxHelpers.getNestedProperty(fields[sortField], a)
137
+ var fieldB = UxHelpers.getNestedProperty(fields[sortField], b)
138
+
139
+ if (sortOrder === 'desc') {
140
+ if (fieldA > fieldB)
141
+ return -1
142
+ if (fieldA < fieldB)
143
+ return 1
144
+ } else {
145
+ if (fieldA < fieldB)
146
+ return -1
147
+ if (fieldA > fieldB)
148
+ return 1
149
+ }
150
+ return 0
151
+ })
152
+
153
+ list.forEach(function(l) {
154
+ var obj = {}
155
+
156
+ if (l.pm2_env.pm_id > proc_id) {
157
+ proc_id = l.pm2_env.pm_id
158
+ }
159
+
160
+ var mode = l.pm2_env.exec_mode
161
+ var status = l.pm2_env.status
162
+ var key = l.pm2_env.pm_id
163
+ key = chalk.bold.cyan(key)
164
+
165
+ if (l.pm2_env.axm_options) {
166
+ var is_tracing_enabled = false
167
+
168
+ if (l.pm2_env.axm_options.tracing &&
169
+ typeof(l.pm2_env.axm_options.tracing) == 'boolean' &&
170
+ l.pm2_env.axm_options.tracing == true)
171
+ is_tracing_enabled = true
172
+
173
+ if (l.pm2_env.axm_options.tracing &&
174
+ l.pm2_env.axm_options.tracing.enabled &&
175
+ typeof(l.pm2_env.axm_options.tracing.enabled) == 'boolean' &&
176
+ l.pm2_env.axm_options.tracing.enabled == true)
177
+ is_tracing_enabled = true
178
+
179
+ if (is_tracing_enabled == true)
180
+ l.pm2_env.name = chalk.green('☵') + ' ' + l.pm2_env.name
181
+
182
+ if (l.pm2_env._km_monitored)
183
+ l.pm2_env.name = chalk.bold.green('◉') + ' ' + l.pm2_env.name
184
+ }
185
+
186
+ if (l.pm2_env.pmx_module == true) {
187
+ if (l.pm2_env.name == 'pm2-sysmonit') return
188
+ // pm2 ls for Modules
189
+ obj[key] = []
190
+
191
+ obj[key].push(l.name)
192
+
193
+ // Module version + PID
194
+ if (!CONDENSED_MODE) {
195
+ var pid = l.pm2_env.axm_options.pid ? l.pm2_env.axm_options.pid : l.pid
196
+ obj[key].push(l.pm2_env.version || 'N/A', pid)
197
+ }
198
+
199
+ // Status
200
+ obj[key].push(UxHelpers.colorStatus(status))
201
+
202
+ // Restart
203
+ if (!CONDENSED_MODE)
204
+ obj[key].push(l.pm2_env.restart_time ? l.pm2_env.restart_time : 0)
205
+
206
+ // CPU + Memory
207
+ obj[key].push(l.monit ? (l.monit.cpu + '%') : 'N/A', l.monit ? UxHelpers.bytesToSize(l.monit.memory, 1) : 'N/A' )
208
+
209
+ // User
210
+ if (!CONDENSED_MODE) {
211
+
212
+ if (l.pm2_env.uid && typeof(l.pm2_env.uid) == 'number') {
213
+ // Resolve user id to username
214
+ let users = Passwd.getUsers()
215
+ Object.keys(users).forEach(function(username) {
216
+ var user = users[username]
217
+ if (user.userId == l.pm2_env.uid) {
218
+ l.pm2_env.uid = user.username
219
+ }
220
+ })
221
+ }
222
+ obj[key].push(chalk.bold(l.pm2_env.uid || l.pm2_env.username))
223
+ }
224
+
225
+ UxHelpers.safe_push(module_table, obj)
226
+ }
227
+ else {
228
+ // pm2 ls for Applications
229
+ obj[key] = []
230
+
231
+ // PM2 ID
232
+ obj[key].push(l.pm2_env.name)
233
+
234
+ // Namespace
235
+ if (!CONDENSED_MODE)
236
+ obj[key].push(l.pm2_env.namespace)
237
+
238
+ // Version
239
+ if (!CONDENSED_MODE)
240
+ obj[key].push(l.pm2_env.version)
241
+
242
+ // Exec mode
243
+ obj[key].push(mode == 'fork_mode' ? chalk.inverse.bold('fork') : chalk.blue.bold('cluster'))
244
+
245
+ // PID
246
+ if (!CONDENSED_MODE)
247
+ obj[key].push(l.pid)
248
+
249
+ // Uptime
250
+ if (!CONDENSED_MODE)
251
+ obj[key].push((l.pm2_env.pm_uptime && status == 'online') ? UxHelpers.timeSince(l.pm2_env.pm_uptime) : 0)
252
+
253
+ // Restart
254
+ obj[key].push(l.pm2_env.restart_time ? l.pm2_env.restart_time : 0)
255
+
256
+ // Status
257
+ obj[key].push(UxHelpers.colorStatus(status))
258
+
259
+
260
+ // CPU
261
+ obj[key].push(l.monit ? l.monit.cpu + '%' : 'N/A')
262
+
263
+ // Memory
264
+ obj[key].push(l.monit ? UxHelpers.bytesToSize(l.monit.memory, 1) : 'N/A')
265
+
266
+ // User
267
+ if (!CONDENSED_MODE) {
268
+ if (l.pm2_env.uid && typeof(l.pm2_env.uid) == 'number') {
269
+ // Resolve user id to username
270
+ let users = Passwd.getUsers()
271
+ Object.keys(users).forEach(function(username) {
272
+ var user = users[username]
273
+ if (user.userId == l.pm2_env.uid) {
274
+ l.pm2_env.uid = user.username
275
+ }
276
+ })
277
+ }
278
+ obj[key].push(chalk.bold(l.pm2_env.uid || l.pm2_env.username))
279
+ }
280
+
281
+ // Watch status
282
+ if (!CONDENSED_MODE)
283
+ obj[key].push(l.pm2_env.watch ? chalk.green.bold('enabled') : chalk.gray('disabled'))
284
+
285
+ UxHelpers.safe_push(app_table, obj)
286
+ }
287
+
288
+ })
289
+
290
+ // Print Applications Managed
291
+ console.log(app_table.toString())
292
+
293
+ // Print Modules Managed
294
+ if (module_table.length > 0) {
295
+ console.log(chalk.bold(`Module${module_table.length > 1 ? 's' : ''}`))
296
+ console.log(module_table.toString())
297
+ }
298
+
299
+ proc_id++
300
+ }
301
+
302
+ // Container display
303
+ function containersListing(sys_infos) {
304
+ var stacked_docker = (process.stdout.columns || 100) < 140
305
+
306
+ var docker_head = {
307
+ id: 4,
308
+ image: 50,
309
+ status: 10,
310
+ '↺': 6,
311
+ cpu: 10,
312
+ mem: 10,
313
+ 'net I/O ⇵': 11,
314
+ 'fs I/O ⇵': 11
315
+ }
316
+
317
+ if (stacked_docker) {
318
+ docker_head = {
319
+ id: 4,
320
+ image: 25,
321
+ status: 10,
322
+ cpu: 10,
323
+ mem: 10
324
+ }
325
+ }
326
+
327
+ var docker_table = new Table({
328
+ colWidths: Object.keys(docker_head).map(k => docker_head[k]),
329
+ head : Object.keys(docker_head),
330
+ colAligns : ['left'],
331
+ style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
332
+ })
333
+
334
+ sys_infos.containers.forEach((c) => {
335
+ var cpu = c.stats.cpu_percent
336
+ var mem = c.stats.mem_percent == 0 ? '0' : c.stats.mem_percent
337
+ var id = chalk.bold.cyan(proc_id++)
338
+ var state = UxHelpers.colorStatus(c.state)
339
+
340
+ if (stacked_docker)
341
+ docker_table.push([id, c.image, state, `${cpu}%`, `${mem}mb`])
342
+ else {
343
+ docker_table.push([
344
+ id,
345
+ c.image,
346
+ state,
347
+ c.restartCount,
348
+ `${cpu == 0 ? '0' : cpu}%`,
349
+ `${mem}mb`,
350
+ `${c.stats.netIO.rx}/${isNaN(c.stats.netIO.tx) == true ? '0.0' : c.stats.netIO.tx}`,
351
+ `${c.stats.blockIO.r}/${c.stats.blockIO.w}`
352
+ ])
353
+ }
354
+ })
355
+
356
+ console.log(chalk.bold(`Container${sys_infos.containers.length > 1 ? 's' : ''}`))
357
+ console.log(docker_table.toString())
358
+ }
359
+
360
+ /**
361
+ * High resource processes
362
+ */
363
+ function listHighResourcesProcesses(sys_infos) {
364
+ const CPU_MIN_SHOW = 60
365
+ const MEM_MIN_SHOW = 30
366
+
367
+ var sys_proc_head = ['id', 'cmd', 'pid', 'cpu', 'mem', 'uid']
368
+
369
+ var sys_proc_table = new Table({
370
+ colWidths: [4, CONDENSED_MODE ? 29 : 77, 10, 10, 10, 8],
371
+ head : sys_proc_head,
372
+ colAligns : ['left'],
373
+ style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true}
374
+ })
375
+
376
+ sys_infos.processes.cpu_sorted = sys_infos.processes.cpu_sorted.filter((proc) => {
377
+ return proc.cpu > CPU_MIN_SHOW && proc.cmd.includes('node') === false &&
378
+ proc.cmd.includes('God Daemon') === false
379
+ })
380
+
381
+ sys_infos.processes.cpu_sorted.forEach(proc => {
382
+ var cpu = `${UxHelpers.colorizedMetric(proc.cpu, 40, 70, '%')}`
383
+ var mem = `${UxHelpers.colorizedMetric(proc.memory, 40, 70, '%')}`
384
+ var cmd = proc.cmd
385
+ sys_proc_table.push([chalk.bold.cyan(proc_id++), cmd, proc.pid, cpu, mem, proc.uid])
386
+ })
387
+
388
+ sys_infos.processes.mem_sorted = sys_infos.processes.mem_sorted.filter((proc) => {
389
+ return proc.memory > MEM_MIN_SHOW && proc.cmd.includes('node') == false
390
+ })
391
+
392
+ sys_infos.processes.mem_sorted.forEach((proc) => {
393
+ var cpu = `${UxHelpers.colorizedMetric(proc.cpu, 40, 70, '%')}`
394
+ var mem = `${UxHelpers.colorizedMetric(proc.memory, 40, 70, '%')}`
395
+ var cmd = proc.cmd
396
+ // if (proc.cmd.length > 50)
397
+ // cmd = '…' + proc.cmd.slice(proc.cmd.length - 48, proc.cmd.length)
398
+ sys_proc_table.push([chalk.bold.cyan(proc_id++), cmd, proc.pid, cpu, mem, proc.uid])
399
+ })
400
+
401
+ if (sys_infos.processes.cpu_sorted.length >= 1 || sys_infos.processes.mem_sorted.length >= 1) {
402
+ console.log(chalk.bold('Intensive Processes'))
403
+ console.log(sys_proc_table.toString())
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Sys info line
409
+ */
410
+ function miniMonitBar(sys_infos) {
411
+ let sys_metrics = sys_infos.pm2_env.axm_monitor
412
+
413
+ let cpu = sys_metrics['CPU Usage']
414
+
415
+ if (typeof(cpu) == 'undefined') return
416
+
417
+ var sys_summary_line = `${chalk.bold.cyan('host metrics')} `
418
+ sys_summary_line += `| ${chalk.bold('cpu')}: ${UxHelpers.colorizedMetric(cpu.value, 40, 70, '%')}`
419
+
420
+ let temp = sys_metrics['CPU Temperature'].value
421
+ if (temp && temp != '-1') {
422
+ sys_summary_line += ` ${UxHelpers.colorizedMetric(temp, 50, 70, 'º')}`
423
+ }
424
+
425
+ let mem_total = sys_metrics['RAM Total'].value
426
+ let mem_available = sys_metrics['RAM Available'].value
427
+
428
+ if (mem_total) {
429
+ var perc_mem_usage = (((mem_available) / mem_total) * 100).toFixed(1)
430
+ sys_summary_line += ` | ${chalk.bold('mem free')}: ${UxHelpers.colorizedMetric(perc_mem_usage, 30, 10, '%')} `
431
+ }
432
+
433
+ let interfaces = Object.keys(sys_metrics).filter(m => m.includes('net') && m != 'net:default').map(i => i.split(':')[2]).filter((iface, i, self) => self.indexOf(iface) === i)
434
+
435
+ interfaces.forEach(iface => {
436
+ if (!sys_metrics[`net:rx_5:${iface}`]) return
437
+ sys_summary_line += `| ${chalk.bold(iface)}: `
438
+ sys_summary_line += `⇓ ${UxHelpers.colorizedMetric(sys_metrics[`net:rx_5:${iface}`].value, 10, 20, 'mb/s')} `
439
+ sys_summary_line += `⇑ ${UxHelpers.colorizedMetric(sys_metrics[`net:tx_5:${iface}`].value, 10, 20, 'mb/s')} `
440
+ })
441
+
442
+ if (CONDENSED_MODE == false) {
443
+ let read = sys_metrics['Disk Reads'].value
444
+ let write = sys_metrics['Disk Writes'].value
445
+
446
+ sys_summary_line += `| ${chalk.bold('disk')}: ⇓ ${UxHelpers.colorizedMetric(read, 10, 20, 'mb/s')}`
447
+ sys_summary_line += ` ⇑ ${UxHelpers.colorizedMetric(write, 10, 20, 'mb/s')} `
448
+
449
+ let disks = Object.keys(sys_metrics).filter(m => m.includes('fs:')).map(i => i.split(':')[2]).filter((iface, i, self) => self.indexOf(iface) === i)
450
+ var disk_nb = 0
451
+
452
+ disks.forEach(fs => {
453
+ let use = sys_metrics[`fs:use:${fs}`].value
454
+ if (use > 60)
455
+ sys_summary_line += `${chalk.gray(fs)} ${UxHelpers.colorizedMetric(use, 80, 90, '%')} `
456
+ })
457
+ }
458
+
459
+ sys_summary_line += '|'
460
+ console.log(sys_summary_line)
461
+ }
462
+
463
+ /**
464
+ * pm2 ls
465
+ * @method dispAsTable
466
+ * @param {Object} list
467
+ * @param {Object} system informations (via pm2 sysmonit/pm2 sysinfos)
468
+ */
469
+ module.exports = function(list, commander) {
470
+ var pm2_conf = Configuration.getSync('pm2')
471
+
472
+ if (!list)
473
+ return console.log('list empty')
474
+
475
+ listModulesAndAppsManaged(list, commander)
476
+
477
+ let sysmonit = list.filter(proc => proc.name == 'pm2-sysmonit')
478
+ if (sysmonit && sysmonit[0])
479
+ miniMonitBar(sysmonit[0])
480
+
481
+ // Disable warning message of process list not saved
482
+ //checkIfProcessAreDumped(list)
483
+ }