UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

289 lines 25.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EndevorRestUtils = void 0; const imperative_1 = require("@zowe/imperative"); const index_1 = require("../index"); const fs = require("fs"); const path = require("path"); class EndevorRestUtils { static setInstance(args) { let requestInstance = args.instance; if (requestInstance == null) { requestInstance = ""; } return requestInstance; } static setupEndevorSession(args_1) { return __awaiter(this, arguments, void 0, function* (args, doPrompting = true) { var _a, _b; let basePath = (_a = args.basePath) !== null && _a !== void 0 ? _a : index_1.ApiConstants.BASE_PATH; if (basePath.startsWith("/")) basePath = basePath.substring(1, basePath.length); if (basePath.endsWith("/")) basePath = basePath.substring(0, basePath.length - 1); let sessCfg = { hostname: args.host, port: args.port, rejectUnauthorized: args.rejectUnauthorized, basePath, protocol: (_b = args.protocol) !== null && _b !== void 0 ? _b : "https" }; if (args.user && args.password) { sessCfg.user = args.user; sessCfg.password = args.password; sessCfg.type = imperative_1.SessConstants.AUTH_TYPE_BASIC; } else if (args.tokenType && args.tokenValue) { sessCfg.type = imperative_1.SessConstants.AUTH_TYPE_TOKEN; sessCfg.tokenType = args.tokenType; sessCfg.tokenValue = args.tokenValue; } sessCfg = yield imperative_1.ConnectionPropsForSessCfg.addPropsOrPrompt(sessCfg, args, { doPrompting }); const errorStack = []; if (sessCfg.hostname == null) { errorStack.push("host"); } if (sessCfg.port == null) { errorStack.push("port"); } if (sessCfg.user == null && sessCfg.password == null && sessCfg.tokenType == null && sessCfg.tokenValue == null) { errorStack.push("credentials"); } if (errorStack.length > 0) { throw new imperative_1.ImperativeError({ msg: "Missing specification for " + errorStack.join(", ") }); } return new imperative_1.Session(sessCfg); }); } static setupEndevorSessionWithoutCredential(args) { var _a, _b; const sessionHostname = args.host; const sessionPort = args.port; const sessionProtocol = args.protocol; const sessionRejectUnauthorized = (_a = args["reject-unauthorized"]) !== null && _a !== void 0 ? _a : false; let sessionBasePath = (_b = args["base-path"]) !== null && _b !== void 0 ? _b : index_1.ApiConstants.BASE_PATH; const errorStack = []; if (sessionHostname == null) { errorStack.push("host"); } if (sessionPort == null) { errorStack.push("port"); } if (errorStack.length > 0) { throw new imperative_1.ImperativeError({ msg: "Missing specification for " + errorStack.join(", ") }); } if (sessionBasePath.startsWith("/")) sessionBasePath = sessionBasePath.substring(1, sessionBasePath.length); if (sessionBasePath.endsWith("/")) sessionBasePath = sessionBasePath.substring(0, sessionBasePath.length - 1); return new imperative_1.Session({ hostname: sessionHostname, port: Number(sessionPort), protocol: sessionProtocol, rejectUnauthorized: sessionRejectUnauthorized, basePath: sessionBasePath }); } static writeConsoleOutput(session, instance, reportURIs, isWriteReport, logStack, reportFileName, reportDir, suppressInfo, appendToFile) { return __awaiter(this, void 0, void 0, function* () { let reports = ""; const reportResult = {}; const reportIds = Object.keys(reportURIs); if (reportIds.length > 0) { yield Promise.all(reportIds.map((reportId) => __awaiter(this, void 0, void 0, function* () { const reportURI = reportURIs[reportId]; if (reportURI != null) reportResult[reportId] = yield index_1.EndevorRestClient.getReport(session, instance, reportURI); }))); for (const repId of reportIds) { const title = (reports.length > 0 ? "\n" : "") + `//\n// ${repId} - url: ${reportURIs[repId]}\n//\n\n`; reports = reports.concat(title, reportResult[repId]); } if (isWriteReport) { const now = new Date(); if (reportFileName == null || reportFileName == undefined) { if (reportDir == null || reportDir == undefined) { reportDir = "."; } if (!fs.existsSync(reportDir)) { fs.mkdirSync(reportDir); } if (!reportDir.endsWith("/") && !reportDir.endsWith("\\")) { reportDir = reportDir + "/"; } reportFileName = reportDir + index_1.ApiConstants.REPORT_FILE_NAME_PREFIX + index_1.EndevorUtils.formatDate(now, false) + "-" + index_1.EndevorUtils.formatTime(now, true, "") + ".txt"; } else { if (path.isAbsolute(reportFileName)) { if (!(reportDir == null || reportDir == undefined)) { logStack.push(`[WARN] Report file defined using absolute path (${reportFileName}), report directory parameter ignored.`); } } else { if (!(reportDir == null || reportDir == undefined)) { if (!fs.existsSync(reportDir)) { fs.mkdirSync(reportDir); } if (!reportDir.endsWith("/") && !reportDir.endsWith("\\")) { reportDir = reportDir + "/"; } reportFileName = reportDir + reportFileName; } } } if (appendToFile == null || !appendToFile) { index_1.EndevorUtils.generalWriteFile(reportFileName, reports); } else { index_1.EndevorUtils.generalAppendFile(reportFileName, reports); } if (suppressInfo == null || !suppressInfo) { logStack.push(`[INFO] Endevor reports written in ${reportFileName}`); } } } return reports; }); } static isThisV1(session) { var _a; return ((_a = session.ISession.basePath) === null || _a === void 0 ? void 0 : _a.match(/\/rest\/?[^/]*\/?$|\/api\/v1\/?[^/]*\/?$/)) != null; } static failIfUsingV1(session) { if (EndevorRestUtils.isThisV1(session)) { throw new imperative_1.ImperativeError({ msg: "Endevor REST API v1 Not Supported", errorCode: "1", additionalDetails: "base-path '" + session.ISession.basePath + "' points to version 1 of the Endevor REST API, please update the base-path to use /api/v2 ." }); } } static isThisApiMl(session) { var _a; return !((_a = session.ISession.basePath) === null || _a === void 0 ? void 0 : _a.includes("EndevorService")); } static getHeaderLinks(resHeader) { const links = resHeader === null || resHeader === void 0 ? void 0 : resHeader.link; const retLinks = {}; if (links != null) { links.split(", ").forEach((link) => { const m = link.match(/<?([^>]*)>(.*)rel="(.*)".*/); if (m != null) { const url = m[1]; const rel = m[3]; retLinks[rel] = url; } }); } return retLinks; } static queryParameterString(resource, payload) { if (payload == null) { return resource; } const query = []; for (const key of Object.keys(payload)) { if (payload[key]) { if (key === "status") { const statusStr = payload[key]; if (statusStr.search(",")) { const statusArray = statusStr.split(","); statusArray.forEach((status) => { query.push(`status=${status.trim()}`); }); } else { query.push(`status=${payload[key]}`); } } else { query.push(`${key}=${encodeURIComponent(payload[key])}`); } } } resource += query.length > 0 ? "?" + query.join("&") : ""; return resource; } static isEndevorRestResponseBody(str) { try { const data = JSON.parse(str); if ("returnCode" in data && "reasonCode" in data && "reports" in data && "data" in data) { return true; } else { return false; } } catch (e) { return false; } } static isHTTPProtocolError(errorString, session) { if (errorString === "Bad Request\r\nThis combination of host and port requires TLS.\r\n" && session.ISession.protocol === "http") { return true; } else return false; } static reportIdToURL(id) { return `/reports/${id}`; } static reportIdToURLV1(session, id) { return `${session.ISession.protocol}://${session.ISession.hostname}:${session.ISession.port}/endevor/reports/${id}`; } static addFileToFormData(formData, parmName, path, charset) { const readStream = fs.createReadStream(path); this.addFileStreamToFormData(formData, parmName, readStream, charset); } static addFileStreamToFormData(formData, parmName, inputSteam, charset) { formData.append(parmName, inputSteam, { contentType: `application/octet-stream; charset="${charset}"` }); } static isSemVer(input) { const result = !input.split(".").some((part) => { return isNaN(parseInt(part)); }); return result; } static isSemVerGreater(input1, input2) { var _a, _b; const parts1 = input1.split("."); const parts2 = input2.split("."); let i = 0; while (i < parts1.length && i < parts2.length) { const part1 = parseInt((_a = parts1[i]) !== null && _a !== void 0 ? _a : "0"); const part2 = parseInt((_b = parts2[i]) !== null && _b !== void 0 ? _b : "0"); if (part1 > part2) return true; if (part1 < part2) return false; i++; } return false; } } exports.EndevorRestUtils = EndevorRestUtils; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5kZXZvclJlc3RVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvdXRpbHMvRW5kZXZvclJlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUF1QkEsaURBTzBCO0FBQzFCLG9DQVFrQjtBQUNsQix5QkFBMEI7QUFDMUIsNkJBQThCO0FBVTlCLE1BQWEsZ0JBQWdCO0lBVXBCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBd0I7UUFDaEQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVwQyxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBWU0sTUFBTSxDQUFPLG1CQUFtQjs2REFBQyxJQUF1QixFQUFFLFdBQVcsR0FBRyxJQUFJOztZQUNqRixJQUFJLFFBQVEsR0FBRyxNQUFBLElBQUksQ0FBQyxRQUFRLG1DQUFJLG9CQUFZLENBQUMsU0FBUyxDQUFDO1lBR3ZELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsUUFBUSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoRixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBU2xGLElBQUksT0FBTyxHQUFhO2dCQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUMzQyxRQUFRO2dCQUNSLFFBQVEsRUFB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