This repository has been archived on 2020-01-20. You can view files and clone it, but cannot push or open issues or pull requests.
node-spearhead/lib/do_env.js

173 lines
4.9 KiB
JavaScript
Raw Permalink Normal View History

2015-11-25 02:40:17 +02:00
/*
* Copyright 2016 Joyent Inc.
2015-11-25 02:40:17 +02:00
*
* `triton env ...`
*/
var assert = require('assert-plus');
var format = require('util').format;
var fs = require('fs');
var path = require('path');
2015-11-25 02:40:17 +02:00
var strsplit = require('strsplit');
var sshpk = require('sshpk');
var vasync = require('vasync');
var common = require('./common');
var errors = require('./errors');
var mod_config = require('./config');
function do_env(subcmd, opts, args, cb) {
var self = this;
2015-11-25 02:40:17 +02:00
if (opts.help) {
this.do_help('help', {}, [subcmd], cb);
return;
}
if (args.length > 1) {
return cb(new errors.UsageError('too many arguments'));
}
var profileName = args[0] || this.tritonapi.profile.name;
var allClientTypes = ['triton', 'docker', 'smartdc'];
2016-01-12 20:27:46 +02:00
var clientTypes = [];
var explicit;
var shortOpts = '';
2016-01-12 20:27:46 +02:00
if (opts.triton) {
shortOpts += 't';
2016-01-12 20:27:46 +02:00
clientTypes.push('triton');
}
if (opts.docker) {
shortOpts += 'd';
clientTypes.push('docker');
}
if (opts.smartdc) {
shortOpts += 's';
clientTypes.push('smartdc');
}
2016-01-12 20:27:46 +02:00
if (clientTypes.length === 0) {
explicit = false;
2016-01-12 20:27:46 +02:00
clientTypes = allClientTypes;
} else {
explicit = true;
2015-11-25 02:40:17 +02:00
}
try {
var profile = mod_config.loadProfile({
configDir: this.configDir,
name: profileName
});
} catch (err) {
return cb(err);
}
if (profile.name === this.tritonapi.profile.name) {
this._applyProfileOverrides(profile);
}
var p = console.log;
2016-01-12 20:27:46 +02:00
clientTypes.forEach(function (clientType) {
switch (clientType) {
case 'triton':
p('export TRITON_PROFILE="%s"', profile.name);
break;
case 'docker':
var setupJson = path.resolve(self.configDir, 'docker',
common.profileSlug(profile), 'setup.json');
if (fs.existsSync(setupJson)) {
var setup;
try {
setup = JSON.parse(fs.readFileSync(setupJson));
} catch (err) {
cb(new errors.ConfigError(err, format(
'error determining Docker environment from "%s": %s',
setupJson, err)));
return;
}
Object.keys(setup.env).forEach(function (key) {
var val = setup.env[key];
if (val === null) {
p('unset %s', key);
} else {
p('export %s=%s', key, val);
}
});
} else if (explicit) {
cb(new errors.ConfigError(format('could not find Docker '
+ 'environment setup for profile "%s":\n Run `triton '
+ 'profile docker-setup %s` to setup.',
profile.name, profile.name)));
}
break;
2016-01-12 20:27:46 +02:00
case 'smartdc':
p('export SDC_URL="%s"', profile.url);
p('export SDC_ACCOUNT="%s"', profile.account);
if (profile.user) {
p('export SDC_USER="%s"', profile.user);
} else {
p('unset SDC_USER');
}
p('export SDC_KEY_ID="%s"', profile.keyId);
if (profile.insecure) {
p('export SDC_TESTING="%s"', profile.insecure);
} else {
p('unset SDC_TESTING');
}
break;
default:
return cb(new errors.InternalError(
'unknown clientType: ' + clientType));
2015-11-25 02:40:17 +02:00
}
2016-01-12 20:27:46 +02:00
});
p('# Run this command to configure your shell:');
p('# eval "$(triton env%s%s)"',
(shortOpts ? ' -'+shortOpts : ''),
(profile.name === this.tritonapi.profile.name
? '' : ' ' + profile.name));
2015-11-25 02:40:17 +02:00
}
do_env.options = [
{
names: ['help', 'h'],
type: 'bool',
help: 'Show this help.'
},
2016-01-12 20:27:46 +02:00
{
names: ['triton', 't'],
type: 'bool',
help: 'Emit environment commands for node-triton itself (i.e. the ' +
'"TRITON_PROFILE" variable).'
},
{
names: ['docker', 'd'],
type: 'bool',
help: 'Emit environment commands for docker ("DOCKER_HOST" et al).'
},
{
names: ['smartdc', 's'],
type: 'bool',
help: 'Emit environment for node-smartdc (i.e. the "SDC_*" variables).'
2015-11-25 02:40:17 +02:00
}
];
2016-01-12 20:27:46 +02:00
// TODO: support env for docker usage.
2015-11-25 02:40:17 +02:00
do_env.help = [
/* BEGIN JSSTYLED */
'Emit shell environment commands to setup clients for a particular CLI profile.',
'',
2016-01-12 20:27:46 +02:00
'Supported "clients" here are: node-smartdc (i.e. the `sdc-*` tools),',
'and node-triton itself. By default this emits the environment for all',
'supported tools. Use options to be specific.',
2015-11-25 02:40:17 +02:00
'',
'Usage:',
' {{name}} env [PROFILE]',
'',
'{{options}}'
/* END JSSTYLED */
].join('\n');
do_env.hidden = true;
module.exports = do_env;