mirror of
https://github.com/Unitech/pm2.git
synced 2025-12-08 20:35:53 +00:00
113 lines
3.0 KiB
JavaScript
113 lines
3.0 KiB
JavaScript
|
|
'use strict';
|
|
|
|
var spawn = require('child_process').spawn;
|
|
var fs = require('fs');
|
|
var cst = require('../constants.js');
|
|
var path = require('path');
|
|
var util = require('util');
|
|
var rpc = require('axon-rpc');
|
|
var debug = require('debug')('interface:daemon');
|
|
var axon = require('axon');
|
|
|
|
var InteractorDaemonizer = module.exports = {};
|
|
|
|
InteractorDaemonizer.rpc = {};
|
|
|
|
InteractorDaemonizer.ping = function(cb) {
|
|
var req = axon.socket('req');
|
|
var client = new rpc.Client(req);
|
|
|
|
debug('Trying to connect to Interactor daemon');
|
|
client.sock.once('reconnect attempt', function() {
|
|
client.sock.close();
|
|
debug('Interactor Daemon not launched');
|
|
cb(false);
|
|
});
|
|
client.sock.once('connect', function() {
|
|
client.sock.close();
|
|
debug('Interactor Daemon alive');
|
|
cb(true);
|
|
});
|
|
req.connect(cst.INTERACTOR_RPC_PORT);
|
|
};
|
|
|
|
InteractorDaemonizer.launchRPC = function(cb) {
|
|
var req = axon.socket('req');
|
|
this.client = new rpc.Client(req);
|
|
var self = this;
|
|
|
|
this.client_sock = req.connect(cst.INTERACTOR_RPC_PORT);
|
|
|
|
debug('Generating methods');
|
|
|
|
var generateMethods = function(cb) {
|
|
self.client.methods(function(err, methods) {
|
|
Object.keys(methods).forEach(function(key) {
|
|
var method_signature = methods[key];
|
|
debug('+-- Creating %s method', method_signature.name);
|
|
|
|
(function(name) {
|
|
self.rpc[name] = function() {
|
|
var args = Array.prototype.slice.call(arguments);
|
|
args.unshift(name);
|
|
self.client.call.apply(self.client, args);
|
|
};
|
|
})(method_signature.name);
|
|
|
|
});
|
|
return cb();
|
|
});
|
|
};
|
|
|
|
generateMethods(function() {
|
|
debug('Methods generated');
|
|
cb();
|
|
});
|
|
};
|
|
|
|
InteractorDaemonizer.launchOrAttach = function(secret_key, public_key, machine_name, cb) {
|
|
InteractorDaemonizer.ping(function(online) {
|
|
if (online) {
|
|
return cb(false);
|
|
}
|
|
else
|
|
InteractorDaemonizer.daemonize(secret_key, public_key, machine_name, function() {
|
|
return cb(true);
|
|
});
|
|
return false;
|
|
});
|
|
};
|
|
|
|
InteractorDaemonizer.daemonize = function(secret_key, public_key, machine_name, cb) {
|
|
console.log('Launching Interactor');
|
|
|
|
var InteractorJS = path.resolve(path.dirname(module.filename), 'Interactor.js');
|
|
|
|
var child = require('child_process').fork(InteractorJS, [], {
|
|
silent : false,
|
|
detached : true,
|
|
cwd : process.cwd(),
|
|
env : util._extend({
|
|
PM2_MACHINE_NAME : machine_name,
|
|
PM2_SECRET_KEY : secret_key,
|
|
PM2_PUBLIC_KEY : public_key
|
|
}, process.env),
|
|
stdio : 'ignore'
|
|
}, function(err, stdout, stderr) {
|
|
if (err) return console.error(err);
|
|
return console.log('Interactor daemonized');
|
|
});
|
|
|
|
fs.writeFileSync(cst.INTERACTOR_PID_PATH, child.pid);
|
|
|
|
child.unref();
|
|
|
|
child.once('message', function(msg) {
|
|
process.emit('interactor:daemon:ready');
|
|
console.log(msg);
|
|
console.log('----- You can access to interactor log messages in ~/.pm2/interactor.log');
|
|
return setTimeout(function() {cb(null, child)}, 100);
|
|
});
|
|
};
|