UNPKG

@broadcom/endevor-for-zowe-cli

Version:

Endevor Plug-in for Zowe CLI

291 lines 25.8 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) { const requestInstance = args.instance; if (requestInstance == null) { throw new imperative_1.ImperativeError({ msg: "Missing arguments or location profile specification for instance" }); } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW5kZXZvclJlc3RVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvdXRpbHMvRW5kZXZvclJlc3RVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUF1QkEsaURBTzBCO0FBQzFCLG9DQVFrQjtBQUNsQix5QkFBMEI7QUFDMUIsNkJBQThCO0FBVTlCLE1BQWEsZ0JBQWdCO0lBVXBCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBd0I7UUFDaEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUV0QyxJQUFJLGVBQWUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksNEJBQWUsQ0FBQztnQkFDeEIsR0FBRyxFQUFFLGtFQUFrRTthQUN4RSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQVlNLE1BQU0sQ0FBTyxtQkFBbUI7NkRBQUMsSUFBdUIsRUFBRSxXQUFXLEdBQUcsSUFBSTs7WUFDakYsSUFBSSxRQUFRLEdBQUcsTUFBQSxJQUFJLENBQUMsUUFBUSxtQ0FBSSxvQkFBWSxDQUFDLFNBQVMsQ0FBQztZQUd2RCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUFFLFFBQVEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEYsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxRQUFRLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQVNsRixJQUFJLE9BQU8sR0FBYTtnQkFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2Ysa0JBQWtCLEVBQUUsSUFB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