From 578f842eedeb799ef78f2e3ec76676e1cb313996 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Tue, 23 Sep 2014 17:31:29 +0200 Subject: [PATCH] vm.export. --- packages/xo-cli/README.md | 12 +++++ packages/xo-cli/package.json | 10 ++++- packages/xo-cli/src/cli.js | 82 ++++++++++++++++++++++++++++++++++- packages/xo-cli/src/config.js | 16 +++---- 4 files changed, 107 insertions(+), 13 deletions(-) diff --git a/packages/xo-cli/README.md b/packages/xo-cli/README.md index c782268a1..87b96eedb 100644 --- a/packages/xo-cli/README.md +++ b/packages/xo-cli/README.md @@ -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 diff --git a/packages/xo-cli/package.json b/packages/xo-cli/package.json index 9112287db..9c4c982da 100644 --- a/packages/xo-cli/package.json +++ b/packages/xo-cli/package.json @@ -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" }, diff --git a/packages/xo-cli/src/cli.js b/packages/xo-cli/src/cli.js index 53b4fee94..bb528228b 100644 --- a/packages/xo-cli/src/cli.js +++ b/packages/xo-cli/src/cli.js @@ -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; diff --git a/packages/xo-cli/src/config.js b/packages/xo-cli/src/config.js index 47129eade..1e3f41294 100644 --- a/packages/xo-cli/src/config.js +++ b/packages/xo-cli/src/config.js @@ -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)); }); };