lxc
Version:
Linux containers (LXC) NodeJS wrapper
204 lines (178 loc) • 5.89 kB
JavaScript
module.exports = function(config){
var obj = {};
var child = require('child'),
config = config || {},
sshBind = config.sshBind || false;
//http://stackoverflow.com/questions/10530532/
function textToArgs(s){
var words = [];
s.replace(/"([^"]*)"|'([^']*)'|(\S+)/g,function(g0,g1,g2,g3){ words.push(g1 || g2 || g3 || '')});
return words
}
var sysExec = function(command, onData, onClose){
onData = onData || function(){}
onClose = onClose || function(){}
if (sshBind != false)
{
var runCommand = sshBind.slice();
runCommand.push(command)
} else {
var runCommand = textToArgs(command);
}
var errors = '';
child({
command: runCommand.slice(0,1)[0],
args: runCommand.slice(1),
cbStdout: function(data){ onData(''+data) },
cbStderr: function(data){ errors+=data; onData(''+data) },
cbClose: function(exitCode){ onClose(exitCode == 0 ? null:exitCode, errors) }
}).start()
}
obj.create = function(name, template, config, cbComplete, cbData){
sysExec('lxc-create -n '+name+' -t '+template, cbComplete, cbData);
}
obj.destroy = function(name, cbComplete, cbData){
sysExec('lxc-destroy -n '+ name, cbComplete, cbData);
}
obj.start = function(name, cb){
var output = '';
sysExec('lxc-start -n ' + name + ' -d',
function(data) {
output += data;
}, function() {
var error;
if (output.indexOf('no configuration file') >= 0) {
error = new Error("Container does not exist");
}
cb(error, output);
}
);
};
obj.stop = function(name, cb){
var output = '';
sysExec('lxc-stop -n ' + name,
function(data) {
output += data;
}, function(error) {
cb(error, output);
}
);
};
obj.freeze = function(name, cbComplete, cbData){
sysExec('lxc-freeze -n '+name, cbComplete, cbData);
}
obj.unfreeze = function(name, cbComplete, cbData){
sysExec('lxc-unfreeze -n '+name, cbComplete, cbData);
}
/**
* creates a new snapshot
* @param name
* @param cbComplete
* @param cbData
*/
obj.createSnapshot = function(name, cbComplete, cbData){
sysExec('lxc-snapshot -n '+name, cbComplete, cbData);
}
/**
* deletes a snapshot
* @param name
* @param snapshotName
* @param cbComplete
* @param cbData
*/
obj.deleteSnapshot = function(name, snapshotName, cbComplete, cbData){
sysExec('lxc-snapshot -n '+name+' -d '+snapshotName, cbComplete, cbData);
}
/**
* restores a snapshot
* @param name
* @param snapshotName
* @param newName [optional] name of restored lxc.
* @param cbComplete
* @param cbData
*/
obj.restoreSnapshot = function(name, snapshotName, newName, cbComplete, cbData){
if(typeof newName === 'function'){
cbData = cbComplete;
cbComplete = newName;
newName = name;
}
sysExec('lxc-snapshot -n '+name+' -r '+snapshotName+" -N "+newName, cbComplete, cbData);
}
/**
* Lists all snapshots
* @param name
* @param cbComplete
* @param cbData
*/
obj.listSnapshots = function(name, cbComplete, cbData){
var output = '';
sysExec('lxc-snapshot -L -n '+name, function(data){output+=data}, function(error){
output = output.split("\n");
var ret = [];
output.forEach(function(line){
line = line.split(" ");
ret.push({
name: line[0],
dir: line[1],
date: line[2]+" "+line[3]
});
});
return ret;
});
}
/**
* returns machine's ip
* @param name
* @param cbComplete
*/
obj.getIP = function(name, cbComplete) {
var output = '';
sysExec('lxc-info -H -i -n '+name, function(data){output+=data}, function(error){
cbComplete(error, output);
});
}
/**
* Wrapper for lxc-attach command
* @param name
* @param command
* @param cbComplete
*/
obj.attach = function(name, command, cbComplete) {
var output = '';
sysExec('lxc-attach -n '+name+' -- '+command, function(data){output+=data}, function(error){
cbComplete(error, output);
});
}
obj.list = function(cb){
var output = '';
sysExec('lxc-ls -f',
function(data) {
output += data;
}, function(error){
var containers = {};
output = output.split("\n");
for (i in output) {
var content = output[i].trim();
if (content.indexOf('RUNNING') >= 0 ||
content.indexOf('FROZEN') >= 0 ||
content.indexOf('STOPPED') >= 0) {
vals = content.split(/\s+/gi);
if (vals.length >= 2) {
containers[vals[0]] = {
"name": vals[0],
"state": vals[1],
"autostart": vals[2],
"groups": vals[3],
"ipv4": vals[4],
"ipv6": vals[5]
};
}
}
}
cb(error, containers);
}
);
}
return obj;
}