UNPKG

omelop

Version:

[![Build Status](https://travis-ci.org/node-omelop/omelop.svg?branch=master)](https://travis-ci.org/node-omelop/omelop)

737 lines 51.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WatchServerModule = void 0; /*! * Omelop -- consoleModule watchServer * Copyright(c) 2013 fantasyni <fantasyni@163.com> * MIT Licensed */ const omelop_logger_1 = require("omelop-logger"); const countDownLatch = require("../util/countDownLatch"); const monitor = require("omelop-monitor"); const util = require("util"); const fs = require("fs"); const vm = require("vm"); const path = require("path"); let logger = (0, omelop_logger_1.getLogger)('omelop', path.basename(__filename)); var HandleType; (function (HandleType) { HandleType["client"] = "client"; HandleType["monitor"] = "monitor"; })(HandleType || (HandleType = {})); class WatchServerModule { constructor(opts) { opts = opts || {}; this.app = opts.app; } monitorHandler(agent, msg, cb) { let comd = msg['comd']; let context = msg['context']; let param = msg['param']; let app = this.app; let handle = HandleType.monitor; switch (comd) { case 'servers': showServers(handle, agent, comd, context, cb); break; case 'connections': showConnections(handle, agent, app, comd, context, cb); break; case 'logins': showLogins(handle, agent, app, comd, context, cb); break; case 'modules': showModules(handle, agent, comd, context, cb); break; case 'status': showStatus(handle, agent, comd, context, cb); break; case 'config': showConfig(handle, agent, app, comd, context, param, cb); break; case 'proxy': showProxy(handle, agent, app, comd, context, param, cb); break; case 'handler': showHandler(handle, agent, app, comd, context, param, cb); break; case 'components': showComponents(handle, agent, app, comd, context, param, cb); break; case 'settings': showSettings(handle, agent, app, comd, context, param, cb); break; case 'cpu': dumpCPU(handle, agent, comd, context, param, cb); break; case 'memory': dumpMemory(handle, agent, comd, context, param, cb); break; case 'get': getApp(handle, agent, app, comd, context, param, cb); break; case 'set': setApp(handle, agent, app, comd, context, param, cb); break; case 'enable': enableApp(handle, agent, app, comd, context, param, cb); break; case 'disable': disableApp(handle, agent, app, comd, context, param, cb); break; case 'run': runScript(handle, agent, app, comd, context, param, cb); break; default: showError(handle, agent, comd, context, cb); } } clientHandler(agent, msg, cb) { let comd = msg['comd']; let context = msg['context']; let param = msg['param']; let app = this.app; // master app if (!comd || !context) { cb('lack of comd or context param'); return; } let handle = HandleType.client; switch (comd) { case 'servers': showServers(handle, agent, comd, context, cb); break; case 'connections': showConnections(handle, agent, app, comd, context, cb); break; case 'logins': showLogins(handle, agent, app, comd, context, cb); break; case 'modules': showModules(handle, agent, comd, context, cb); break; case 'status': showStatus(handle, agent, comd, context, cb); break; case 'config': showConfig(handle, agent, app, comd, context, param, cb); break; case 'proxy': showProxy(handle, agent, app, comd, context, param, cb); break; case 'handler': showHandler(handle, agent, app, comd, context, param, cb); break; case 'components': showComponents(handle, agent, app, comd, context, param, cb); break; case 'settings': showSettings(handle, agent, app, comd, context, param, cb); break; case 'cpu': dumpCPU(handle, agent, comd, context, param, cb); break; case 'memory': dumpMemory(handle, agent, comd, context, param, cb); break; case 'get': getApp(handle, agent, app, comd, context, param, cb); break; case 'set': setApp(handle, agent, app, comd, context, param, cb); break; case 'enable': enableApp(handle, agent, app, comd, context, param, cb); break; case 'disable': disableApp(handle, agent, app, comd, context, param, cb); break; case 'run': runScript(handle, agent, app, comd, context, param, cb); break; default: showError(handle, agent, comd, context, cb); } } } exports.WatchServerModule = WatchServerModule; WatchServerModule.moduleId = 'watchServer'; function showServers(handle, agent_, comd, context, cb) { if (handle === 'client') { let agent = agent_; let sid, record; let serverInfo = {}; let count = Object.keys(agent.idMap).length; let latch = countDownLatch.createCountDownLatch(count, function () { cb(null, { msg: serverInfo }); }); for (sid in agent.idMap) { record = agent.idMap[sid]; agent.request(record.id, WatchServerModule.moduleId, { comd: comd, context: context }, function (err, msg) { serverInfo[msg.serverId] = msg.body; latch.done(); }); } } else if (handle === 'monitor') { let agent = agent_; let serverId = agent.id; let serverType = agent.type; let info = agent.info; let pid = process.pid; let heapUsed = (process.memoryUsage().heapUsed / (1000 * 1000)).toFixed(2); let uptime = (process.uptime() / 60).toFixed(2); cb(null, { serverId: serverId, body: { serverId: serverId, serverType: serverType, host: info['host'], port: info['port'], pid: pid, heapUsed: heapUsed, uptime: uptime } }); } } function showConnections(handle, _agent, app, comd, context, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { let sid, record; let serverInfo = {}; let count = 0; for (let key in agent.idMap) { if (agent.idMap[key].info.frontend) { count++; } } let latch = countDownLatch.createCountDownLatch(count, function () { cb(null, { msg: serverInfo }); }); for (sid in agent.idMap) { record = agent.idMap[sid]; if (record.info.frontend) { agent.request(record.id, WatchServerModule.moduleId, { comd: comd, context: context }, function (err, msg) { serverInfo[msg.serverId] = msg.body; latch.done(); }); } } } else { let record = agent.idMap[context]; if (!record) { cb('the server ' + context + ' not exist'); } if (record.info.frontend) { agent.request(record.id, WatchServerModule.moduleId, { comd: comd, context: context }, function (err, msg) { let serverInfo = {}; serverInfo[msg.serverId] = msg.body; cb(null, { msg: serverInfo }); }); } else { cb('\nthis command should be applied to frontend server\n'); } } } else if (handle === 'monitor') { let agent = _agent; let connection = app.components.__connection__; if (!connection) { cb(null, { serverId: agent.id, body: 'error' }); return; } cb(null, { serverId: agent.id, body: connection.getStatisticsInfo() }); } } function showLogins(handle, _agent, app, comd, context, cb) { showConnections(handle, _agent, app, comd, context, cb); } function showModules(handle, _agent, comd, context, cb) { let modules = _agent.consoleService.modules; let result = []; for (let module in modules) { result.push(module); } cb(null, { msg: result }); } function showStatus(handle, _agent, comd, context, cb) { if (handle === 'client') { let agent = _agent; agent.request(context, WatchServerModule.moduleId, { comd: comd, context: context }, function (err, msg) { cb(null, { msg: msg }); }); } else if (handle === 'monitor') { let agent = _agent; let serverId = agent.id; let pid = process.pid; let params = { serverId: serverId, pid: String(pid) }; monitor.psmonitor.getPsInfo(params, function (err, data) { cb(null, { serverId: agent.id, body: data }); }); } } function showConfig(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (param === 'master') { cb(null, { masterConfig: app.get('masterConfig') || 'no config to master in app.js', masterInfo: app.get('master') }); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, cb); } else if (handle === 'monitor') { let key = param + 'Config'; cb(null, clone(param, app.get(key))); } } function showProxy(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; proxyCb(app, context, cb); } } function showHandler(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; handlerCb(app, context, cb); } } function showComponents(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; let _components = app.components; let res = {}; for (let key in _components) { let name = getComponentName(key); res[name] = clone(name, app.get(name + 'Config')); } cb(null, res); } } function showSettings(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; let _settings = app.settings; let res = {}; for (let key in _settings) { if (key.match(/^__\w+__$/) || key.match(/\w+Config$/)) { continue; } if (!checkJSON(_settings[key])) { res[key] = 'Object'; continue; } res[key] = _settings[key]; } cb(null, res); } } function dumpCPU(handle, _agent, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(err, msg); }); } else if (handle === 'monitor') { let agent = _agent; let times = param['times']; let filepath = param['filepath']; let force = param['force']; cb(null, 'cpu dump is unused in 1.0 of omelop'); /** if (!/\.cpuprofile$/.test(filepath)) { filepath = filepath + '.cpuprofile'; } if (!times || !/^[0-9]*[1-9][0-9]*$/.test(times)) { cb('no times or times invalid error'); return; } checkFilePath(filepath, force, function(err) { if (err) { cb(err); return; } //ndump.cpu(filepath, times); cb(null, filepath + ' cpu dump ok'); }); */ } } function dumpMemory(handle, _agent, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(err, msg); }); } else if (handle === 'monitor') { let agent = _agent; let filepath = param['filepath']; let force = param['force']; if (!/\.heapsnapshot$/.test(filepath)) { filepath = filepath + '.heapsnapshot'; } checkFilePath(filepath, force, function (err) { if (err) { cb(err); return; } let heapdump = null; try { heapdump = require('heapdump'); heapdump.writeSnapshot(filepath); cb(null, filepath + ' memory dump ok'); } catch (e) { cb('omelop-admin require heapdump'); } }); } } function getApp(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; let res = app.get(param); if (!checkJSON(res)) { res = 'object'; } cb(null, res || null); } } function setApp(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; let key = param['key']; let value = param['value']; app.set(key, value); cb(null, 'set ' + key + ':' + value + ' ok'); } } function enableApp(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; app.enable(param); cb(null, 'enable ' + param + ' ok'); } } function disableApp(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; app.disable(param); cb(null, 'disable ' + param + ' ok'); } } function runScript(handle, _agent, app, comd, context, param, cb) { if (handle === 'client') { let agent = _agent; if (context === 'all') { cb('context error'); return; } agent.request(context, WatchServerModule.moduleId, { comd: comd, param: param, context: context }, function (err, msg) { cb(null, msg); }); } else if (handle === 'monitor') { let agent = _agent; let ctx = { app: app, result: null }; try { vm.createContext(ctx); vm.runInNewContext('result = ' + param, ctx); cb(null, util.inspect(ctx.result)); } catch (e) { cb(null, e.stack); } } } function showError(handle, _agent, comd, context, cb) { } function clone(param, obj) { let result = {}; let flag = 1; for (let key in obj) { if (typeof obj[key] === 'function' || typeof obj[key] === 'object') { continue; } flag = 0; result[key] = obj[key]; } if (flag) { // return 'no ' + param + 'Config info'; } return result; } function checkFilePath(filepath, force, cb) { if (!force && fs.existsSync(filepath)) { cb('filepath file exist'); return; } fs.writeFile(filepath, 'test', function (err) { if (err) { cb('filepath invalid error'); return; } fs.unlinkSync(filepath); cb(null); }); } function proxyCb(app, context, cb) { let msg = {}; let __proxy__ = app.components.__proxy__; if (__proxy__ && __proxy__.client && __proxy__.client.proxies.user) { let proxies = __proxy__.client.proxies.user; let server = app.getServerById(context); if (!server) { cb('no server with this id ' + context); } else { let type = server['serverType']; let tmp = proxies[type]; msg[type] = {}; for (let _proxy in tmp) { let r = tmp[_proxy]; msg[type][_proxy] = {}; for (let _rpc in r) { if (typeof r[_rpc] === 'function') { msg[type][_proxy][_rpc] = 'function'; } } } cb(null, msg); } } else { cb('no proxy loaded'); } } function handlerCb(app, context, cb) { let msg = {}; let __server__ = app.components.__server__; if (__server__ && __server__.server && __server__.server.handlerService.handlerMap) { let handles = __server__.server.handlerService.handlerMap; let server = app.getServerById(context); if (!server) { cb('no server with this id ' + context); } else { let type = server['serverType']; let tmp = handles; msg[type] = {}; for (let _p in tmp) { let r = tmp[_p]; msg[type][_p] = {}; for (let _r in r) { if (typeof r[_r] === 'function') { msg[type][_p][_r] = 'function'; } } } cb(null, msg); } } else { cb('no handler loaded'); } } function getComponentName(c) { let t = c.match(/^__(\w+)__$/); if (t) { t = t[1]; } return t; } function checkJSON(obj) { if (!obj) { return true; } try { JSON.stringify(obj); } catch (e) { return false; } return true; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hTZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbW9kdWxlcy93YXRjaFNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7OztHQUlHO0FBQ0gsaURBQTBDO0FBQzFDLHlEQUF5RDtBQUN6RCwwQ0FBMEM7QUFFMUMsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFJekIsNkJBQTZCO0FBQzdCLElBQUksTUFBTSxHQUFHLElBQUEseUJBQVMsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBRzVELElBQUssVUFHSjtBQUhELFdBQUssVUFBVTtJQUNYLCtCQUFpQixDQUFBO0lBQ2pCLGlDQUFtQixDQUFBO0FBQ3ZCLENBQUMsRUFISSxVQUFVLEtBQVYsVUFBVSxRQUdkO0FBRUQsTUFBYSxpQkFBaUI7SUFJMUIsWUFBWSxJQUE0QjtRQUNwQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFtQixFQUFFLEdBQVEsRUFBRSxFQUFtQjtRQUM3RCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBRW5CLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFFaEMsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLFNBQVM7Z0JBQ1YsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFB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