@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
package/lib/Watcher.js ADDED
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Copyright 2013-2022 the PM2 project authors. All rights reserved.
3
+ * Use of this source code is governed by a license that
4
+ * can be found in the LICENSE file.
5
+ */
6
+ var chokidar = require('chokidar');
7
+ var util = require('util');
8
+ var log = require('debug')('zm2:watch');
9
+
10
+ module.exports = function ClusterMode(God) {
11
+ /**
12
+ * Watch folder for changes and restart
13
+ * @method watch
14
+ * @param {Object} pm2_env pm2 app environnement
15
+ * @return MemberExpression
16
+ */
17
+ God.watch = {};
18
+
19
+ God.watch._watchers = {};
20
+
21
+ God.watch.enable = function(pm2_env) {
22
+ if (God.watch._watchers[pm2_env.pm_id]) {
23
+ God.watch._watchers[pm2_env.pm_id].close();
24
+ God.watch._watchers[pm2_env.pm_id] = null;
25
+ delete God.watch._watchers[pm2_env.pm_id];
26
+ }
27
+
28
+ log('Initial watch ', pm2_env.watch)
29
+
30
+ var watch = pm2_env.watch
31
+
32
+ if(typeof watch == 'boolean' || Array.isArray(watch) && watch.length === 0)
33
+ watch = pm2_env.pm_cwd;
34
+
35
+ log('Watching %s', watch);
36
+
37
+ var watch_options = {
38
+ ignored : pm2_env.ignore_watch || /[\/\\]\.|node_modules/,
39
+ persistent : true,
40
+ ignoreInitial : true,
41
+ cwd: pm2_env.pm_cwd
42
+ };
43
+
44
+ if (pm2_env.watch_options) {
45
+ watch_options = Object.assign(watch_options, pm2_env.watch_options);
46
+ }
47
+
48
+ log('Watch opts', watch_options);
49
+
50
+ var watcher = chokidar.watch(watch, watch_options);
51
+
52
+ console.log('[Watch] Start watching', pm2_env.name);
53
+
54
+ watcher.on('all', function(event, path) {
55
+ var self = this;
56
+
57
+ if (self.restarting === true) {
58
+ log('Already restarting, skipping');
59
+ return false;
60
+ }
61
+
62
+ self.restarting = true;
63
+
64
+ console.log('Change detected on path %s for app %s - restarting', path, pm2_env.name);
65
+
66
+ setTimeout(function() {
67
+ God.restartProcessName(pm2_env.name, function(err, list) {
68
+ self.restarting = false;
69
+
70
+ if (err) {
71
+ log('Error while restarting', err);
72
+ return false;
73
+ }
74
+
75
+ return log('Process restarted');
76
+ });
77
+ }, (pm2_env.watch_delay || 0));
78
+
79
+ return false;
80
+ });
81
+
82
+ watcher.on('error', function(e) {
83
+ console.error(e.stack || e);
84
+ });
85
+
86
+ God.watch._watchers[pm2_env.pm_id] = watcher;
87
+
88
+ //return God.watch._watchers[pm2_env.name];
89
+ },
90
+ /**
91
+ * Description
92
+ * @method close
93
+ * @param {} id
94
+ * @return
95
+ */
96
+ God.watch.disableAll = function() {
97
+ var watchers = God.watch._watchers;
98
+
99
+ console.log('[Watch] PM2 is being killed. Watch is disabled to avoid conflicts');
100
+ for (var i in watchers) {
101
+ watchers[i].close && watchers[i].close();
102
+ watchers.splice(i, 1);
103
+ }
104
+ },
105
+
106
+ God.watch.disable = function(pm2_env) {
107
+ var watcher = God.watch._watchers[pm2_env.pm_id]
108
+ if (watcher) {
109
+ console.log('[Watch] Stop watching', pm2_env.name);
110
+ watcher.close();
111
+ delete God.watch._watchers[pm2_env.pm_id];
112
+ return true;
113
+ } else {
114
+ return false;
115
+ }
116
+ }
117
+ };
package/lib/Worker.js ADDED
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Copyright 2013-2022 the PM2 project authors. All rights reserved.
3
+ * Use of this source code is governed by a license that
4
+ * can be found in the LICENSE file.
5
+ */
6
+ const eachLimit = require('async/eachLimit');
7
+ const debug = require('debug')('zm2:worker');
8
+ const domain = require('domain');
9
+ const Cron = require('croner');
10
+ const pkg = require('../package.json');
11
+
12
+ var cst = require('../constants.js');
13
+ var vCheck = require('./VersionCheck.js')
14
+
15
+ module.exports = function(God) {
16
+ var timer = null;
17
+
18
+ God.CronJobs = new Map();
19
+ God.Worker = {};
20
+ God.Worker.is_running = false;
21
+
22
+ God.getCronID = function(pm_id) {
23
+ return `cron-${pm_id}`
24
+ }
25
+
26
+ God.registerCron = function(pm2_env) {
27
+ if (!pm2_env ||
28
+ pm2_env.pm_id === undefined ||
29
+ !pm2_env.cron_restart ||
30
+ pm2_env.cron_restart == '0' ||
31
+ God.CronJobs.has(God.getCronID(pm2_env.pm_id)))
32
+ return;
33
+
34
+ var pm_id = pm2_env.pm_id
35
+ console.log('[PM2][WORKER] Registering a cron job on:', pm_id);
36
+
37
+ var job = Cron(pm2_env.cron_restart, function() {
38
+ God.restartProcessId({id: pm_id}, function(err, data) {
39
+ if (err)
40
+ console.error(err.stack || err);
41
+ return;
42
+ });
43
+ });
44
+
45
+ God.CronJobs.set(God.getCronID(pm_id), job);
46
+ }
47
+
48
+
49
+ /**
50
+ * Deletes the cron job on deletion of process
51
+ */
52
+ God.deleteCron = function(id) {
53
+ if (typeof(id) !== 'undefined' && God.CronJobs.has(God.getCronID(id)) === false)
54
+ return;
55
+ console.log('[PM2] Deregistering a cron job on:', id);
56
+ var job = God.CronJobs.get(God.getCronID(id));
57
+
58
+ if (job)
59
+ job.stop();
60
+
61
+ God.CronJobs.delete(God.getCronID(id));
62
+ };
63
+
64
+ var _getProcessById = function(pm_id) {
65
+ var proc = God.clusters_db[pm_id];
66
+ return proc ? proc : null;
67
+ };
68
+
69
+
70
+ var maxMemoryRestart = function(proc_key, cb) {
71
+ var proc = _getProcessById(proc_key.pm2_env.pm_id);
72
+
73
+ if (!(proc &&
74
+ proc.pm2_env &&
75
+ proc_key.monit))
76
+ return cb();
77
+
78
+ if (proc_key.monit.memory !== undefined &&
79
+ proc.pm2_env.max_memory_restart !== undefined &&
80
+ proc.pm2_env.max_memory_restart < proc_key.monit.memory &&
81
+ proc.pm2_env.axm_options &&
82
+ proc.pm2_env.axm_options.pid === undefined) {
83
+ console.log('[PM2][WORKER] Process %s restarted because it exceeds --max-memory-restart value (current_memory=%s max_memory_limit=%s [octets])', proc.pm2_env.pm_id, proc_key.monit.memory, proc.pm2_env.max_memory_restart);
84
+ God.reloadProcessId({
85
+ id : proc.pm2_env.pm_id
86
+ }, function(err, data) {
87
+ if (err)
88
+ console.error(err.stack || err);
89
+ return cb();
90
+ });
91
+ }
92
+ else {
93
+ return cb();
94
+ }
95
+ };
96
+
97
+ var tasks = function() {
98
+ if (God.Worker.is_running === true) {
99
+ debug('[PM2][WORKER] Worker is already running, skipping this round');
100
+ return false;
101
+ }
102
+ God.Worker.is_running = true;
103
+
104
+ God.getMonitorData(null, function(err, data) {
105
+ if (err || !data || typeof(data) !== 'object') {
106
+ God.Worker.is_running = false;
107
+ return console.error(err);
108
+ }
109
+
110
+ eachLimit(data, 1, function(proc, next) {
111
+ if (!proc || !proc.pm2_env || proc.pm2_env.pm_id === undefined)
112
+ return next();
113
+
114
+ debug('[PM2][WORKER] Processing proc id:', proc.pm2_env.pm_id);
115
+
116
+ // Reset restart delay if application has an uptime of more > 30secs
117
+ if (proc.pm2_env.exp_backoff_restart_delay !== undefined &&
118
+ proc.pm2_env.prev_restart_delay && proc.pm2_env.prev_restart_delay > 0) {
119
+ var app_uptime = Date.now() - proc.pm2_env.pm_uptime
120
+ if (app_uptime > cst.EXP_BACKOFF_RESET_TIMER) {
121
+ var ref_proc = _getProcessById(proc.pm2_env.pm_id);
122
+ ref_proc.pm2_env.prev_restart_delay = 0
123
+ console.log(`[PM2][WORKER] Reset the restart delay, as app ${proc.name} has been up for more than ${cst.EXP_BACKOFF_RESET_TIMER}ms`)
124
+ }
125
+ }
126
+
127
+ // Check if application has reached memory threshold
128
+ maxMemoryRestart(proc, function() {
129
+ return next();
130
+ });
131
+ }, function(err) {
132
+ God.Worker.is_running = false;
133
+ debug('[PM2][WORKER] My job here is done, next job in %d seconds', parseInt(cst.WORKER_INTERVAL / 1000));
134
+ });
135
+ });
136
+ };
137
+
138
+ var wrappedTasks = function() {
139
+ var d = domain.create();
140
+
141
+ d.once('error', function(err) {
142
+ console.error('[PM2][WORKER] Error caught by domain:\n' + (err.stack || err));
143
+ God.Worker.is_running = false;
144
+ });
145
+
146
+ d.run(function() {
147
+ tasks();
148
+ });
149
+ };
150
+
151
+
152
+ God.Worker.start = function() {
153
+ timer = setInterval(wrappedTasks, cst.WORKER_INTERVAL);
154
+
155
+ if (!process.env.PM2_DISABLE_VERSION_CHECK) {
156
+ setInterval(() => {
157
+ vCheck({
158
+ state: 'check',
159
+ version: pkg.version,
160
+ });
161
+ }, 1000 * 60 * 60 * 24);
162
+ }
163
+ };
164
+
165
+ God.Worker.stop = function() {
166
+ if (timer !== null)
167
+ clearInterval(timer);
168
+ };
169
+ };