@hotglue/cli
Version:
hotglue CLI tools
188 lines (153 loc) • 5.79 kB
JavaScript
;
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;