@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,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
+ }