mirror of
https://github.com/Unitech/pm2.git
synced 2025-12-08 20:35:53 +00:00
247 lines
7.5 KiB
JavaScript
247 lines
7.5 KiB
JavaScript
var cst = require('../../../constants.js');
|
|
var Common = require('../../Common.js');
|
|
var UX = require('../CliUx');
|
|
var chalk = require('chalk');
|
|
var async = require('async');
|
|
var path = require('path');
|
|
var fs = require('fs');
|
|
var KMDaemon = require('../../Interactor/InteractorDaemonizer');
|
|
var KM = require('./kmapi.js');
|
|
var Table = require('cli-table-redemption');
|
|
var open = require('../../tools/open.js');
|
|
var promptly = require('promptly');
|
|
|
|
module.exports = function(CLI) {
|
|
|
|
CLI.prototype.openDashboard = function() {
|
|
var that = this;
|
|
|
|
KMDaemon.getInteractInfo(this._conf, function(err, data) {
|
|
if (err) {
|
|
Common.printError(chalk.bold.white('Agent if offline, type `$ pm2 register` to log in'));
|
|
return that.exitCli(cst.ERROR_EXIT);
|
|
}
|
|
Common.printOut(chalk.bold('Opening Dashboard in Browser...'));
|
|
open('https://app.keymetrics.io/#/r/' + data.public_key);
|
|
setTimeout(function() {
|
|
that.exitCli();
|
|
}, 200);
|
|
});
|
|
};
|
|
|
|
CLI.prototype.loginToKM = function() {
|
|
printMotd();
|
|
return loginPrompt();
|
|
};
|
|
|
|
CLI.prototype.registerToKM = function() {
|
|
printMotd();
|
|
|
|
promptly.confirm(chalk.bold('Do you have a Keymetrics.io account? (y/n)'), function (err, answer) {
|
|
if (answer == true) {
|
|
return loginPrompt();
|
|
}
|
|
registerPrompt();
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Monitor Selectively Processes (auto filter in interaction)
|
|
* @param String state 'monitor' or 'unmonitor'
|
|
* @param String target <pm_id|name|all>
|
|
* @param Function cb callback
|
|
*/
|
|
CLI.prototype.monitorState = function(state, target, cb) {
|
|
var that = this;
|
|
|
|
try {
|
|
fs.statSync(this._conf.INTERACTION_CONF);
|
|
} catch(e) {
|
|
printMotd();
|
|
return registerPrompt();
|
|
}
|
|
|
|
if (!target) {
|
|
Common.printError(cst.PREFIX_MSG_ERR + 'Please specify an <app_name|pm_id>');
|
|
return cb ? cb(new Error('argument missing')) : that.exitCli(cst.ERROR_EXIT);
|
|
}
|
|
|
|
function monitor (pm_id, cb) {
|
|
// State can be monitor or unmonitor
|
|
that.Client.executeRemote(state, pm_id, cb);
|
|
}
|
|
if (target === 'all') {
|
|
that.Client.getAllProcessId(function (err, procs) {
|
|
if (err) {
|
|
Common.printError(err);
|
|
return cb ? cb(Common.retErr(err)) : that.exitCli(cst.ERROR_EXIT);
|
|
}
|
|
async.forEachLimit(procs, 1, monitor, function (err, res) {
|
|
return typeof cb === 'function' ? cb(err, res) : that.speedList();
|
|
});
|
|
});
|
|
} else if (!Number.isInteger(parseInt(target))) {
|
|
this.Client.getProcessIdByName(target, true, function (err, procs) {
|
|
if (err) {
|
|
Common.printError(err);
|
|
return cb ? cb(Common.retErr(err)) : that.exitCli(cst.ERROR_EXIT);
|
|
}
|
|
async.forEachLimit(procs, 1, monitor, function (err, res) {
|
|
return typeof cb === 'function' ? cb(err, res) : that.speedList();
|
|
});
|
|
});
|
|
} else {
|
|
monitor(parseInt(target), function (err, res) {
|
|
return typeof cb === 'function' ? cb(err, res) : that.speedList();
|
|
});
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Private Functions
|
|
*/
|
|
|
|
function printMotd() {
|
|
var dt = fs.readFileSync(path.join(__dirname, 'motd'));
|
|
console.log(dt.toString());
|
|
}
|
|
|
|
function validateEmail(email) {
|
|
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
if (re.test(email) == false)
|
|
throw new Error('Not an email');
|
|
return email;
|
|
}
|
|
|
|
function validateUsername(value) {
|
|
if (value.length < 6) {
|
|
throw new Error('Min length of 6');
|
|
}
|
|
return value;
|
|
};
|
|
|
|
|
|
function linkOpenExit(target_bucket) {
|
|
KMDaemon.launchAndInteract(cst, {
|
|
public_key : target_bucket.public_id,
|
|
secret_key : target_bucket.secret_id
|
|
}, function(err, dt) {
|
|
open('https://app.keymetrics.io/#/r/' + target_bucket.public_id);
|
|
setTimeout(function() {
|
|
process.exit(cst.SUCCESS_EXIT);
|
|
}, 100);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Login on Keymetrics
|
|
* Link to the only bucket or list bucket for selection
|
|
* Open Browser
|
|
*/
|
|
function loginPrompt(cb) {
|
|
console.log(chalk.bold('Log in to Keymetrics'));
|
|
(function retry() {
|
|
promptly.prompt('Username or Email: ', function(err, username) {
|
|
promptly.password('Password: ', { replace : '*' }, function(err, password) {
|
|
KM.loginAndGetAccessToken({ username : username, password: password }, function(err) {
|
|
if (err) {
|
|
console.error(chalk.red.bold(err) + '\n');
|
|
return retry();
|
|
}
|
|
KM.getBuckets(function(err, buckets) {
|
|
if (err) {
|
|
console.error(chalk.red.bold(err) + '\n');
|
|
return retry();
|
|
}
|
|
|
|
if (buckets.length > 1) {
|
|
console.log(chalk.bold('Bucket list'));
|
|
|
|
var table = new Table({
|
|
style : {'padding-left' : 1, head : ['cyan', 'bold'], compact : true},
|
|
head : ['Bucket name', 'Plan type']
|
|
});
|
|
|
|
buckets.forEach(function(bucket) {
|
|
table.push([bucket.name, bucket.credits.offer_type]);
|
|
});
|
|
|
|
console.log(table.toString());
|
|
|
|
(function retryInsertion() {
|
|
promptly.prompt('Type the bucket you want to link to: ', function(err, bucket_name) {
|
|
var target_bucket = null;
|
|
|
|
buckets.some(function(bucket) {
|
|
if (bucket.name == bucket_name) {
|
|
target_bucket = bucket;
|
|
return true;
|
|
}
|
|
});
|
|
|
|
if (target_bucket == null)
|
|
return retryInsertion();
|
|
linkOpenExit(target_bucket);
|
|
});
|
|
})();
|
|
}
|
|
else {
|
|
var target_bucket = buckets[0];
|
|
console.log('Connecting local PM2 to Keymetrics Bucket [%s]', target_bucket.name);
|
|
|
|
KMDaemon.launchAndInteract(cst, {
|
|
public_key : target_bucket.public_id,
|
|
secret_key : target_bucket.secret_id
|
|
}, function(err, dt) {
|
|
linkOpenExit(target_bucket);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
});
|
|
})
|
|
})()
|
|
}
|
|
|
|
/**
|
|
* Register on Keymetrics
|
|
* Create Bucket
|
|
* Auto Link local PM2 to new Bucket
|
|
* Open Browser for access to monitoring dashboard
|
|
*/
|
|
function registerPrompt() {
|
|
console.log(chalk.bold('Now registering to Keymetrics'));
|
|
promptly.prompt('Username: ', {
|
|
validator : validateUsername,
|
|
retry : true
|
|
}, function(err, username) {
|
|
promptly.prompt('Email: ', {
|
|
validator : validateEmail,
|
|
retry : true
|
|
}, function(err, email) {
|
|
promptly.password('Password: ', { replace : '*' }, function(err, password) {
|
|
process.stdout.write(chalk.bold('Creating account on Keymetrics..'));
|
|
var inter = setInterval(function() {
|
|
process.stdout.write('.');
|
|
}, 300);
|
|
KM.fullCreationFlow({
|
|
email : email,
|
|
password : password,
|
|
username : username
|
|
}, function(err, target_bucket) {
|
|
clearInterval(inter);
|
|
if (err) {
|
|
console.error('\n' + chalk.red.bold(err) + '\n');
|
|
return registerPrompt();
|
|
}
|
|
linkOpenExit(target_bucket);
|
|
});
|
|
});
|
|
});
|
|
})
|
|
}
|
|
|
|
};
|