import { red } from 'cli-color'; import moment from 'moment'; import { Key } from '../model/keys'; import { isWindows } from './isWindows'; import { updateCreds } from './updateCreds'; import { log } from './log'; // if adding new output types be sure to update getOutputValues.ts export function getKeyOutput( format: string, key: Key, profile: string | undefined, force: boolean | undefined ) { const keyExpires = moment(key.expires).format(); log(`using output format: ${format}`); switch (format) { case 'docker': { let output = `-e AWS_ACCESS_KEY_ID=${key.accessKey} -e AWS_SECRET_ACCESS_KEY=${key.secretKey} -e AWS_SESSION_TOKEN=${key.sessionToken} -e AWS_SESSION_EXPIRES=${keyExpires}`; if (key.changeNumber) { output += ` -e CHANGE_NUMBER=${key.changeNumber}`; } return output; } case 'terraformarg': { let output = `-e ALKS_ACCESS_KEY_ID=${key.accessKey} -e ALKS_SECRET_ACCESS_KEY=${key.secretKey} -e ALKS_SESSION_TOKEN=${key.sessionToken} -e ALKS_SESSION_EXPIRES=${keyExpires}`; if (key.changeNumber) { output += ` -e CHANGE_NUMBER=${key.changeNumber}`; } return output; } case 'tarraformenv': { const cmd = isWindows() ? 'SET' : 'export'; let output = `${cmd} ALKS_ACCESS_KEY_ID=${key.accessKey} && ${cmd} ALKS_SECRET_ACCESS_KEY=${key.secretKey} && ${cmd} ALKS_SESSION_TOKEN=${key.sessionToken} && ${cmd} ALKS_SESSION_EXPIRES=${keyExpires}`; if (key.changeNumber) { output += ` && ${cmd} CHANGE_NUMBER=${key.changeNumber}`; } return output; } case 'json': { const keyData = { accessKey: key.accessKey, secretKey: key.secretKey, sessionToken: key.sessionToken, expires: key.expires, changeNumber: key.changeNumber, // This is the only format using the unformatted "key.expires". This may be a bug but I'm leaving it for the moment for backwards compatibility }; return JSON.stringify(keyData, null, 4); } case 'creds': { if (updateCreds(key, profile, force)) { let msg = 'Your AWS credentials file has been updated'; if (profile) { msg += ` with the named profile: ${profile}`; } return msg; } else { return red( `The ${profile} profile already exists in AWS credentials. Please pass -f to force overwrite.` ); } } case 'idea': { let output = `AWS_ACCESS_KEY_ID=${key.accessKey}\nAWS_SECRET_ACCESS_KEY=${key.secretKey}\nAWS_SESSION_TOKEN=${key.sessionToken}\nAWS_SESSION_EXPIRES=${keyExpires}`; if (key.changeNumber) { output += `\nCHANGE_NUMBER=${key.changeNumber}`; } return output; } case 'powershell': { let output = `$env:AWS_ACCESS_KEY_ID = "${key.accessKey}"; $env:AWS_SECRET_ACCESS_KEY = "${key.secretKey}"; $env:AWS_SESSION_TOKEN = "${key.sessionToken}"; $env:AWS_SESSION_EXPIRES = "${keyExpires}"`; if (key.changeNumber) { output += `; $env:CHANGE_NUMBER = "${key.changeNumber}"`; } return output; } case 'fishshell': { let output = `set -xg AWS_ACCESS_KEY_ID '${key.accessKey}'; and set -xg AWS_SECRET_ACCESS_KEY '${key.secretKey}'; and set -xg AWS_SESSION_TOKEN '${key.sessionToken}'; and set -xg AWS_SESSION_EXPIRES '${keyExpires}'`; if (key.changeNumber) { output += `; and set -xg CHANGE_NUMBER '${key.changeNumber}'`; } return output; } case 'aws': { const awsOutput: any = { Version: 1, AccessKeyId: key.accessKey, SecretAccessKey: key.secretKey, SessionToken: key.sessionToken, Expiration: moment(key.expires).toISOString(), }; if (key.changeNumber) { awsOutput.ChangeNumber = key.changeNumber; } return JSON.stringify(awsOutput); } case 'linux': { // forces export format let output = `export AWS_ACCESS_KEY_ID=${key.accessKey} && export AWS_SECRET_ACCESS_KEY=${key.secretKey} && export AWS_SESSION_TOKEN=${key.sessionToken} && export AWS_SESSION_EXPIRES=${keyExpires}`; if (key.changeNumber) { output += ` && export CHANGE_NUMBER='${key.changeNumber}'`; } return output; } case 'export': // fall through to default case case 'set': default: { console.error( 'WARNING: Because this tool runs in a subshell, it cannot set environment variables in the parent shell. To use these keys, copy the commands printed below and run them in your current shell to have these environment variables set' ); const cmd = isWindows() || format === 'set' ? 'SET' : 'export'; let output = `${cmd} AWS_ACCESS_KEY_ID=${key.accessKey} && ${cmd} AWS_SECRET_ACCESS_KEY=${key.secretKey} && ${cmd} AWS_SESSION_TOKEN=${key.sessionToken} && ${cmd} AWS_SESSION_EXPIRES=${keyExpires}`; if (key.changeNumber) { output += ` && ${cmd} CHANGE_NUMBER='${key.changeNumber}'`; } return output; } } }