UNPKG

@hotglue/cli

Version:
188 lines (153 loc) 5.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handler = exports.desc = exports.command = exports.builder = void 0; var _path = _interopRequireDefault(require("path")); var _promises = require("fs/promises"); var _fs = require("fs"); var _debug = _interopRequireDefault(require("../../helpers/debug")); var _ora = _interopRequireDefault(require("ora")); var _cliTable = _interopRequireDefault(require("cli-table")); var _awsSdk = _interopRequireDefault(require("aws-sdk")); var _eachSeries = _interopRequireDefault(require("async/eachSeries")); var _descriptions = _interopRequireDefault(require("../../helpers/descriptions")); var _print = require("../../helpers/print"); var _api = require("../../helpers/api"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const debug = (0, _debug.default)('commands:jobs:download'); const command = 'download <jobroot>'; exports.command = command; const desc = 'Download Job files'; exports.desc = desc; const builder = async yargs => { debug('builder', command); return yargs.option('downloadTo', _descriptions.default.options['downloadTo'].config); // .option('jobroot', descriptions.options['jobroot'].config) // .demandOption('jobroot', descriptions.options['jobroot'].demandText) }; exports.builder = builder; const handler = async argv => { debug('handler', command, argv); const { hg, json, apikey, env, jobroot, downloadTo } = argv; const { clientApiBaseUri } = hg; let message; let spinner = (0, _ora.default)(); try { // 1. get STS credentials message = (0, _print.themed)(`Verifying user and authorizing`); !json && spinner.start((0, _print.themed)(`In progress: ${message}...`, 'secondary')); const { accessKeyId, secretAccessKey, sessionToken } = await (0, _api.genCredentialsOnClientApi)({ debug, baseUri: clientApiBaseUri, task: 'job-download', env, apikey, jobroot }); // get data from AWS bucket const s3 = new _awsSdk.default.S3({ accessKeyId, secretAccessKey, sessionToken }); !json && spinner.succeed((0, _print.themed)(`Finished: ${message}.`, 'secondary')); // 2. get list of available files message = (0, _print.themed)(`Scanning for downloadable files`); !json && spinner.start((0, _print.themed)(`In progress: ${message}...`, 'secondary')); const params = { Bucket: env, Prefix: jobroot }; const { Contents: filesList } = await s3.listObjectsV2(params).promise(); debug('res', filesList); if (!filesList || filesList.length === 0) { if (json) { (0, _print.printJSON)({ status: 'error', error: 'Nothing to download!' }); } else { spinner.fail((0, _print.themed)(`Error: ${message}.`, 'secondary')); (0, _print.pr)((0, _print.themed)(`Message: ${(0, _print.themed)('Nothing to download!')}`, 'secondary')); } return; } !json && spinner.succeed((0, _print.themed)(`Finished: ${message}.`, 'secondary')); if (!json) { // print remote files const table = new _cliTable.default({ head: ['File', 'Size', 'LastModified'] }); filesList.forEach(item => { const subPath = item.Key.substring(jobroot.length + 1); // const details = { LastModified: item.LastModified, Size: item.Size }; table.push([subPath, item.Size, item.LastModified.toLocaleString('en-US')]); // JSON.stringify(details, undefined, 2)]); }); console.log(table.toString()); } // 3. download job files one-by-one const localRoot = _path.default.resolve(process.cwd(), downloadTo, _path.default.basename(jobroot)); await (0, _eachSeries.default)( // Filter out tap/target config files filesList.filter(({ Key }) => { // Filter out all *-config.json files in the root of "jobroo" const regex = new RegExp(`${jobroot}/([^\/]+)-config\.json`); return !regex.test(Key); }), async item => { message = (0, _print.themed)(`Downloading file: ${(0, _print.themed)(item.Key, 'info')}`); !json && spinner.start((0, _print.themed)(`In progress: ${message}...`, 'secondary')); const file = _path.default.resolve(localRoot, item.Key.substring(jobroot.length + 1)); debug('file', file); // ensure destination folder exists await (0, _promises.mkdir)(_path.default.dirname(file), { recursive: true }); // download s3 object into destination folder const fileStream = s3.getObject({ Bucket: env, Key: item.Key }).createReadStream(); const writableStream = (0, _fs.createWriteStream)(file, { flags: 'w' }); fileStream.pipe(writableStream); !json && spinner.succeed((0, _print.themed)(`Finished: ${message}.`, 'secondary')); }); // print final success message if (json) { (0, _print.printJSON)({ status: 'success', downloadedFiles: filesList.map(({ Key }) => Key) }); } else { message = (0, _print.themed)(`Downloading job files.`); spinner.succeed((0, _print.themed)(`Finished: ${message}`, 'secondary')); } } catch (err) { if (json) { (0, _print.printJSON)({ status: 'error', error: err }); } else { spinner.fail((0, _print.themed)(`Error: ${message}.`, 'secondary')); (0, _print.pr)((0, _print.themed)(`Message: ${(0, _print.themed)(err.message)}`, 'secondary')); debug(err); if (err && err.response && err.response.data) { debug('response', err.response.data); } } } }; exports.handler = handler;