vm.export.
This commit is contained in:
parent
a7dea95f90
commit
578f842eed
@ -58,6 +58,18 @@ E.g., adding a new server:
|
||||
|
||||
The return value is the identifier of this new server in XO.
|
||||
|
||||
##### VM export
|
||||
|
||||
```
|
||||
> xo-cli vm.export vm=a01667e0-8e29-49fc-a550-17be4226783c > vm.xva
|
||||
```
|
||||
|
||||
##### VM import
|
||||
|
||||
```
|
||||
> xo-cli vm.import host=60a6939e-8b0a-4352-9954-5bde44bcdf7d < vm.xva
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are *very* welcome, either on the documentation or on
|
||||
|
@ -25,12 +25,20 @@
|
||||
"dependencies": {
|
||||
"bluebird": "^2.2.2",
|
||||
"chalk": "^0.5.1",
|
||||
"exec-promise": "^0.3.0",
|
||||
"event-to-promise": "^0.3.1",
|
||||
"exec-promise": "^0.5.0",
|
||||
"got": "^1.2.0",
|
||||
"human-format": "^0.1.3",
|
||||
"l33teral": "^2.0.4",
|
||||
"lodash.assign": "^2.4.1",
|
||||
"lodash.foreach": "^2.4.1",
|
||||
"lodash.isobject": "^2.4.1",
|
||||
"lodash.keys": "^2.4.1",
|
||||
"lodash.pairs": "^2.4.1",
|
||||
"mkdirp": "^0.5.0",
|
||||
"multiline": "^0.3.4",
|
||||
"progress-stream": "^0.5.0",
|
||||
"sent": "^1.1.0",
|
||||
"xdg": "^0.1.1",
|
||||
"xo-lib": "^0.2.0"
|
||||
},
|
||||
|
@ -2,13 +2,24 @@
|
||||
|
||||
//====================================================================
|
||||
|
||||
require('superstack');
|
||||
|
||||
var Bluebird = require('bluebird');
|
||||
Bluebird.longStackTraces();
|
||||
|
||||
var resolveUrl = require('url').resolve;
|
||||
|
||||
var chalk = require('chalk');
|
||||
var eventToPromise = require('event-to-promise');
|
||||
var forEach = require('lodash.foreach');
|
||||
var getKeys = require('lodash.keys');
|
||||
var got = require('got');
|
||||
var humanFormat = require('human-format');
|
||||
var isObject = require('lodash.isobject');
|
||||
var multiline = require('multiline');
|
||||
var pairs = require('lodash.pairs');
|
||||
var progressStream = require('progress-stream');
|
||||
var sent = require('sent');
|
||||
var Xo = require('xo-lib');
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@ -37,6 +48,35 @@ function connect() {
|
||||
});
|
||||
}
|
||||
|
||||
function pipeWithErrors(streams) {
|
||||
var current;
|
||||
|
||||
forEach(streams, function (stream) {
|
||||
if (!stream) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (current) {
|
||||
current.on('error', function forwardError(error) {
|
||||
stream.emit('error', error);
|
||||
});
|
||||
current = current.pipe(stream);
|
||||
}
|
||||
else {
|
||||
current = stream;
|
||||
}
|
||||
});
|
||||
|
||||
return current;
|
||||
}
|
||||
|
||||
function printProgress(progress) {
|
||||
console.warn('%s downloaded at %s/s',
|
||||
humanFormat(progress.transferred),
|
||||
humanFormat(progress.speed)
|
||||
);
|
||||
}
|
||||
|
||||
function wrap(val) {
|
||||
return function wrappedValue() {
|
||||
return val;
|
||||
@ -186,7 +226,9 @@ function call(args) {
|
||||
if (!(matches = arg.match(PARAM_RE))) {
|
||||
throw 'invalid arg: '+arg;
|
||||
}
|
||||
var name = matches[1];
|
||||
var value = matches[2];
|
||||
|
||||
if (value === 'true') {
|
||||
value = true;
|
||||
}
|
||||
@ -194,11 +236,47 @@ function call(args) {
|
||||
value = false;
|
||||
}
|
||||
|
||||
params[matches[1]] = value;
|
||||
params[name] = value;
|
||||
});
|
||||
|
||||
var baseUrl;
|
||||
return connect().then(function (xo) {
|
||||
baseUrl = xo._url;
|
||||
return xo.call(method, params);
|
||||
}).then(function handleResult(result) {
|
||||
var keys, key, url;
|
||||
if ((
|
||||
isObject(result) &&
|
||||
(keys = getKeys(result)).length === 1
|
||||
)) {
|
||||
key = keys[0];
|
||||
|
||||
if (key === '$getFrom') {
|
||||
url = resolveUrl(baseUrl, result[key]);
|
||||
|
||||
return eventToPromise(pipeWithErrors([
|
||||
got(url),
|
||||
progressStream({ time: 1e3 }, printProgress),
|
||||
process.stdout,
|
||||
]), 'finish');
|
||||
}
|
||||
|
||||
if (key === '$sendTo') {
|
||||
url = resolveUrl(baseUrl, result[key]);
|
||||
|
||||
return new Bluebird(function (resolve, reject) {
|
||||
sent(url, process.stdin, function (error, result) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
}
|
||||
exports.call = call;
|
||||
|
@ -2,14 +2,14 @@
|
||||
|
||||
//====================================================================
|
||||
|
||||
var fs = require('fs');
|
||||
var promisify = require('bluebird').promisify;
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
var readFile = promisify(require('fs').readFile);
|
||||
var writeFile = promisify(require('fs').writeFile);
|
||||
|
||||
var _ = require('lodash');
|
||||
var assign = require('lodash.assign');
|
||||
var l33t = require('l33teral');
|
||||
var mkdirp = require('mkdirp');
|
||||
var Promise = require('bluebird');
|
||||
var mkdirp = promisify(require('mkdirp'));
|
||||
var xdg = require('xdg');
|
||||
|
||||
//====================================================================
|
||||
@ -17,10 +17,6 @@ var xdg = require('xdg');
|
||||
var configPath = xdg.basedir.configPath('xo-cli');
|
||||
var configFile = configPath +'/config.json';
|
||||
|
||||
var mkdirp = Promise.promisify(mkdirp);
|
||||
var readFile = Promise.promisify(fs.readFile);
|
||||
var writeFile = Promise.promisify(fs.writeFile);
|
||||
|
||||
//====================================================================
|
||||
|
||||
var load = exports.load = function () {
|
||||
@ -43,7 +39,7 @@ var save = exports.save = function (config) {
|
||||
|
||||
exports.set = function (data) {
|
||||
return load().then(function (config) {
|
||||
return save(_.extend(config, data));
|
||||
return save(assign(config, data));
|
||||
});
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user