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.
|
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
|
## Contributing
|
||||||
|
|
||||||
Contributions are *very* welcome, either on the documentation or on
|
Contributions are *very* welcome, either on the documentation or on
|
||||||
|
@ -25,12 +25,20 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bluebird": "^2.2.2",
|
"bluebird": "^2.2.2",
|
||||||
"chalk": "^0.5.1",
|
"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",
|
"l33teral": "^2.0.4",
|
||||||
|
"lodash.assign": "^2.4.1",
|
||||||
"lodash.foreach": "^2.4.1",
|
"lodash.foreach": "^2.4.1",
|
||||||
|
"lodash.isobject": "^2.4.1",
|
||||||
|
"lodash.keys": "^2.4.1",
|
||||||
"lodash.pairs": "^2.4.1",
|
"lodash.pairs": "^2.4.1",
|
||||||
"mkdirp": "^0.5.0",
|
"mkdirp": "^0.5.0",
|
||||||
"multiline": "^0.3.4",
|
"multiline": "^0.3.4",
|
||||||
|
"progress-stream": "^0.5.0",
|
||||||
|
"sent": "^1.1.0",
|
||||||
"xdg": "^0.1.1",
|
"xdg": "^0.1.1",
|
||||||
"xo-lib": "^0.2.0"
|
"xo-lib": "^0.2.0"
|
||||||
},
|
},
|
||||||
|
@ -2,13 +2,24 @@
|
|||||||
|
|
||||||
//====================================================================
|
//====================================================================
|
||||||
|
|
||||||
|
require('superstack');
|
||||||
|
|
||||||
var Bluebird = require('bluebird');
|
var Bluebird = require('bluebird');
|
||||||
Bluebird.longStackTraces();
|
Bluebird.longStackTraces();
|
||||||
|
|
||||||
|
var resolveUrl = require('url').resolve;
|
||||||
|
|
||||||
var chalk = require('chalk');
|
var chalk = require('chalk');
|
||||||
|
var eventToPromise = require('event-to-promise');
|
||||||
var forEach = require('lodash.foreach');
|
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 multiline = require('multiline');
|
||||||
var pairs = require('lodash.pairs');
|
var pairs = require('lodash.pairs');
|
||||||
|
var progressStream = require('progress-stream');
|
||||||
|
var sent = require('sent');
|
||||||
var Xo = require('xo-lib');
|
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) {
|
function wrap(val) {
|
||||||
return function wrappedValue() {
|
return function wrappedValue() {
|
||||||
return val;
|
return val;
|
||||||
@ -186,7 +226,9 @@ function call(args) {
|
|||||||
if (!(matches = arg.match(PARAM_RE))) {
|
if (!(matches = arg.match(PARAM_RE))) {
|
||||||
throw 'invalid arg: '+arg;
|
throw 'invalid arg: '+arg;
|
||||||
}
|
}
|
||||||
|
var name = matches[1];
|
||||||
var value = matches[2];
|
var value = matches[2];
|
||||||
|
|
||||||
if (value === 'true') {
|
if (value === 'true') {
|
||||||
value = true;
|
value = true;
|
||||||
}
|
}
|
||||||
@ -194,11 +236,47 @@ function call(args) {
|
|||||||
value = false;
|
value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
params[matches[1]] = value;
|
params[name] = value;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var baseUrl;
|
||||||
return connect().then(function (xo) {
|
return connect().then(function (xo) {
|
||||||
|
baseUrl = xo._url;
|
||||||
return xo.call(method, params);
|
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;
|
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 l33t = require('l33teral');
|
||||||
var mkdirp = require('mkdirp');
|
var mkdirp = promisify(require('mkdirp'));
|
||||||
var Promise = require('bluebird');
|
|
||||||
var xdg = require('xdg');
|
var xdg = require('xdg');
|
||||||
|
|
||||||
//====================================================================
|
//====================================================================
|
||||||
@ -17,10 +17,6 @@ var xdg = require('xdg');
|
|||||||
var configPath = xdg.basedir.configPath('xo-cli');
|
var configPath = xdg.basedir.configPath('xo-cli');
|
||||||
var configFile = configPath +'/config.json';
|
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 () {
|
var load = exports.load = function () {
|
||||||
@ -43,7 +39,7 @@ var save = exports.save = function (config) {
|
|||||||
|
|
||||||
exports.set = function (data) {
|
exports.set = function (data) {
|
||||||
return load().then(function (config) {
|
return load().then(function (config) {
|
||||||
return save(_.extend(config, data));
|
return save(assign(config, data));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user