Merge pull request #2 from wmantly/new

New
This commit is contained in:
William Mantly 2016-01-29 17:43:01 -05:00
commit b67c251e89
2 changed files with 128 additions and 167 deletions

184
lxc.js
View File

@ -1,129 +1,91 @@
module.exports = function(config){ module.exports = function(config){
var obj = {}; var obj = {};
var cmd = require('node-cmd'); var cmd = require('node-cmd');
var sysExec = function(command, callback){ var sysExec = function(command, callback){
// console.log('sysExec: ', command, '||| callback:', callback) // console.log('sysExec: ', command, '||| callback:', callback)
cmd.get('unset XDG_SESSION_ID XDG_RUNTIME_DIR; cgm movepid all virt $$; '+command, callback) cmd.get('unset XDG_SESSION_ID XDG_RUNTIME_DIR; cgm movepid all virt $$; '+command, callback)
} }
/* var obj = {};
var child = require('child'),
sshBind = config.sshBind || false;
//http://stackoverflow.com/questions/10530532/ obj.create = function(name, template, config, cbComplete){
function textToArgs(s){ sysExec('lxc-create -n '+name+' -t '+template, cbComplete);
var words = []; };
s.replace(/"([^"]*)"|'([^']*)'|(\S+)/g,function(g0,g1,g2,g3){ words.push(g1 || g2 || g3 || '')});
return words;
}
var sysExec = function(command, onData, onClose){ obj.clone = function(name, base_name, cbComplete, cbData){
sysExec('lxc-clone -o '+base_name+ ' -n '+name +' -B overlayfs -s', cbComplete, cbData);
};
onData = onData || function(){}; obj.destroy = function(name, callback){
onClose = onClose || function(){}; sysExec('lxc-destroy -n '+ name, function(data){
callback(!data.match(/Destroyed container/))
});
};
if (sshBind != false) obj.start = function(name, callback){
{ var cmd = 'lxc-start --name '+name+' --daemon';
var runCommand = sshBind.slice(); console.log('start cmd\n', cmd, '\n');
runCommand.push(command); sysExec(cmd, callback);
} else { };
var runCommand = textToArgs('unset XDG_SESSION_ID XDG_RUNTIME_DIR; cgm movepid all virt $$; '+command);
}
var errors = ''; obj.startEphemeral = function(name, base_name, callback){
var output = '';
sysExec('lxc-start-ephemeral -o '+base_name+ ' -n '+name +' --union-type overlayfs -d', function(data){
if(data.match("doesn't exist.")) return callback({status: 500, error: "doesn't exist."});
if(data.match("already exists.")) return callback({status: 500, error: "already exists"});
if(data.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)) return callback({status: 200, state:'RUNNING', ip: data.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)[0]});
callback({'?': '?', data: data, name: name, base_name: base_name});
});
};
child({ obj.stop = function(name, callback){
command: runCommand.slice(0,1)[0], console.log('stop', name);
args: runCommand.slice(1), sysExec('lxc-stop -n '+ name, callback);
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){ obj.freeze = function(name, callback){
sysExec('lxc-create -n '+name+' -t '+template, cbComplete); sysExec('lxc-freeze -n '+name, callback);
}; };
obj.clone = function(name, base_name, cbComplete, cbData){ obj.unfreeze = function(name, callback){
sysExec('lxc-clone -o '+base_name+ ' -n '+name +' -B overlayfs -s', cbComplete, cbData); sysExec('lxc-unfreeze -n '+name, callback);
}; };
obj.destroy = function(name, callback){ obj.info = function(name, callback){
sysExec('lxc-destroy -n '+ name, function(data){ var output = '';
callback(!data.match(/Destroyed container/)) sysExec('lxc-info -n '+name, function(data){
}); console.log('info', name, data)
}; if(data.match("doesn't exist")) return callback({state: 'NULL'});
var info = {};
data = data.replace(/\suse/ig, '').replace(/\sbytes/ig, '').split("\n").slice(0,-1);
for(var i in data){
var temp = data[i].split(/\:\s+/);
info[temp[0].toLowerCase().trim()] = temp[1].trim();
}
callback(info);
});
};
obj.start = function(name, callback){ obj.list = function(callback){
var cmd = 'lxc-start --name '+name+' --daemon'; sysExec('lxc-ls --fancy', function(data){
console.log('start cmd\n', cmd, '\n'); var output = data.split("\n");
sysExec(cmd, callback); var keys = output.splice(0,1)[0].split(/\s+/).slice(0,-1);
}; var info = [];
obj.startEphemeral = function(name, base_name, callback){ keys = keys.map(function(v){return v.toLowerCase()});
output = output.slice(0).splice(1).slice(0,-1);
var output = ''; for (var i in output)
sysExec('lxc-start-ephemeral -o '+base_name+ ' -n '+name +' --union-type overlayfs -d', function(data){ {
if(data.match("doesn't exist.")) return callback({status: 500, error: "doesn't exist."});
if(data.match("already exists.")) return callback({status: 500, error: "already exists"});
if(data.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)) return callback({status: 200, state:'RUNNING', ip: data.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)[0]});
callback({'?': '?', data: data, name: name, base_name: base_name});
});
};
obj.stop = function(name, callback){ var aIn = output[i].split(/\s+/).slice(0,-1),
console.log('stop', name); mapOut = {};
sysExec('lxc-stop -n '+ name, callback); aIn.map( function(v,i){ mapOut[keys[i]] = v; } );
}; info.push(mapOut);
}
callback(info);
});
};
obj.freeze = function(name, cbComplete, cbData){ return obj;
sysExec('lxc-freeze -n '+name, cbComplete, cbData);
};
obj.unfreeze = function(name, cbComplete, cbData){
sysExec('lxc-unfreeze -n '+name, cbComplete, cbData);
};
obj.info = function(name, callback){
var output = '';
sysExec('lxc-info -n '+name, function(data){
console.log('info', name, data)
if(data.match("doesn't exist")) return callback({state: 'NULL'});
var info = {};
data = data.replace(/\suse/ig, '').replace(/\sbytes/ig, '').split("\n").slice(0,-1);
for(var i in data){
var temp = data[i].split(/\:\s+/);
info[temp[0].toLowerCase().trim()] = temp[1].trim();
}
callback(info);
});
};
obj.list = function(callback){
sysExec('lxc-ls --fancy', function(data){
var output = data.split("\n");
var keys = output.splice(0,1)[0].split(/\s+/).slice(0,-1);
var info = [];
keys = keys.map(function(v){return v.toLowerCase()});
output = output.slice(0).splice(1).slice(0,-1);
for (var i in output)
{
var aIn = output[i].split(/\s+/).slice(0,-1),
mapOut = {};
aIn.map( function(v,i){ mapOut[keys[i]] = v; } );
info.push(mapOut);
}
callback(info);
});
};
return obj;
}; };

File diff suppressed because one or more lines are too long