@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
166 lines (165 loc) • 5.94 kB
JavaScript
"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');
};