scalra
Version:
node.js framework to prototype and scale rapidly
285 lines (229 loc) • 6.65 kB
JavaScript
//
// console.js
//
// customizable handler for console messages
//
// history:
// 2014-02-17 extracted from frontier.js
//
var l_handlers = SR.State.get('SR.Console');
// add a new handler with a given description and usage text
// usage please follow the style in: http://en.wikipedia.org/wiki/Usage_message
var l_add = exports.add = function (command, desc_text, handler, usage_text) {
if (typeof handler !== 'function') {
LOG.warn('handler must be a function for command [' + command + ']', 'SR.Console');
return false;
}
// warn if already exists
if (l_handlers.hasOwnProperty(command)) {
LOG.warn('console command [' + command + '] already registered, replace existing...', 'SR.Console');
}
// add handler
l_handlers[command] = {
desc: desc_text,
usage: usage_text,
handler: handler
};
return true;
};
l_add('quit', 'quit current server instance', function (para) {
SR.Settings.FRONTIER.dispose();
return true;
});
l_add('list', 'show live app servers', function (para) {
console.log('list current apps');
var appList = SR.AppConn.queryAppServers();
var count = 1;
for (var appID in appList) {
console.log(count + ': ' + appList[appID].IP + ':' +appList[appID].port +
' [' + appList[appID].name + '] users: ' + appList[appID].usercount);
count++;
}
return true;
});
l_add('start', 'start app server of a type', function (para) {
var name = para[0];
if (name === '')
return false;
var num = 1;
if (para.length > 2 && para[1] !== '')
num = parseInt(para[1]);
var owner = para[2];
var project = para[3];
var server_info = {
owner: owner,
project: project,
name: name
};
LOG.warn('starting ' + num + ' servers of type [' + name + ']', 'SR.Console');
SR.Execute.start(server_info, num, function (list) {
if (typeof list === 'string')
LOG.warn(list, 'SR.Console');
else {
LOG.warn(list.length + ' servers started', 'SR.Console');
for (var i=0; i < list.length; i++)
LOG.sys(list[i], 'SR.Console');
}
});
return true;
},
'type [size] [owner] [project]');
l_add('stop', 'stop an app server of a given appID', function (para) {
var appID = para[0];
SR.Execute.stop(appID, function (result) {
LOG.warn(result, 'SR.Console');
});
return true;
},
'appID');
l_add('stopall', 'stop all live project servers', function (para) {
SR.Execute.stopAll();
},
'');
l_add('startall', 'restart all stopped project servers', function (para) {
SR.Execute.startAll();
},
'');
l_add('query', 'query a list of info for live servers', function (para) {
var owner = para[0];
var project = para[1];
var name = para[2];
SR.Execute.query({owner: owner, project: project, name: name}, function (list) {
LOG.warn(list, 'SR.Console');
});
},
'[owner] [project] [name]');
l_add('log', 'set different display levels', function (para) {
var level = parseInt(para[0]);
if (isNaN(level)) {
console.log('current level: ' + LOG.getLevel() + ' (4: system, 3: debug, 2: warning, 1: error)');
} else if (level > 4 || level <= 0)
return false;
else {
console.log('set error level to: ' + level);
LOG.setLevel(level);
}
return true;
},
'errorlevel (4: system, 3: debug, 2: warning, 1: error)');
l_add('info', 'display current server info [channel, cpu, server, disks, settings]', function (para) {
switch (para[0]) {
case 'channel':
console.log('total subscribers: ' + SR.Comm.count());
// get a list of channels & get their count
var list = SR.Comm.list();
for (var i=0; i < list.length; i++)
console.log(list[i] + ': ' + SR.Comm.count(list[i]));
break;
case 'cpu':
var info = UTIL.getSystemInfo();
console.log(info.cpu_load);
console.log(info.cpus);
break;
case 'server':
var info = SR.Settings.SERVER_INFO;
console.log(info);
break;
case 'disks':
var info = UTIL.getSystemInfo();
console.log(info.additional.disks);
break;
case 'settings':
console.log(SR.Settings);
break;
default:
var info = UTIL.getSystemInfo();
console.log(info);
break;
}
return true;
});
// list all current channels
l_add('ch', 'show all currently subscribed channels', function (para) {
var list = SR.Comm.list();
var output = '';
for (var i=0; i < list.length; i++)
output += list[i] + ' ';
if (output !== '')
console.log(output);
else
console.log('no channels subscribed');
return true;
});
// show current server's config
l_add('config', 'show current server\'s config', function (para) {
switch (para[0]) {
case 'project':
console.log(SR.Settings.Project);
break;
default:
console.log(SR.Settings);
break;
}
return true;
});
// show a global variable's states
l_add('show', 'show a global variable\'s states', function (para) {
var name = para[0];
if (!name)
console.log(SR.State.list());
else {
console.log(SR.State.get(name));
}
console.log('\n');
return true;
});
// evaluate an expression at the current server
l_add('eval', 'evaluate an expression at the current server', function (para, raw) {
console.log('command to execute: ' + raw);
try {
eval(raw);
} catch (e) {
console.error(e);
}
console.log('\n');
return true;
});
/*
l_add('stat', 'display current system stat', function () {
var net_out = SR.Stat.get('net_out');
var net_in = SR.Stat.get('net_in');
console.log('network_out: ' + net_out);
console.log('network_in: ' + net_in);
return true;
});
*/
l_add('help', 'help message', function () {
// show all help texts and their respective handler names
for (var name in l_handlers) {
console.log(' ' + name + '\t\t' + l_handlers[name].desc);
}
return true;
});
//-----------------------------------------
// handles keyboard event (including Ctrl-C)
var stdinHandler = function (data) {
//console.log(data);
data = data.toString();
var para = data.replace('\n', ' ').split(' ');
var command = para[0];
var raw_para = data.replace(command, '');
// remove first element as command
para.splice(0, 1);
// check if the command is registered
if (l_handlers.hasOwnProperty(command)) {
// prevent crashing from executing command
if (UTIL.safeCall(l_handlers[command].handler, para, raw_para) === false) {
console.log(' usage: ' + command + ' ' + l_handlers[command].usage);
return;
}
} else
console.log('type \'help\' for a list of commands');
};
// handle console messages
exports.init = function () {
LOG.warn('console input handler installed, total commands: ' + Object.keys(l_handlers).length, 'SR.Console');
// nodejs. 0.8.0+
process.stdin.resume();
process.stdin.on('data', stdinHandler);
};