windows-service-controller
Version:
Windows service controller.
221 lines (184 loc) • 6.47 kB
JavaScript
var _ = require('lodash');
_.mixin(require('underscore.string').exports());
function qualifyUNCPath(path) {
return '\\\\' + _.ltrim(path, '\\');
}
function getArgs(args, fixed) {
argsIn = _.toArray(args);
var server, options;
if (_.isObject(_.last(argsIn)) && !_.isArray(_.last(argsIn)))
options = argsIn.pop();
if (argsIn.length === fixed) server = argsIn.shift();
var argsOut = {
args: argsIn,
options: options || {}
};
if (server) argsOut.server = server;
return argsOut;
}
function buildCommand(commandName, server, argsIn, successCodes) {
var argsOut = [];
if (server) argsOut.push(qualifyUNCPath(server));
argsOut.push(commandName);
if (argsIn) {
if (_.isArray(argsIn))
argsOut.push.apply(argsOut, argsIn);
else argsOut.push(argsIn);
}
return {
path: 'sc',
args: argsOut,
successCodes: successCodes || []
};
}
function buildSimpleCommand(commandName, args, fixed, buffer) {
var argsIn = getArgs(args, fixed);
if (buffer) argsIn.args.push(String(buffer));
return buildCommand(commandName, argsIn.server, argsIn.args);
}
function addArg(args, name, value) {
if (value) args.push(name + '=', String(value));
}
function toYesNo(value) {
if (value === true) return 'yes';
if (value === false) return 'no';
return value;
}
function toSlashSeperated(value) {
return value ? value.join('/') : value;
}
function buildControlCommand(args, commandName, successCodes) {
var argsIn = getArgs(args, 2);
var services = _.isArray(argsIn.args[0]) ? argsIn.args[0] : [ argsIn.args[0] ];
var command = _.merge({
command: commandName,
commands: services.map(function(service) {
var argsOut = [ service ];
if (argsIn.options.args) argsOut.push.apply(argsOut, argsIn.options.args);
var command = buildCommand(commandName, argsIn.server, argsOut, successCodes);
command.service = service;
if (argsIn.server) command.server = argsIn.server;
return command;
})
}, argsIn.options);
if (argsIn.server) command.server = argsIn.server;
return command;
}
function addConfigArgs(args, options) {
addArg(args, 'type', options.type);
addArg(args, 'type', options.interact);
addArg(args, 'start', options.start);
addArg(args, 'error', options.error);
addArg(args, 'binpath', options.binpath);
addArg(args, 'group', options.group);
addArg(args, 'tag', toYesNo(options.tag));
addArg(args, 'depend', toSlashSeperated(options.depend));
addArg(args, 'obj', options.obj);
addArg(args, 'displayname', options.displayname);
addArg(args, 'password', options.password);
}
// ********** Control *******************
exports.start = function(args) {
return buildControlCommand(args, 'start', [ 1056 ]);
};
exports.pause = function(args) {
return buildControlCommand(args, 'pause');
};
exports.continue = function(args) {
return buildControlCommand(args, 'continue');
};
exports.stop = function(args) {
return buildControlCommand(args, 'stop', [ 1062 ]);
};
exports.control = function(args) {
return buildSimpleCommand('control', args, 3);
};
exports.interrogate = function(args) {
return buildSimpleCommand('interrogate', args, 2);
};
// ********** Management *******************
exports.create = function(args) {
var argsIn = getArgs(args, 2);
var argsOut = [ argsIn.args[0] ];
addConfigArgs(argsOut, argsIn.options);
return buildCommand('create', argsIn.server, argsOut);
};
exports.getDisplayName = function(args) {
return buildSimpleCommand('getdisplayname', args, 2, 4096);
};
exports.getKeyName = function(args) {
return buildSimpleCommand('getkeyname', args, 2, 4096);
};
exports.getDescription = function(args) {
return buildSimpleCommand('qdescription', args, 2, 8192);
};
exports.setDescription = function(args) {
return buildSimpleCommand('description', args, 3);
};
exports.getDependencies = function(args) {
return buildSimpleCommand('enumdepend', args, 2, 262144);
};
exports.setDescriptor = function(args) {
return buildSimpleCommand('sdset', args, 3);
};
exports.getDescriptor = function(args) {
return buildSimpleCommand('sdshow', args, 2);
};
exports.getConfig = function(args) {
return buildSimpleCommand('qc', args, 2, 8192);
};
exports.setConfig = function(args) {
var argsIn = getArgs(args, 2);
var argsOut = [ argsIn.args[0] ];
addConfigArgs(argsOut, argsIn.options);
return buildCommand('config', argsIn.server, argsOut);
};
exports.getFailureConfig = function(args) {
return buildSimpleCommand('qfailure', args, 2, 8192);
};
exports.setFailureConfig = function(args) {
var argsIn = getArgs(args, 2);
var argsOut = [ argsIn.args[0] ];
var options = argsIn.options;
addArg(argsOut, 'reset', options.reset);
addArg(argsOut, 'reboot', options.reboot);
addArg(argsOut, 'command', options.command);
if (options.actions) {
var actions = [];
if (options.actions.restart)
actions.push('restart', options.actions.restart);
if (options.actions.run)
actions.push('run', options.actions.run);
if (options.actions.reboot)
actions.push('reboot', options.actions.reboot);
if (actions.length > 0)
addArg(argsOut, 'actions', toSlashSeperated(actions));
}
return buildCommand('failure', argsIn.server, argsOut);
};
exports.query = function(args) {
var argsIn = getArgs(args, 1);
var argsOut = [];
if (argsIn.options.name) argsOut.push(argsIn.options.name);
else {
addArg(argsOut, 'type', argsIn.options.class);
addArg(argsOut, 'type', argsIn.options.type);
addArg(argsOut, 'state', argsIn.options.state);
addArg(argsOut, 'group', argsIn.options.group);
addArg(argsOut, 'bufsize', 262144);
}
return buildCommand('queryex', argsIn.server, argsOut);
};
exports.delete = function(args) {
return buildSimpleCommand('delete', args, 2);
};
// ********** System *******************
exports.setBoot = function(args) {
return buildSimpleCommand('boot', args, 2);
};
exports.lock = function(args) {
return buildSimpleCommand('lock', args, 1);
};
exports.getLock = function(args) {
return buildSimpleCommand('querylock', args, 1);
};