UNPKG

@broadcom/mat-detect-for-zowe-cli

Version:

MAT Detect plug-in for Zowe CLI

192 lines 18.1 kB
"use strict"; /* * Copyright (c) 2019 Broadcom. All Rights Reserved. The term * "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. * * This software and all information contained therein is * confidential and proprietary and shall not be duplicated, * used, disclosed, or disseminated in any way except as * authorized by the applicable license agreement, without the * express written permission of Broadcom. All authorized * reproductions must be marked with this language. * * EXCEPT AS SET FORTH IN THE APPLICABLE LICENSE AGREEMENT, TO * THE EXTENT PERMITTED BY APPLICABLE LAW, BROADCOM PROVIDES THIS * SOFTWARE WITHOUT WARRANTY OF ANY KIND, INCLUDING WITHOUT * LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL BROADCOM * BE LIABLE TO THE END USER OR ANY THIRD PARTY FOR ANY LOSS OR * DAMAGE, DIRECT OR INDIRECT, FROM THE USE OF THIS SOFTWARE, * INCLUDING WITHOUT LIMITATION, LOST PROFITS, BUSINESS * INTERRUPTION, GOODWILL, OR LOST DATA, EVEN IF BROADCOM IS * EXPRESSLY ADVISED OF SUCH LOSS OR DAMAGE. */ 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 }); const imperative_1 = require("@zowe/imperative"); const cli_1 = require("@zowe/cli"); const util_1 = require("util"); const fs = require("fs"); const mustache = require("mustache"); const PMAProfileValidationPlan = require("../../PMAProfileValidationPlan"); const ErrorValidationPlan = require("../../ErrorValidationPlan"); /** * "pma get-alert " Get today's performance alert information. * @export * @class SubmitJobHandler * @implements {ICommandHandler} */ class SharedSubmitHandler { /** * Command handler process * @param {IHandlerParameters} params - Command handler parameters * @returns {Promise<void>} - Fulfilled when the command completes successfully OR rejected with imperative error * @memberof SubmitDataSetHandler */ process(params) { return __awaiter(this, void 0, void 0, function* () { // Save the needed parameters for convenience this.console = params.response.console; this.data = params.response.data; this.arguments = params.arguments; const parms = { jclSource: undefined, viewAllSpoolContent: this.arguments.viewAllSpoolContent, }; parms.viewAllSpoolContent = true; // setting default viewspool true // Read parm from config/default.json file // const pmaProfile: IProfile = params.profiles.get("pma", false); const sysparm = { job_acct: params.arguments.job_acct, job_class: params.arguments.job_class, job_mclass: params.arguments.job_mclass, dsn_steplib: params.arguments.job_load, dsn_ksdsexc: params.arguments.job_pmahlq, }; // sysparm.job_class = ErrorValidationPlan.valarg(params.arguments.job_class, pmaProfile.job_class); // sysparm.job_mclass = ErrorValidationPlan.valarg(params.arguments.job_mclass, pmaProfile.job_mclass); // sysparm.job_acct = ErrorValidationPlan.valarg(params.arguments.job_acct, pmaProfile.job_acct); // sysparm.dsn_steplib = ErrorValidationPlan.valarg(params.arguments.job_load, pmaProfile.job_load); // sysparm.dsn_ksdsexc = ErrorValidationPlan.valarg(params.arguments.job_pmahlq, pmaProfile.job_pmahlq); if (!(0, util_1.isNullOrUndefined)(sysparm.dsn_ksdsexc)) { sysparm.dsn_ksdsexc = sysparm.dsn_ksdsexc + ".KSDSEXC"; } // validating pma parameters provided const errorClass = PMAProfileValidationPlan.checkJobClass(sysparm.job_class); const errorMClass = PMAProfileValidationPlan.checkJobMClass(sysparm.job_mclass); const errorAcct = PMAProfileValidationPlan.checkJobAcct(sysparm.job_acct); const errorJob = PMAProfileValidationPlan.checkDsName(sysparm.dsn_ksdsexc); const errorLib = PMAProfileValidationPlan.checkDsName(sysparm.dsn_steplib); if ((0, util_1.isNullOrUndefined)(errorJob) && (0, util_1.isNullOrUndefined)(errorLib) && (0, util_1.isNullOrUndefined)(errorClass) && (0, util_1.isNullOrUndefined)(errorMClass) && (0, util_1.isNullOrUndefined)(errorAcct)) { // this.profile = params.profiles.get("zosmf", true); sysparm.dsn_steplib = sysparm.dsn_steplib.toUpperCase(); sysparm.dsn_ksdsexc = sysparm.dsn_ksdsexc.toUpperCase(); sysparm.job_class = PMAProfileValidationPlan.toUpperclass(sysparm.job_class); sysparm.job_mclass = PMAProfileValidationPlan.toUpperclass(sysparm.job_mclass); yield this.sub_process(params, parms, sysparm); } else { ErrorValidationPlan.throwparmerror(errorJob, "KSDSEXC"); ErrorValidationPlan.throwparmerror(errorLib, "lib"); ErrorValidationPlan.throwparmerror(errorClass, "class"); ErrorValidationPlan.throwparmerror(errorMClass, "Mclass"); ErrorValidationPlan.throwparmerror(errorAcct, "Acct"); } }); } sub_process(params, parms, sysparm) { return __awaiter(this, void 0, void 0, function* () { let apiObj; // API Object to set in the command JSON response let spoolFilesResponse; // Response from view all spool content option // Create a z/OSMF session & submit the JCL const sessCfg = cli_1.ZosmfSession.createSessCfgFromArgs(params.arguments); const sessCfgWithCreds = yield imperative_1.ConnectionPropsForSessCfg.addPropsOrPrompt(sessCfg, params.arguments, { parms: params }); const session = new cli_1.imperative.Session(sessCfgWithCreds); const Fileavail = yield cli_1.List.dataSet(session, sysparm.dsn_steplib, { /* test */}); const Fileavail1 = yield cli_1.List.dataSet(session, sysparm.dsn_ksdsexc, { /* test */}); // checking profile data is valid or not if ((Fileavail.apiResponse.items.length > 0) && (Fileavail1.apiResponse.items.length > 0)) { const path = require("path"); const k = -22; const cliLib = __dirname.slice(0, k); let cliJcl = path.join("zossrc", "jcl", "GetListpgms.jcl"); let cliBuild = cliLib; cliJcl = cliLib + cliJcl; // if the build folde not created if (!fs.existsSync(cliBuild + "/build")) { fs.mkdirSync(cliBuild + "/build"); } cliBuild = cliBuild + "/build/GetListpgms.jcl"; // Reading the jcl template and updating with default.json values const jcl = fs.readFileSync(cliJcl).toString(); const rndrracf = mustache.render(jcl, sysparm); fs.writeFileSync(cliBuild, rndrracf); const jobText = fs.readFileSync(cliBuild).toString(); try { apiObj = yield cli_1.SubmitJobs.submitJclString(session, jobText, parms); } catch (error) { // error } // source = "jobname"; if (parms.viewAllSpoolContent === true) { spoolFilesResponse = apiObj; } // Print the response to the command if ((0, util_1.isNullOrUndefined)(spoolFilesResponse)) { params.response.format.output({ fields: ["jobid", "retcode", "jobname", "status"], output: apiObj, format: "object" }); // Set the API object to the correct this.data.setObj(apiObj); // Print data from spool content } else { yield this.sub_process3(params, apiObj, spoolFilesResponse); } params.response.progress.endBar(); this.data.setMessage(`Submitted JCL jobname "PMAPERF"`); } else { ErrorValidationPlan.throwfileerrorALT(Fileavail.apiResponse.items.length, "lib", sysparm.dsn_steplib); ErrorValidationPlan.throwfileerrorALT(Fileavail1.apiResponse.items.length, "KSDSEXC", sysparm.dsn_ksdsexc); } }); } sub_process3(params, apiObj, spoolFilesResponse) { return __awaiter(this, void 0, void 0, function* () { let APCTAB_FOUND = "NO"; const JESMSGLG_CHECK = "NO"; for (const spoolFile of spoolFilesResponse) { if (spoolFile.ddName === "KSDSOUT") { APCTAB_FOUND = "YES"; spoolFile.data = spoolFile.data.replace("ŸPGM", " PGM"); spoolFile.data = spoolFile.data.replace("Ÿ-------", "--------"); const lastchar = spoolFile.data[spoolFile.data.length - 2]; if (lastchar === "+") { this.console.log(`No Programs added`); } else { this.console.log(spoolFile.data); } } } ErrorValidationPlan.throwjeserrorALT(APCTAB_FOUND, JESMSGLG_CHECK, "PMASCOP", "jobname1"); // Set the API object to the correct this.data.setObj(spoolFilesResponse); }); } } exports.default = SharedSubmitHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2V0bGlzdHBnbS5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NsaS9zY29wZS9nZXRfbGlzdF9wZ20vR2V0bGlzdHBnbS5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7Ozs7Ozs7OztBQUVILGlEQUE0RztBQUM1RyxtQ0FBdUU7QUFFdkUsK0JBQXlDO0FBQ3pDLHlCQUF5QjtBQUN6QixxQ0FBcUM7QUFDckMsMkVBQTRFO0FBQzVFLGlFQUFrRTtBQUVsRTs7Ozs7R0FLRztBQUNILE1BQXFCLG1CQUFtQjtJQTBDcEM7Ozs7O09BS0c7SUFDVSxPQUFPLENBQUMsTUFBMEI7O1lBQzNDLDZDQUE2QztZQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFpQjtnQkFDeEIsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CO2FBQzFELENBQUM7WUFDRixLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLENBQUUsaUNBQWlDO1lBRXBFLDBDQUEwQztZQUMxQyxrRUFBa0U7WUFDbEUsTUFBTSxPQUFPLEdBQUc7Z0JBQ1osUUFBUSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUTtnQkFDbkMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUztnQkFDckMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVTtnQkFDdkMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUTtnQkFD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