mirror of
https://github.com/Unitech/pm2.git
synced 2025-12-08 20:35:53 +00:00
125 lines
3.4 KiB
JavaScript
125 lines
3.4 KiB
JavaScript
/**
|
|
* Copyright 2013 the PM2 project authors. All rights reserved.
|
|
* Use of this source code is governed by a license that
|
|
* can be found in the LICENSE file.
|
|
*/
|
|
|
|
var debug = require('debug')('interface:driver');
|
|
var nssocket = require('nssocket');
|
|
var Url = require('url');
|
|
var Cipher = require('./Cipher.js');
|
|
var util = require('util');
|
|
|
|
var ReverseInteract = {
|
|
changeUrl : function(url) {
|
|
if (!this.connected) return;
|
|
console.log('[REV] Changing URL to %s', url);
|
|
|
|
this.network = Url.parse(url);
|
|
this.socket.connect(parseInt(this.network.port), this.network.hostname);
|
|
this.socket.reconnect();
|
|
},
|
|
destroy : function() {
|
|
this.socket.destroy();
|
|
},
|
|
start : function(opts) {
|
|
var self = this;
|
|
|
|
if (!opts.url)
|
|
throw new Error('url not declared');
|
|
if (!opts.conf)
|
|
throw new Error('Conf not passed to ReverseInteractor');
|
|
|
|
this.connected = false;
|
|
this.conf = opts.conf;
|
|
this.network = Url.parse(opts.url);
|
|
this.pm2_instance = opts.conf.pm2_instance;
|
|
|
|
this.socket = new nssocket.NsSocket({
|
|
type : 'tcp4',
|
|
reconnect : true,
|
|
retryInterval : 100,
|
|
max : Infinity,
|
|
maxListeners : 50
|
|
});
|
|
|
|
this.socket.on('error', function(e) {
|
|
self.connected = false;
|
|
console.error('[REV] %s', e.message || e);
|
|
});
|
|
|
|
this.socket.on('close', function(dt) {
|
|
self.connected = false;
|
|
});
|
|
|
|
this.socket.on('start', function() {
|
|
self.connected = true;
|
|
opts.conf.rev_con = true;
|
|
console.log('[REV] Connected to %s:%s', self.network.hostname, self.network.port);
|
|
});
|
|
|
|
console.log('[REV] Connecting to %s:%s', this.network.hostname, this.network.port);
|
|
|
|
this.socket.connect(parseInt(this.network.port), this.network.hostname);
|
|
this.onMessage();
|
|
},
|
|
/**
|
|
* Listening to remote events from Keymetrics
|
|
*/
|
|
onMessage : function() {
|
|
if (!this.socket) return console.error('Reverse interaction not initialized');
|
|
|
|
/**
|
|
* Identify this agent to Keymetrics
|
|
* via PUBLIC/PRIVATE key exchange
|
|
*/
|
|
ReverseInteract.introduceToKeymetrics();
|
|
|
|
ReverseInteract.axmCustomActions();
|
|
|
|
/**
|
|
* From Pm2Actions.js
|
|
*/
|
|
ReverseInteract.pm2Actions();
|
|
|
|
ReverseInteract.pm2ScopedActions();
|
|
|
|
return false;
|
|
},
|
|
/**
|
|
* First method called to identify this agent
|
|
*/
|
|
introduceToKeymetrics : function() {
|
|
var self = this;
|
|
|
|
this.socket.data('ask', function(raw_msg) {
|
|
if (process.env.NODE_ENV && process.env.NODE_ENV == 'test') {
|
|
// Dont cipher data in test environment
|
|
self.socket.send('ask:rep', {
|
|
success : true,
|
|
machine_name : self.conf.MACHINE_NAME,
|
|
public_key : self.conf.PUBLIC_KEY
|
|
});
|
|
} else {
|
|
var ciphered_data = Cipher.cipherMessage(JSON.stringify({
|
|
machine_name : self.conf.MACHINE_NAME
|
|
}), self.conf.SECRET_KEY);
|
|
|
|
if (!ciphered_data)
|
|
return console.error('Got wrong ciphering data %s %s', self.conf.MACHINE_NAME, self.conf.SECRET_KEY);
|
|
|
|
self.socket.send('ask:rep', {
|
|
data : ciphered_data,
|
|
public_key : self.conf.PUBLIC_KEY
|
|
});
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
};
|
|
|
|
util._extend(ReverseInteract, require('./RemoteActions/Pm2Actions.js'));
|
|
util._extend(ReverseInteract, require('./RemoteActions/CustomActions.js'));
|
|
|
|
module.exports = ReverseInteract;
|