UNPKG

@csermet/multiprovider

Version:

cloud-graph provider plugin for AWS used to fetch AWS cloud data.

166 lines (165 loc) 5.94 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const sdk_1 = require("@cloudgraph/sdk"); const cloudtrail_1 = __importDefault(require("aws-sdk/clients/cloudtrail")); const groupBy_1 = __importDefault(require("lodash/groupBy")); const isEmpty_1 = __importDefault(require("lodash/isEmpty")); const utils_1 = require("../../utils"); const errorLog_1 = __importDefault(require("../../utils/errorLog")); const format_1 = require("../../utils/format"); const serviceName = 'CloudTrail'; const errorLog = new errorLog_1.default(serviceName); const endpoint = utils_1.initTestEndpoint(serviceName); const getTrailArnData = async (cloudTrail, region) => { try { const trailList = []; let trails = await cloudTrail.listTrails().promise(); trailList.push(...trails.Trails); let nextToken = trails.NextToken; while (nextToken) { trails = await cloudTrail .listTrails({ NextToken: nextToken, }) .promise(); trailList.push(...trails.Trails); nextToken = trails.NextToken; } const trailNameList = trailList .filter(trail => trail.HomeRegion === region) .map(trail => trail.TrailARN); return trailNameList; } catch (err) { errorLog.generateAwsErrorLog({ functionName: 'cloudTrail:getTrailArnData', err, }); } return []; }; const listTrailData = async (cloudTrail, trailArnList) => { try { // If we dont have any trail arns, dont get trail data (this will return all trails and lead to dups) if (isEmpty_1.default(trailArnList)) { return []; } const { trailList = [] } = await cloudTrail .describeTrails({ trailNameList: trailArnList, includeShadowTrails: true, }) .promise(); return trailList; } catch (err) { errorLog.generateAwsErrorLog({ functionName: 'cloudTrail:listTrailData', err, }); } return []; }; const listTrailTagData = async (cloudTrail, ResourceIdList) => { const resourceTagList = []; for (const cloudTrailArn of ResourceIdList) { try { let resourceTags = await cloudTrail .listTags({ ResourceIdList: [cloudTrailArn] }) .promise(); resourceTagList.push(...resourceTags.ResourceTagList); let nextToken = resourceTags.NextToken; while (nextToken) { resourceTags = await cloudTrail .listTags({ ResourceIdList: [cloudTrailArn], NextToken: nextToken, }) .promise(); resourceTagList.push(...resourceTags.ResourceTagList); nextToken = resourceTags.NextToken; } } catch (err) { errorLog.generateAwsErrorLog({ functionName: 'cloudTrail:listTrailTagData', err, }); } } return resourceTagList; }; const getTrailStatus = async (cloudTrail, { TrailARN }) => { try { const data = await cloudTrail.getTrailStatus({ Name: TrailARN }).promise(); return data; } catch (err) { errorLog.generateAwsErrorLog({ functionName: 'cloudTrail:getTrailStatus', err, }); } return null; }; const getEventSelectors = async (cloudTrail, { TrailARN }) => { try { const { EventSelectors: eventSelectors = [] } = await cloudTrail .getEventSelectors({ TrailName: TrailARN }) .promise(); return eventSelectors; } catch (err) { errorLog.generateAwsErrorLog({ functionName: 'cloudTrail:getEventSelectors', err, }); } return []; }; exports.default = async ({ regions, config, }) => { const cloudTrailData = []; for (const region of regions.split(',')) { try { const cloudTrail = new cloudtrail_1.default({ ...config, region, endpoint }); const trailArnList = await getTrailArnData(cloudTrail, region); const trailList = await listTrailData(cloudTrail, trailArnList); const trailTagList = await listTrailTagData(cloudTrail, trailArnList); if (!isEmpty_1.default(trailList)) { for (const trail of trailList) { const trailStatus = await getTrailStatus(cloudTrail, trail); const trailEvents = await getEventSelectors(cloudTrail, trail); cloudTrailData.push({ ...trail, id: sdk_1.generateUniqueId({ ...trail, trailStatus, trailEvents, trailTagList, }), TrailStatus: trailStatus || {}, EventSelectors: trailEvents, Tags: format_1.convertAwsTagsToTagMap(trailTagList .find((trailTag) => trailTag.ResourceId === trail.TrailARN) ?.TagsList.map(tag => ({ Key: tag.Key, Value: tag.Value || '', }))), region, }); } } } catch (err) { errorLog.generateAwsErrorLog({ functionName: 'cloudTrail:listTrail', err, }); } } errorLog.reset(); return groupBy_1.default(cloudTrailData, 'region'); };