UNPKG

pinus-cli

Version:

pinus command line client for managing pinus

245 lines 20.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.tabComplete = exports.md5 = exports.getColor = exports.setHeaderColors = exports.format_date = exports.formatOutput = exports.argsFilter = exports.errorHandle = exports.help = exports.log = void 0; const colors = require("colors"); // @ts-ignore const pc = require("pretty-columns"); const async = require("async"); const crypto = require("crypto"); const consts_1 = require("./consts"); let serverMap = {}; function log(str) { process.stdout.write(str + '\n'); } exports.log = log; function help() { let HELP_INFO_1 = consts_1.consts.HELP_INFO_1; for (let i = 0; i < HELP_INFO_1.length; i++) { log(HELP_INFO_1[i]); } let COMANDS_ALL = consts_1.consts.COMANDS_ALL; pc.output(COMANDS_ALL); let HELP_INFO_2 = consts_1.consts.HELP_INFO_2; for (let i = 0; i < HELP_INFO_2.length; i++) { log(HELP_INFO_2[i]); } } exports.help = help; function errorHandle(comd, rl) { log('\nunknow command : ' + comd); log('type help for help infomation\n'); rl.prompt(); } exports.errorHandle = errorHandle; function argsFilter(argv) { let lines; if (argv.indexOf('\'') > 0) { lines = argv.split('\''); } let getArg = function (argv) { let argvs = argv.split(' '); for (let i = 0; i < argvs.length; i++) { if (argvs[i] === ' ' || argvs[i] === '') { argvs.splice(i, 1); } } return argvs; }; if (!!lines) { let head = getArg(lines[0]); for (let i = 1; i < lines.length - 1; i++) { head = head.concat(lines[i]); } let bottom = getArg(lines[lines.length - 1]); return head.concat(bottom); } else { return getArg(argv); } } exports.argsFilter = argsFilter; function formatOutput(comd, data) { if (comd === 'servers') { let msg = data.msg; let rows = []; let header = []; let results = []; serverMap = {}; serverMap['all'] = 1; header.push(setHeaderColors(['serverId', 'serverType', 'host', 'port', 'pid', 'heapUsed(M)', 'uptime(m)'])); for (let key in msg) { let server = msg[key]; if (!server['port']) { server['port'] = null; } serverMap[server['serverId']] = 1; rows.push([server['serverId'], server['serverType'], server['host'], server['port'], server['pid'], server['heapUsed'], server['uptime']]); } async.sortBy(rows, function (server, callback) { callback(null, server[0]); }, function (err, _results) { results = header.concat(_results); pc.output(results); return; }); } if (comd === 'connections') { let msg = data.msg; let rows = []; rows.push(setHeaderColors(['serverId', 'totalConnCount', 'loginedCount'])); let sumConnCount = 0, sumloginedCount = 0; for (let key in msg) { let server = msg[key]; rows.push([server['serverId'], server['totalConnCount'], server['loginedCount']]); sumConnCount += server['totalConnCount']; sumloginedCount += server['loginedCount']; } rows.push(['sum connections', sumConnCount, sumloginedCount]); pc.output(rows); return; } if (comd === 'logins') { let msg = data.msg; let rows = []; rows.push(setHeaderColors(['loginTime', 'uid', 'address'])); for (let key in msg) { let server = msg[key]; let loginedList = server['loginedList'] || []; if (loginedList && loginedList.length === 0) { log('\nno user logined in this connector\n'); return; } log('\nserverId: ' + server['serverId'] + ' totalConnCount: ' + server['totalConnCount'] + ' loginedCount: ' + server['loginedCount']); for (let i = 0; i < loginedList.length; i++) { rows.push([format_date(new Date(loginedList[i]['loginTime'])), loginedList[i]['uid'], loginedList[i]['address']]); } pc.output(rows); return; } } if (comd === 'modules') { let msg = data.msg; log('\n' + consts_1.consts.MODULE_INFO); log(data.msg + '\n'); return; } if (comd === 'status') { let msg = data.msg; let server = msg.body; let rows = []; rows.push(setHeaderColors(['time', 'serverId', 'serverType', 'pid', 'cpuAvg', 'memAvg', 'vsz', 'rss', 'usr', 'sys', 'gue'])); if (server) { rows.push([server['time'], server['serverId'], server['serverType'], server['pid'], server['cpuAvg'], server['memAvg'], server['vsz'], server['rss'], server['usr'], server['sys'], server['gue']]); pc.output(rows); } else { log('\n' + consts_1.consts.STATUS_ERROR + '\n'); } return; } if (comd === 'config' || comd === 'components' || comd === 'settings' || comd === 'get' || comd === 'set' || comd === 'exec' || comd === 'run') { pc.output(data); return; } if (comd === 'stop') { return; } if (comd === 'add') { return; } if (comd === 'proxy' || comd === 'handler') { pc.output(data); return; } if (comd === 'memory' || comd === 'cpu') { log(data + '\n'); return; } } exports.formatOutput = formatOutput; function format_date(date, friendly) { let year = date.getFullYear(); let month = date.getMonth() + 1; let day = date.getDate(); let hour = date.getHours(); let minute = date.getMinutes(); let second = date.getSeconds(); if (friendly) { let now = new Date(); let mseconds = -(date.getTime() - now.getTime()); let time_std = [1000, 60 * 1000, 60 * 60 * 1000, 24 * 60 * 60 * 1000]; if (mseconds < time_std[3]) { if (mseconds > 0 && mseconds < time_std[1]) { return Math.floor(mseconds / time_std[0]).toString() + ' 秒前'; } if (mseconds > time_std[1] && mseconds < time_std[2]) { return Math.floor(mseconds / time_std[1]).toString() + ' 分钟前'; } if (mseconds > time_std[2]) { return Math.floor(mseconds / time_std[2]).toString() + ' 小时前'; } } } // month = ((month < 10) ? '0' : '') + month; // day = ((day < 10) ? '0' : '') + day; let hourStr = ((hour < 10) ? '0' : '') + hour; let minuteStr = ((minute < 10) ? '0' : '') + minute; let secondStr = ((second < 10) ? '0' : '') + second; return year + '-' + month + '-' + day + ' ' + hourStr + ':' + minuteStr; } exports.format_date = format_date; function setHeaderColors(header) { return header.map(str => { return colors.blue(str); }); } exports.setHeaderColors = setHeaderColors; function getColor(len) { let color = []; for (let i = 0; i < len; i++) { color.push('blue'); } return color; } exports.getColor = getColor; function md5(str) { let md5sum = crypto.createHash('md5'); md5sum.update(str); str = md5sum.digest('hex'); return str; } exports.md5 = md5; function tabComplete(hits, line, map, comd) { if (hits.length) { return hits; } if (comd === 'enable' || comd === 'disable') { map = { 'app': 1, 'module': 1 }; } if (comd === 'dump') { map = { 'memory': 1, 'cpu': 1 }; } if (comd === 'use' || comd === 'stop') { map = serverMap; } // let _hits = []; for (let k in map) { let t = k; if (comd !== 'complete') { t = comd + ' ' + k; } if (t.indexOf(line) === 0) { hits.push(t); } } hits.sort(); return hits; } exports.tabComplete = tabComplete; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFpQztBQUNqQyxhQUFhO0FBQ2IscUNBQXFDO0FBQ3JDLCtCQUErQjtBQUMvQixpQ0FBaUM7QUFDakMscUNBQWtDO0FBR2xDLElBQUksU0FBUyxHQUEyQixFQUFFLENBQUM7QUFFM0MsU0FBZ0IsR0FBRyxDQUFDLEdBQVc7SUFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFGRCxrQkFFQztBQUVELFNBQWdCLElBQUk7SUFDaEIsSUFBSSxXQUFXLEdBQUcsZUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7SUFFRCxJQUFJLFdBQVcsR0FBRyxlQUFNLENBQUMsV0FBVyxDQUFDO0lBQ3JDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFdkIsSUFBSSxXQUFXLEdBQUcsZUFBTSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkI7QUFDTCxDQUFDO0FBYkQsb0JBYUM7QUFFRCxTQUFnQixXQUFXLENBQUMsSUFBWSxFQUFFLEVBQVk7SUFDbEQsR0FBRyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lB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