UNPKG

kuber-cli

Version:
127 lines (109 loc) 4.37 kB
var sh = require('exec-sh'); var path = require('path'); var fs = require('fs'); var os = require('os'); var chalk = require('chalk'); var which = require('which'); var docker = which.sync('docker'); var Spinner = require('cli-spinner').Spinner; var spinner = new Spinner('Loading container... %s '); spinner.setSpinnerString('⣾⣽⣻⢿⡿⣟⣯⣷'); function getKubernetesCliContainer(isHelpCommand) { spinner.start(); return new Promise((resolve, reject) => { sh(`docker pull blackbaudcfm/kubernetes-cli-container:latest`, true, (err, stderr, stdout) => { if (err) reject(err.message); spinner.stop(true); console.info( chalk.green('Executing command inside ') + chalk.white('blackbaudcfm/kubernetes-cli-container:latest') + (isHelpCommand ? '' : "\n") ); resolve(); }); }); } function enableWin7() { if (os.platform() == 'win32' && os.release().indexOf('6.1') === 0) { return new Promise((resolve, reject) => { console.log('If docker commands fail, you may need to run: docker-machine env --shell powershell'); resolve(); }); } return Promise.resolve(); } function runCommand(command) { var homedir = require('os').homedir(); var kuberPath = path.join(homedir, '.kuber'); if (!fs.existsSync(kuberPath)) { fs.mkdirSync(kuberPath); } var azurePath = path.join(kuberPath, '.azure'); if (!fs.existsSync(azurePath)) { fs.mkdirSync(azurePath); } if (os.platform() == 'win32') { kuberPath = kuberPath .replace(/\\/g, '/') .replace(/^([A-Za-z]{1})\:/, '/$1/'); } else { // on non-Windows platforms, enable access to docker from within container kuberPath = `/var/run/docker.sock:/var/run/docker.sock -v ${kuberPath}`; } command = command.trim(); var isHelpCommand = command.indexOf('--help ') >= 0 ||command.indexOf(' --help') == command.length - 7; var versionString = require('../package.json').version; versionString = 'v' + versionString; versionString = padRight(versionString, 8, ' '); return enableWin7() .then(() => getKubernetesCliContainer(isHelpCommand)) .then(() => new Promise((resolve, reject) => { if (isHelpCommand) { console.info( chalk.green(` ██ ▄█▀ █ ██ ▄▄▄▄ ▓█████ ██▀███ ██▄█▒ ██ ▓██▒▓█████▄ ▓█ ▀ ▓██ ▒ ██▒ ▓███▄░ ▓██ ▒██░▒██▒ ▄██▒███ ▓██ ░▄█ ▒ ▓██ █▄ ▓▓█ ░██░▒██░█▀ ▒▓█ ▄ ▒██▀▀█▄ ▒██▒ █▄▒▒█████▓ ░▓█ ▀█▓░▒████▒░██▓ ▒██▒ ▒ ▒▒ ▓▒░▒▓▒ ▒ ▒ ░▒▓███▀▒░░ ▒░ ░░ ▒▓ ░▒▓░ ░ ░▒ ▒░░░▒░ ░ ░ ▒░▒ ░ ░ ░ ░ ░▒ ░ ▒░ ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ` + chalk.bgGreen.black(' by blackbaud ') + ` ░ ` + versionString + ` ░ ░`) ); } var portMappings = []; if (command.indexOf('proxy') === 0) { portMappings.push('-p 18001:18001'); } if (command.toLowerCase() === 'bash') { // use whatever shell is default inside container command = ''; } else if (command.indexOf('az account set') === 0 || command.indexOf('az account list') === 0) { // add a space, set output to table // allows user to set their azure subscription command = ' ' + command + ' -o table'; } else { command = ` kubernetes-cli ${command}`; } sh(`docker run --rm -it -u 0 -e KUBER_IS_CLI=true ${portMappings.join(' ')} -v ${kuberPath}/.azure:/kubernetes-cli/.azure blackbaudcfm/kubernetes-cli-container:latest${command}`, {}, (err) => { if (err) reject(); resolve(); }) })); } function padRight(s, c, n) { if (! s || ! c || s.length >= n) return s; var max = (n - s.length) / c.length; for (var i = 0; i < max; i++) { s += c; } return s; } module.exports = { getKubernetesCliContainer: getKubernetesCliContainer, runCommand: runCommand };