rules/preview-rule/IAC_misconfiguration_proactive_plugin/lib/index.js (175 lines of code) (raw):

"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const step = __importStar(require("@flow-step/step-toolkit")); const process_1 = __importDefault(require("process")); const util_1 = require("./util"); const params_1 = require("./params"); const ros20190910_1 = __importStar(require("@alicloud/ros20190910")), $ROS20190910 = ros20190910_1; const $OpenApi = __importStar(require("@alicloud/openapi-client")); const $Util = __importStar(require("@alicloud/tea-util")); const promises_1 = __importDefault(require("fs/promises")); const path_1 = __importDefault(require("path")); const config20200907_1 = __importStar(require("@alicloud/config20200907")), $Config20200907 = config20200907_1; function runStep() { var _a, _b; return __awaiter(this, void 0, void 0, function* () { const params = (0, params_1.getParams)(); step.info(`PIPELINE_ID=${params.pipelineID}`); step.info(`PIPELINE_NAME=${params.pipelineName}`); step.info(`BUILD_NUMBER=${params.buildNumber}`); step.info(`WORK_SPACE=${params.workSpace}`); step.info(`PROJECT_DIR=${params.projectDir}`); step.info(`BUILD_JOB_ID=${params.buildJobID}`); step.info(`Init cloudconfig proactive...`); // console.log('process.env', process.env); const stackPath = process_1.default.env["StackPath"]; step.info(`stackPath=${stackPath}`); const regionId = process_1.default.env["RegionId"]; step.info(`regionId=${regionId}`); const enableEvaluate = process_1.default.env["EnableEvaluate"]; step.info(`enableEvaluate=${enableEvaluate}`); const ak = process_1.default.env["AccessKey"]; const sk = process_1.default.env["AccessSecret"]; const sourceCode = yield getCodeFileContent(stackPath); console.log(`sourceCode=${sourceCode}`); let apiConfig = newClientConfig(ak, sk); const stackRespone = yield getPreviewStack(apiConfig, sourceCode); step.info(`stackProperties response=${stackRespone}`); for (const resource of stackRespone) { const resourceJson = JSON.stringify(resource); step.info(`one begin scan resourceJson =${resourceJson}`); let resourceTypeSpec = resource.acsResourceType || ''; step.info(`one resourceTypeSpec =${resourceTypeSpec}`); if (resourceTypeSpec === '') { resourceTypeSpec = (0, util_1.getResourceType)(resource.resourceType || ''); step.info(`one resourceTypeSpec by ros type =${resourceTypeSpec}`); } const proactiveRules = (0, util_1.getProactiveRules)(resourceTypeSpec); step.info(`one proactiveRules =${proactiveRules}`); const resourceProperties = resource.properties || ''; const resourcePropertiesJson = JSON.stringify(resourceProperties); step.info(`one resourceProperties =${resourcePropertiesJson}`); const result = yield evaluateOneResourcePreRules(apiConfig, resourceTypeSpec, proactiveRules, resourcePropertiesJson); step.info(`one evaluatePreRules =${JSON.stringify(result)}`); (_b = (_a = result.body) === null || _a === void 0 ? void 0 : _a.resourceEvaluations) === null || _b === void 0 ? void 0 : _b.forEach(element => { step.info(`one evaluatePreRules element =${JSON.stringify(element)}`); let rules = element.rules || []; rules.forEach(rule => { let identifier = rule.identifier; let complianceType = rule.complianceType; let annotation = rule.annotation; if (complianceType === 'NON_COMPLIANT') { step.error(`evaluatePreRules noncompliant; reason:" ${identifier},${JSON.stringify(annotation)} `); return; } }); }); } }); } /** * 跟进文件名称解析iac文件内容,识别ros的资源stack * @param fileName * @returns */ function getCodeFileContent(fileName) { return __awaiter(this, void 0, void 0, function* () { const filePath = path_1.default.join(process_1.default.env['PROJECT_DIR'], fileName); return promises_1.default.readFile(filePath, 'utf-8'); }); } /** * https://next.api.aliyun.com/api/ROS/2019-09-10/PreviewStack * 获取priviewstack,通过templateBody,解析config识别的预检属性 * @param ak * @param sk * @param templateBody * @returns */ function newClientConfig(ak, sk) { let config = new $OpenApi.Config({ accessKeyId: ak, accessKeySecret: sk, }); return config; } function getPreviewStack(config, templateBody) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { config.endpoint = `ros.aliyuncs.com`; let client = new ros20190910_1.default(config); let previewStackRequest = new $ROS20190910.PreviewStackRequest({ regionId: "cn-shanghai", templateBody: templateBody, stackName: "tmp", }); let runtime = new $Util.RuntimeOptions({}); try { const statckResponse = yield client.previewStackWithOptions(previewStackRequest, runtime); step.info(`PreviewStackResponse result=${statckResponse}`); return ((_b = (_a = statckResponse.body) === null || _a === void 0 ? void 0 : _a.stack) === null || _b === void 0 ? void 0 : _b.resources) || []; } catch (error) { step.info(`stackProperties error=${error}`); return []; } }); } /** * https://next.api.aliyun.com/api/Config/2020-09-07/EvaluatePreConfigRules * @param ak * @param sk * @param resourceType * @param resourceRules * @param resourceProperties * @returns */ function evaluateOneResourcePreRules(config, resourceType, resourceRules, resourceProperties) { return __awaiter(this, void 0, void 0, function* () { config.endpoint = `config.cn-shanghai.aliyuncs.com`; let client = new config20200907_1.default(config); let rules = new Array(); for (const rule of resourceRules) { let one = new $Config20200907.EvaluatePreConfigRulesRequestResourceEvaluateItemsRules({ identifier: rule, }); rules.push(one); } let resourceEvaluateItems0 = new $Config20200907.EvaluatePreConfigRulesRequestResourceEvaluateItems({ resourceLogicalId: "", resourceType: resourceType, rules: rules, resourceProperties: resourceProperties }); let evaluatePreConfigRulesRequest = new $Config20200907.EvaluatePreConfigRulesRequest({ resourceTypeFormat: "ros", resourceEvaluateItems: [ resourceEvaluateItems0 ], }); let runtime = new $Util.RuntimeOptions({}); let result = yield client.evaluatePreConfigRulesWithOptions(evaluatePreConfigRulesRequest, runtime); step.info(`evaluatePreRules result=${JSON.stringify(result)}`); return result; }); } runStep() .then(function () { step.success('run step successfully!'); }) .catch(function (err) { step.error(err.message); process_1.default.exit(-1); }); //# sourceMappingURL=index.js.map