UNPKG

nor-upcloud

Version:
292 lines (234 loc) 6.96 kB
#!/usr/bin/env node var PATH = require('path'); var Q = require('q'); var util = require('util'); var debug = require('nor-debug'); var is = require('nor-is'); var VIEWS = {}; var COMMANDS = {}; Q.fcall(function() { var config_file = PATH.resolve(process.env.HOME, '.nor-upcloud-cli.json'); var config = require(config_file); var Upcloud = require('./index.js'); var argv = require('minimist')(process.argv.slice(2)); argv.view = argv.view || 'table'; debug.assert(argv.view).is('string'); // Init var UP = new Upcloud.API( config.upcloud ); // Execute COMMANDS return argv._.map(function(cmd) { return function do_command() { if(is.func(COMMANDS[cmd])) { return COMMANDS[cmd].call(UP, argv).then(function(data) { return VIEWS[argv.view](data); }).then(function(data) { console.log(data); }); } else { throw new TypeError("No command: " + cmd); } }; }).reduce(Q.when, Q()); }).fail(function(err) { console.log('ERROR: ' + err); if(err.stack) { if(process.env.DEBUG_NOR_UPCLOUD_CLI !== undefined) { debug.log(err.stack); } } }).done(); /** Server list command */ COMMANDS['server-list'] = function up_server_list() { var UP = this; return UP.server(); }; /** Server start command */ COMMANDS['server-start'] = function up_server_start(opts) { opts = opts || {}; var which = opts.uuid || opts.hostname || opts.title; debug.assert(which).is('string'); var UP = this; return UP.server().then(function(data) { debug.assert(data).is('object'); debug.assert(data.servers).is('object'); debug.assert(data.servers.server).is('object'); var servers = data.servers.server; debug.assert(servers).is('array'); var servers_map = {}; servers.forEach(function(server) { servers_map[ server.uuid ] = server; servers_map[ server.hostname ] = server; servers_map[ server.title ] = server; }); var server = servers_map[which]; if(server.state === 'started') { throw new TypeError('server already started: ' + server.hostname); } return server.start().then(function() { server.state = 'started'; return server; }); }); }; /** Server stop command */ COMMANDS['server-stop'] = function up_server_stop(opts) { opts = opts || {}; var which = opts.uuid || opts.hostname || opts.title; debug.assert(which).is('string'); var UP = this; return UP.server().then(function(data) { debug.assert(data).is('object'); debug.assert(data.servers).is('object'); debug.assert(data.servers.server).is('object'); var servers = data.servers.server; debug.assert(servers).is('array'); var servers_map = {}; servers.forEach(function(server) { servers_map[ server.uuid ] = server; servers_map[ server.hostname ] = server; servers_map[ server.title ] = server; }); var server = servers_map[which]; if(server.state === 'stopped') { throw new TypeError('server already stopped: ' + server.hostname); } return server.stop().then(function() { server.state = 'stopped'; return server; }); }); }; /** Get server defails */ COMMANDS['server-info'] = function up_server_info(opts) { opts = opts || {}; var which = opts.uuid || opts.hostname || opts.title; debug.assert(which).is('string'); var UP = this; return UP.server().then(function(data) { debug.assert(data).is('object'); debug.assert(data.servers).is('object'); debug.assert(data.servers.server).is('object'); var servers = data.servers.server; debug.assert(servers).is('array'); var servers_map = {}; servers.forEach(function(server) { servers_map[ server.uuid ] = server; servers_map[ server.hostname ] = server; servers_map[ server.title ] = server; }); var server = servers_map[which]; return server.getInfo(); }); }; /** Set server defails */ COMMANDS['server-set'] = function up_server_info(opts) { opts = opts || {}; var which = opts.uuid || opts.hostname || opts.title; debug.assert(which).is('string'); var UP = this; return UP.server().then(function(data) { debug.assert(data).is('object'); debug.assert(data.servers).is('object'); debug.assert(data.servers.server).is('object'); var servers = data.servers.server; debug.assert(servers).is('array'); var servers_map = {}; servers.forEach(function(server) { servers_map[ server.uuid ] = server; servers_map[ server.hostname ] = server; servers_map[ server.title ] = server; }); var server = servers_map[which]; debug.assert(server.uuid).is('uuid'); var data = {}; var accepted_keys = []; if(opts.uuid !== undefined) { accepted_keys.push('hostname'); accepted_keys.push('title'); } else if(opts.hostname !== undefined) { accepted_keys.push('title'); } accepted_keys.push('boot_order'); accepted_keys.push('core_number'); accepted_keys.push('firewall'); accepted_keys.push('memory_amount'); accepted_keys.push('nic_model'); accepted_keys.push('timezone'); accepted_keys.push('video_model'); accepted_keys.push('vnc'); accepted_keys.push('vnc_password'); accepted_keys.forEach(function(key) { if(opts[key] !== undefined) { data[key] = opts[key]; } }); return server.modify(data); }); }; /** JSON data view */ VIEWS.json = function view_json(data) { return Q.fcall(function stringify_json() { return JSON.stringify(data, null, 2) + '\n'; }); }; /** Table data view */ VIEWS.table = function view_table(data) { /* Print array as table */ function do_table(arr, title) { var map_of_keys = {}; arr.forEach(function(obj) { Object.keys(obj).filter(function(key) { return key[0] !== '_'; }).forEach(function(key) { map_of_keys[key] = true; }); }); var keys = Object.keys(map_of_keys); keys.sort(); return ['=== ' + title + ' ==='].concat( [keys.join(' | ')] ).concat( [keys.map(function(k) { return '----'; }).join(' | ')] ).concat( arr.map(function(obj) { return keys.map(function(key) { return util.inspect( obj[key] ).replace(/\n/g, " "); }).join(' | '); }) ).join('\n'); } if(is.array(data)) { return do_table(data, 'root'); } if(!is.obj(data)) { return 'root = ' + util.inspect(data); } return Object.keys(data).map(function(key) { var value = data[key]; if(is.array(value)) { return do_table(value, [key].join('.')); } if(!is.obj(value)) { return [key].join('.') + ' = ' + util.inspect(value); } return Object.keys(value).map(function(key2) { var value2 = value[key2]; if(is.array(value2)) { return do_table(value2, [key, key2].join('.')); } if(!is.obj(value2)) { return [key, key2].join('.') + ' = ' + util.inspect(value2); } return Object.keys(value2).map(function(key3) { var value3 = value2[key3]; if(is.array(value3)) { return do_table(value3, [key, key2, key3].join('.')); } return [key, key2, key3].join('.') + ' = ' + util.inspect(value3); }).join('\n'); }).join('\n'); }).join('\n'); }; /* EOF */