@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.
- package/.claude/settings.local.json +8 -0
- package/.gitattributes +4 -0
- package/.mocharc.js +14 -0
- package/CHANGELOG.md +2416 -0
- package/CLAUDE.md +84 -0
- package/CONTRIBUTING.md +124 -0
- package/GNU-AGPL-3.0.txt +665 -0
- package/LICENSE +1 -0
- package/README.md +248 -0
- package/bin/zm2 +3 -0
- package/bin/zm2-dev +3 -0
- package/bin/zm2-docker +3 -0
- package/bin/zm2-runtime +3 -0
- package/bin/zm2-windows +3 -0
- package/bin/zm2.ps1 +3 -0
- package/bun.lock +421 -0
- package/constants.js +114 -0
- package/index.js +13 -0
- package/lib/API/Configuration.js +212 -0
- package/lib/API/Containerizer.js +335 -0
- package/lib/API/Dashboard.js +459 -0
- package/lib/API/Deploy.js +117 -0
- package/lib/API/Extra.js +775 -0
- package/lib/API/ExtraMgmt/Docker.js +30 -0
- package/lib/API/Log.js +315 -0
- package/lib/API/LogManagement.js +371 -0
- package/lib/API/Modules/LOCAL.js +122 -0
- package/lib/API/Modules/Modularizer.js +148 -0
- package/lib/API/Modules/NPM.js +445 -0
- package/lib/API/Modules/TAR.js +362 -0
- package/lib/API/Modules/flagExt.js +46 -0
- package/lib/API/Modules/index.js +120 -0
- package/lib/API/Monit.js +247 -0
- package/lib/API/Serve.js +343 -0
- package/lib/API/Startup.js +629 -0
- package/lib/API/UX/helpers.js +213 -0
- package/lib/API/UX/index.js +9 -0
- package/lib/API/UX/pm2-describe.js +193 -0
- package/lib/API/UX/pm2-ls-minimal.js +31 -0
- package/lib/API/UX/pm2-ls.js +483 -0
- package/lib/API/Version.js +382 -0
- package/lib/API/interpreter.json +12 -0
- package/lib/API/pm2-plus/PM2IO.js +372 -0
- package/lib/API/pm2-plus/auth-strategies/CliAuth.js +288 -0
- package/lib/API/pm2-plus/auth-strategies/WebAuth.js +187 -0
- package/lib/API/pm2-plus/helpers.js +97 -0
- package/lib/API/pm2-plus/link.js +126 -0
- package/lib/API/pm2-plus/pres/motd +16 -0
- package/lib/API/pm2-plus/pres/motd.update +26 -0
- package/lib/API/pm2-plus/pres/welcome +28 -0
- package/lib/API/pm2-plus/process-selector.js +52 -0
- package/lib/API/schema.json +379 -0
- package/lib/API.js +1931 -0
- package/lib/Client.js +776 -0
- package/lib/Common.js +911 -0
- package/lib/Configuration.js +304 -0
- package/lib/Daemon.js +456 -0
- package/lib/Event.js +37 -0
- package/lib/God/ActionMethods.js +909 -0
- package/lib/God/ClusterMode.js +97 -0
- package/lib/God/ForkMode.js +297 -0
- package/lib/God/Methods.js +265 -0
- package/lib/God/Reload.js +240 -0
- package/lib/God.js +632 -0
- package/lib/HttpInterface.js +76 -0
- package/lib/ProcessContainer.js +305 -0
- package/lib/ProcessContainerBun.js +360 -0
- package/lib/ProcessContainerFork.js +42 -0
- package/lib/ProcessContainerForkBun.js +33 -0
- package/lib/ProcessUtils.js +55 -0
- package/lib/TreeKill.js +118 -0
- package/lib/Utility.js +430 -0
- package/lib/VersionCheck.js +46 -0
- package/lib/Watcher.js +117 -0
- package/lib/Worker.js +169 -0
- package/lib/binaries/CLI.js +1041 -0
- package/lib/binaries/DevCLI.js +183 -0
- package/lib/binaries/Runtime.js +101 -0
- package/lib/binaries/Runtime4Docker.js +192 -0
- package/lib/completion.js +229 -0
- package/lib/completion.sh +40 -0
- package/lib/motd +36 -0
- package/lib/templates/Dockerfiles/Dockerfile-java.tpl +7 -0
- package/lib/templates/Dockerfiles/Dockerfile-nodejs.tpl +8 -0
- package/lib/templates/Dockerfiles/Dockerfile-ruby.tpl +7 -0
- package/lib/templates/ecosystem-es.tpl +24 -0
- package/lib/templates/ecosystem-simple-es.tpl +8 -0
- package/lib/templates/ecosystem-simple.tpl +6 -0
- package/lib/templates/ecosystem.tpl +22 -0
- package/lib/templates/init-scripts/launchd.tpl +35 -0
- package/lib/templates/init-scripts/openrc.tpl +52 -0
- package/lib/templates/init-scripts/pm2-init-amazon.sh +86 -0
- package/lib/templates/init-scripts/rcd-openbsd.tpl +41 -0
- package/lib/templates/init-scripts/rcd.tpl +44 -0
- package/lib/templates/init-scripts/smf.tpl +43 -0
- package/lib/templates/init-scripts/systemd-online.tpl +22 -0
- package/lib/templates/init-scripts/systemd.tpl +22 -0
- package/lib/templates/init-scripts/upstart.tpl +103 -0
- package/lib/templates/logrotate.d/pm2 +10 -0
- package/lib/templates/sample-apps/http-server/README.md +14 -0
- package/lib/templates/sample-apps/http-server/api.js +9 -0
- package/lib/templates/sample-apps/http-server/ecosystem.config.js +14 -0
- package/lib/templates/sample-apps/http-server/package.json +11 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/README.md +45 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/custom-metrics.js +66 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/ecosystem.config.js +12 -0
- package/lib/templates/sample-apps/pm2-plus-metrics-actions/package.json +11 -0
- package/lib/templates/sample-apps/python-app/README.md +4 -0
- package/lib/templates/sample-apps/python-app/echo.py +7 -0
- package/lib/templates/sample-apps/python-app/ecosystem.config.js +12 -0
- package/lib/templates/sample-apps/python-app/package.json +11 -0
- package/lib/tools/Config.js +248 -0
- package/lib/tools/IsAbsolute.js +20 -0
- package/lib/tools/copydirSync.js +101 -0
- package/lib/tools/deleteFolderRecursive.js +19 -0
- package/lib/tools/find-package-json.js +74 -0
- package/lib/tools/fmt.js +72 -0
- package/lib/tools/isbinaryfile.js +94 -0
- package/lib/tools/json5.js +752 -0
- package/lib/tools/open.js +63 -0
- package/lib/tools/passwd.js +58 -0
- package/lib/tools/promise.min.js +1 -0
- package/lib/tools/sexec.js +55 -0
- package/lib/tools/treeify.js +113 -0
- package/lib/tools/which.js +120 -0
- package/lib/tools/xdg-open +861 -0
- package/package.json +219 -0
- package/paths.js +93 -0
- package/pm2 +11 -0
- package/preinstall.js +24 -0
- package/run.sh +9 -0
- package/types/index.d.ts +722 -0
- package/types/tsconfig.json +14 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const fs = require('fs');
|
|
3
|
+
const os = require('os');
|
|
4
|
+
const spawn = require('child_process').spawn;
|
|
5
|
+
const chalk = require('ansis');
|
|
6
|
+
|
|
7
|
+
const readline = require('readline')
|
|
8
|
+
const which = require('../../tools/which.js')
|
|
9
|
+
const sexec = require('../../tools/sexec.js')
|
|
10
|
+
const copydirSync = require('../../tools/copydirSync.js')
|
|
11
|
+
const deleteFolderRecursive = require('../../tools/deleteFolderRecursive.js')
|
|
12
|
+
|
|
13
|
+
var Configuration = require('../../Configuration.js');
|
|
14
|
+
var cst = require('../../../constants.js');
|
|
15
|
+
var Common = require('../../Common');
|
|
16
|
+
var Utility = require('../../Utility.js');
|
|
17
|
+
|
|
18
|
+
module.exports = {
|
|
19
|
+
install,
|
|
20
|
+
uninstall,
|
|
21
|
+
start,
|
|
22
|
+
publish,
|
|
23
|
+
generateSample,
|
|
24
|
+
localStart,
|
|
25
|
+
getModuleConf
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* PM2 Module System.
|
|
30
|
+
* Features:
|
|
31
|
+
* - Installed modules are listed separately from user applications
|
|
32
|
+
* - Always ON, a module is always up along PM2, to stop it, you need to uninstall it
|
|
33
|
+
* - Install a runnable module from NPM/Github/HTTP (require a package.json only)
|
|
34
|
+
* - Some modules add internal PM2 depencencies (like typescript, profiling...)
|
|
35
|
+
* - Internally it uses NPM install (https://docs.npmjs.com/cli/install)
|
|
36
|
+
* - Auto discover script to launch (first it checks the apps field, then bin and finally main attr)
|
|
37
|
+
* - Generate sample module via pm2 module:generate <module_name>
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
function localStart(PM2, opts, cb) {
|
|
41
|
+
var proc_path = '',
|
|
42
|
+
cmd = '',
|
|
43
|
+
conf = {};
|
|
44
|
+
|
|
45
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Installing local module in DEVELOPMENT MODE with WATCH auto restart');
|
|
46
|
+
proc_path = process.cwd();
|
|
47
|
+
|
|
48
|
+
cmd = path.join(proc_path, cst.DEFAULT_MODULE_JSON);
|
|
49
|
+
|
|
50
|
+
Common.extend(opts, {
|
|
51
|
+
cmd : cmd,
|
|
52
|
+
development_mode : true,
|
|
53
|
+
proc_path : proc_path
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return StartModule(PM2, opts, function(err, dt) {
|
|
57
|
+
if (err) return cb(err);
|
|
58
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Module successfully installed and launched');
|
|
59
|
+
return cb(null, dt);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function generateSample(app_name, cb) {
|
|
64
|
+
var rl = readline.createInterface({
|
|
65
|
+
input: process.stdin,
|
|
66
|
+
output: process.stdout
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
function samplize(module_name) {
|
|
70
|
+
var cmd1 = 'git clone https://github.com/pm2-hive/sample-module.git ' + module_name + '; cd ' + module_name + '; rm -rf .git';
|
|
71
|
+
var cmd2 = 'cd ' + module_name + ' ; sed -i "s:sample-module:'+ module_name +':g" package.json';
|
|
72
|
+
var cmd3 = 'cd ' + module_name + ' ; npm install';
|
|
73
|
+
|
|
74
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Getting sample app');
|
|
75
|
+
|
|
76
|
+
sexec(cmd1, function(err) {
|
|
77
|
+
if (err) Common.printError(cst.PREFIX_MSG_MOD_ERR + err.message);
|
|
78
|
+
sexec(cmd2, function(err) {
|
|
79
|
+
console.log('');
|
|
80
|
+
sexec(cmd3, function(err) {
|
|
81
|
+
console.log('');
|
|
82
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Module sample created in folder: ', path.join(process.cwd(), module_name));
|
|
83
|
+
console.log('');
|
|
84
|
+
Common.printOut('Start module in development mode:');
|
|
85
|
+
Common.printOut('$ cd ' + module_name + '/');
|
|
86
|
+
Common.printOut('$ pm2 install . ');
|
|
87
|
+
console.log('');
|
|
88
|
+
|
|
89
|
+
Common.printOut('Module Log: ');
|
|
90
|
+
Common.printOut('$ pm2 logs ' + module_name);
|
|
91
|
+
console.log('');
|
|
92
|
+
Common.printOut('Uninstall module: ');
|
|
93
|
+
Common.printOut('$ pm2 uninstall ' + module_name);
|
|
94
|
+
console.log('');
|
|
95
|
+
Common.printOut('Force restart: ');
|
|
96
|
+
Common.printOut('$ pm2 restart ' + module_name);
|
|
97
|
+
return cb ? cb() : false;
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (app_name) return samplize(app_name);
|
|
104
|
+
|
|
105
|
+
rl.question(cst.PREFIX_MSG_MOD + "Module name: ", function(module_name) {
|
|
106
|
+
samplize(module_name);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function publish(opts, cb) {
|
|
111
|
+
var rl = readline.createInterface({
|
|
112
|
+
input: process.stdin,
|
|
113
|
+
output: process.stdout
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
var semver = require('semver');
|
|
117
|
+
|
|
118
|
+
var package_file = path.join(process.cwd(), 'package.json');
|
|
119
|
+
|
|
120
|
+
var package_json = require(package_file);
|
|
121
|
+
|
|
122
|
+
package_json.version = semver.inc(package_json.version, 'minor');
|
|
123
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Incrementing module to: %s@%s',
|
|
124
|
+
package_json.name,
|
|
125
|
+
package_json.version);
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
rl.question("Write & Publish? [Y/N]", function(answer) {
|
|
129
|
+
if (answer != "Y")
|
|
130
|
+
return cb();
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
fs.writeFile(package_file, JSON.stringify(package_json, null, 2), function(err, data) {
|
|
134
|
+
if (err) return cb(err);
|
|
135
|
+
|
|
136
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Publishing module - %s@%s',
|
|
137
|
+
package_json.name,
|
|
138
|
+
package_json.version);
|
|
139
|
+
|
|
140
|
+
sexec('npm publish', function(code) {
|
|
141
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Module - %s@%s successfully published',
|
|
142
|
+
package_json.name,
|
|
143
|
+
package_json.version);
|
|
144
|
+
|
|
145
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Pushing module on Git');
|
|
146
|
+
sexec('git add . ; git commit -m "' + package_json.version + '"; git push origin master', function(code) {
|
|
147
|
+
|
|
148
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Installable with pm2 install %s', package_json.name);
|
|
149
|
+
return cb(null, package_json);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function moduleExistInLocalDB(CLI, module_name, cb) {
|
|
158
|
+
var modules = Configuration.getSync(cst.MODULE_CONF_PREFIX);
|
|
159
|
+
if (!modules) return cb(false);
|
|
160
|
+
var module_name_only = Utility.getCanonicModuleName(module_name)
|
|
161
|
+
modules = Object.keys(modules);
|
|
162
|
+
return cb(modules.indexOf(module_name_only) > -1 ? true : false);
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
function install(CLI, module_name, opts, cb) {
|
|
166
|
+
moduleExistInLocalDB(CLI, module_name, function (exists) {
|
|
167
|
+
if (exists) {
|
|
168
|
+
Common.logMod('Module already installed. Updating.');
|
|
169
|
+
|
|
170
|
+
Rollback.backup(module_name);
|
|
171
|
+
|
|
172
|
+
return uninstall(CLI, module_name, function () {
|
|
173
|
+
return continueInstall(CLI, module_name, opts, cb);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return continueInstall(CLI, module_name, opts, cb);
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Builtin Node Switch
|
|
181
|
+
function getNPMCommandLine(module_name, install_path) {
|
|
182
|
+
if (which('bun')) {
|
|
183
|
+
return spawn.bind(this, 'bun', ['install', module_name, '--loglevel=error', '--cwd', `"${install_path}"` ], {
|
|
184
|
+
stdio : 'inherit',
|
|
185
|
+
env: process.env,
|
|
186
|
+
windowsHide: true,
|
|
187
|
+
shell : true
|
|
188
|
+
})
|
|
189
|
+
}
|
|
190
|
+
else if (which('npm')) {
|
|
191
|
+
return spawn.bind(this, cst.IS_WINDOWS ? 'npm.cmd' : 'npm', ['install', module_name, '--loglevel=error', '--prefix', `"${install_path}"` ], {
|
|
192
|
+
stdio : 'inherit',
|
|
193
|
+
env: process.env,
|
|
194
|
+
windowsHide: true,
|
|
195
|
+
shell : true
|
|
196
|
+
})
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
return spawn.bind(this, cst.BUILTIN_NODE_PATH, [cst.BUILTIN_NPM_PATH, 'install', module_name, '--loglevel=error', '--prefix', `"${install_path}"`], {
|
|
200
|
+
stdio : 'inherit',
|
|
201
|
+
env: process.env,
|
|
202
|
+
windowsHide: true,
|
|
203
|
+
shell : true
|
|
204
|
+
})
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function continueInstall(CLI, module_name, opts, cb) {
|
|
209
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Calling ' + chalk.bold.red('[NPM]') + ' to install ' + module_name + ' ...');
|
|
210
|
+
|
|
211
|
+
var canonic_module_name = Utility.getCanonicModuleName(module_name);
|
|
212
|
+
var install_path = path.join(cst.DEFAULT_MODULE_PATH, canonic_module_name);
|
|
213
|
+
|
|
214
|
+
require('mkdirp')(install_path)
|
|
215
|
+
.then(function() {
|
|
216
|
+
process.chdir(os.homedir());
|
|
217
|
+
|
|
218
|
+
var install_instance = getNPMCommandLine(module_name, install_path)();
|
|
219
|
+
|
|
220
|
+
install_instance.on('close', finalizeInstall);
|
|
221
|
+
|
|
222
|
+
install_instance.on('error', function (err) {
|
|
223
|
+
console.error(err.stack || err);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
function finalizeInstall(code) {
|
|
228
|
+
if (code != 0) {
|
|
229
|
+
// If install has failed, revert to previous module version
|
|
230
|
+
return Rollback.revert(CLI, module_name, function() {
|
|
231
|
+
return cb(new Error('Installation failed via NPM, module has been restored to prev version'));
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Module downloaded');
|
|
236
|
+
|
|
237
|
+
var proc_path = path.join(install_path, 'node_modules', canonic_module_name);
|
|
238
|
+
var package_json_path = path.join(proc_path, 'package.json');
|
|
239
|
+
|
|
240
|
+
// Append default configuration to module configuration
|
|
241
|
+
try {
|
|
242
|
+
var conf = JSON.parse(fs.readFileSync(package_json_path).toString()).config;
|
|
243
|
+
|
|
244
|
+
if (conf) {
|
|
245
|
+
Object.keys(conf).forEach(function(key) {
|
|
246
|
+
Configuration.setSyncIfNotExist(canonic_module_name + ':' + key, conf[key]);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
} catch(e) {
|
|
250
|
+
Common.printError(e);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
opts = Common.extend(opts, {
|
|
254
|
+
cmd : package_json_path,
|
|
255
|
+
development_mode : false,
|
|
256
|
+
proc_path : proc_path
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
Configuration.set(cst.MODULE_CONF_PREFIX + ':' + canonic_module_name, {
|
|
260
|
+
uid : opts.uid,
|
|
261
|
+
gid : opts.gid
|
|
262
|
+
}, function(err, data) {
|
|
263
|
+
if (err) return cb(err);
|
|
264
|
+
|
|
265
|
+
StartModule(CLI, opts, function(err, dt) {
|
|
266
|
+
if (err) return cb(err);
|
|
267
|
+
|
|
268
|
+
if (process.env.PM2_PROGRAMMATIC === 'true')
|
|
269
|
+
return cb(null, dt);
|
|
270
|
+
|
|
271
|
+
CLI.conf(canonic_module_name, function() {
|
|
272
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Module successfully installed and launched');
|
|
273
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Checkout module options: `$ pm2 conf`');
|
|
274
|
+
return cb(null, dt);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function start(PM2, modules, module_name, cb) {
|
|
282
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Starting NPM module ' + module_name);
|
|
283
|
+
|
|
284
|
+
var install_path = path.join(cst.DEFAULT_MODULE_PATH, module_name);
|
|
285
|
+
var proc_path = path.join(install_path, 'node_modules', module_name);
|
|
286
|
+
var package_json_path = path.join(proc_path, 'package.json');
|
|
287
|
+
|
|
288
|
+
var opts = {};
|
|
289
|
+
|
|
290
|
+
// Merge with embedded configuration inside module_conf (uid, gid)
|
|
291
|
+
Common.extend(opts, modules[module_name]);
|
|
292
|
+
|
|
293
|
+
// Merge meta data to start module properly
|
|
294
|
+
Common.extend(opts, {
|
|
295
|
+
// package.json path
|
|
296
|
+
cmd : package_json_path,
|
|
297
|
+
// starting mode
|
|
298
|
+
development_mode : false,
|
|
299
|
+
// process cwd
|
|
300
|
+
proc_path : proc_path
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
StartModule(PM2, opts, function(err, dt) {
|
|
304
|
+
if (err) console.error(err);
|
|
305
|
+
return cb();
|
|
306
|
+
})
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function uninstall(CLI, module_name, cb) {
|
|
310
|
+
var module_name_only = Utility.getCanonicModuleName(module_name)
|
|
311
|
+
var proc_path = path.join(cst.DEFAULT_MODULE_PATH, module_name_only);
|
|
312
|
+
Configuration.unsetSync(cst.MODULE_CONF_PREFIX + ':' + module_name_only);
|
|
313
|
+
|
|
314
|
+
CLI.deleteModule(module_name_only, function(err, data) {
|
|
315
|
+
console.log('Deleting', proc_path)
|
|
316
|
+
if (module_name != '.' && proc_path.includes('modules') === true) {
|
|
317
|
+
deleteFolderRecursive(proc_path)
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (err) {
|
|
321
|
+
Common.printError(err);
|
|
322
|
+
return cb(err);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return cb(null, data);
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function getModuleConf(app_name) {
|
|
330
|
+
if (!app_name) throw new Error('No app_name defined');
|
|
331
|
+
|
|
332
|
+
var module_conf = Configuration.getAllSync();
|
|
333
|
+
|
|
334
|
+
var additional_env = {};
|
|
335
|
+
|
|
336
|
+
if (!module_conf[app_name]) {
|
|
337
|
+
additional_env = {};
|
|
338
|
+
additional_env[app_name] = {};
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
additional_env = Common.clone(module_conf[app_name]);
|
|
342
|
+
additional_env[app_name] = JSON.stringify(module_conf[app_name]);
|
|
343
|
+
}
|
|
344
|
+
return additional_env;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function StartModule(CLI, opts, cb) {
|
|
348
|
+
if (!opts.cmd && !opts.package) throw new Error('module package.json not defined');
|
|
349
|
+
if (!opts.development_mode) opts.development_mode = false;
|
|
350
|
+
|
|
351
|
+
var package_json = require(opts.cmd || opts.package);
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Script file detection
|
|
355
|
+
* 1- *apps* field (default pm2 json configuration)
|
|
356
|
+
* 2- *bin* field
|
|
357
|
+
* 3- *main* field
|
|
358
|
+
*/
|
|
359
|
+
if (!package_json.apps && !package_json.pm2) {
|
|
360
|
+
package_json.apps = {};
|
|
361
|
+
|
|
362
|
+
if (package_json.bin) {
|
|
363
|
+
var bin = Object.keys(package_json.bin)[0];
|
|
364
|
+
package_json.apps.script = package_json.bin[bin];
|
|
365
|
+
}
|
|
366
|
+
else if (package_json.main) {
|
|
367
|
+
package_json.apps.script = package_json.main;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
Common.extend(opts, {
|
|
372
|
+
cwd : opts.proc_path,
|
|
373
|
+
watch : opts.development_mode,
|
|
374
|
+
force_name : package_json.name,
|
|
375
|
+
started_as_module : true
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// Start the module
|
|
379
|
+
CLI.start(package_json, opts, function(err, data) {
|
|
380
|
+
if (err) return cb(err);
|
|
381
|
+
|
|
382
|
+
if (opts.safe) {
|
|
383
|
+
Common.printOut(cst.PREFIX_MSG_MOD + 'Monitoring module behavior for potential issue (5secs...)');
|
|
384
|
+
|
|
385
|
+
var time = typeof(opts.safe) == 'boolean' ? 3000 : parseInt(opts.safe);
|
|
386
|
+
return setTimeout(function() {
|
|
387
|
+
CLI.describe(package_json.name, function(err, apps) {
|
|
388
|
+
if (err || apps[0].pm2_env.restart_time > 2) {
|
|
389
|
+
return Rollback.revert(CLI, package_json.name, function() {
|
|
390
|
+
return cb(new Error('New Module is instable, restored to previous version'));
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
return cb(null, data);
|
|
394
|
+
});
|
|
395
|
+
}, time);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return cb(null, data);
|
|
399
|
+
});
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
var Rollback = {
|
|
405
|
+
revert : function(CLI, module_name, cb) {
|
|
406
|
+
var canonic_module_name = Utility.getCanonicModuleName(module_name);
|
|
407
|
+
var backup_path = path.join(require('os').tmpdir(), canonic_module_name);
|
|
408
|
+
var module_path = path.join(cst.DEFAULT_MODULE_PATH, canonic_module_name);
|
|
409
|
+
|
|
410
|
+
try {
|
|
411
|
+
fs.statSync(backup_path)
|
|
412
|
+
} catch(e) {
|
|
413
|
+
return cb(new Error('no backup found'));
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
Common.printOut(cst.PREFIX_MSG_MOD + chalk.bold.red('[[[[[ Module installation failure! ]]]]]'));
|
|
417
|
+
Common.printOut(cst.PREFIX_MSG_MOD + chalk.bold.red('[RESTORING TO PREVIOUS VERSION]'));
|
|
418
|
+
|
|
419
|
+
CLI.deleteModule(canonic_module_name, function() {
|
|
420
|
+
// Delete failing module
|
|
421
|
+
|
|
422
|
+
if (module_name.includes('modules') === true)
|
|
423
|
+
deleteFolderRecursive(module_path)
|
|
424
|
+
// Restore working version
|
|
425
|
+
copydirSync(backup_path, path.join(cst.DEFAULT_MODULE_PATH, canonic_module_name));
|
|
426
|
+
|
|
427
|
+
var proc_path = path.join(module_path, 'node_modules', canonic_module_name);
|
|
428
|
+
var package_json_path = path.join(proc_path, 'package.json');
|
|
429
|
+
|
|
430
|
+
// Start module
|
|
431
|
+
StartModule(CLI, {
|
|
432
|
+
cmd : package_json_path,
|
|
433
|
+
development_mode : false,
|
|
434
|
+
proc_path : proc_path
|
|
435
|
+
}, cb);
|
|
436
|
+
});
|
|
437
|
+
},
|
|
438
|
+
backup : function(module_name) {
|
|
439
|
+
// Backup current module
|
|
440
|
+
var tmpdir = require('os').tmpdir();
|
|
441
|
+
var canonic_module_name = Utility.getCanonicModuleName(module_name);
|
|
442
|
+
var module_path = path.join(cst.DEFAULT_MODULE_PATH, canonic_module_name);
|
|
443
|
+
copydirSync(module_path, path.join(tmpdir, canonic_module_name));
|
|
444
|
+
}
|
|
445
|
+
}
|