UNPKG

cloud-report

Version:

Collects and analyzes cloud resources

104 lines (103 loc) 4.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const AWS = require("aws-sdk"); const Cli = require("cli"); const Moment = require("moment"); const opn = require("opn"); const AnalyzerMain = require("./analyze"); const CollectorMain = require("./collect"); const Reporters = require("./reporters"); const fs_1 = require("fs"); const credentials_1 = require("./utils/aws/credentials"); const log_1 = require("./utils/log"); const cliArgs = Cli.parse({ debug: ["d", "if you enable Debug then it will generate intermediate reports", "boolean", false], format: ["f", "output format: html, json, csv or pdf", "string", "html"], issuesOnly: ["i", "should show only issues", "boolean", false], logLevel: ["l", "Log level: off=100, info=1, warning=2, error=3", "int", "3"], module: ["m", "name of the module", "string"], output: ["o", "Report file name", "string", "scan_report"], outputDir: ["D", "Output directory", "string", "."], profile: ["p", "AWS profile name", "string", "default"], reuseCollectorReport: ["u", "Reuse collection report", "boolean", false], }); log_1.LogUtil.setCurrentLogLevel(cliArgs.logLevel); if (["json", "csv", "pdf", "html"].indexOf(cliArgs.format) === -1) { Cli.getUsage(); } AWS.config.signatureVersion = "v4"; AWS.config.maxRetries = 3; const collectorReportFileName = cliArgs.outputDir + "/collector_report.json"; function makeFileName(accountNumber) { return cliArgs.outputDir + "/" + cliArgs.output + "_" + accountNumber + "_" + Moment().format("YYYY-MM-DD-hh-mm-ss") + "." + cliArgs.format; } async function makeFileContents(analyzedData) { switch (cliArgs.format) { case "json": { return JSON.stringify(analyzedData, null, 2); } case "csv": { return Reporters.generateCSV(analyzedData, { showIssuesOnly: cliArgs.issuesOnly }); } case "html": { fs_1.writeFileSync("src/reporters/html/dist/html-report/assets/data.json", JSON.stringify(analyzedData, null, 2)); const serveStatic = require("serve-static"); const finalhandler = require("finalhandler"); const http = require("http"); const serve = serveStatic("src/reporters/html/dist/html-report/", { index: ["index.html"] }); // Create server const server = http.createServer(function onRequest(req, res) { serve(req, res, finalhandler(req, res)); }); // Listen server.listen(3000); opn("http://localhost:3000"); } case "pdf": { return Reporters.generatePDF(analyzedData, { showIssuesOnly: cliArgs.issuesOnly, debug: cliArgs.debug }); } default: throw new Error("Unsupported report format"); } } async function getCollectorResults() { if (cliArgs.debug && cliArgs.reuseCollectorReport && fs_1.existsSync(collectorReportFileName)) { log_1.LogUtil.log("Reusing collection report"); return JSON.parse(fs_1.readFileSync(collectorReportFileName, { encoding: "utf-8" })); } const credentials = await credentials_1.AWSCredentialsProvider.getCredentials(cliArgs.profile); return await CollectorMain.collect(cliArgs.module, credentials); } function getAccountNumber(analyzedData) { if (analyzedData["aws.account"]) { return analyzedData["aws.account"].summary.regions.global[0].resourceSummary.value; } return ""; } async function scan() { try { const collectorResults = await getCollectorResults(); if (cliArgs.debug) { fs_1.writeFileSync(collectorReportFileName, JSON.stringify(collectorResults, null, 2)); log_1.LogUtil.log(`${collectorReportFileName} is generated`); } const analyzedData = AnalyzerMain.analyze(collectorResults); const accountNumber = getAccountNumber(analyzedData); if (cliArgs.debug) { const analyzerReportFileName = cliArgs.outputDir + "/analyzer_report.json"; fs_1.writeFileSync(analyzerReportFileName, JSON.stringify(analyzedData, null, 2)); log_1.LogUtil.log(`${analyzerReportFileName} is generated`); } const reportFileData = await makeFileContents(analyzedData); if (cliArgs.format !== "html") { const reportFileName = makeFileName(accountNumber); fs_1.writeFileSync(reportFileName, reportFileData); log_1.LogUtil.log(`${reportFileName} is generated`); opn(reportFileName, { wait: false }); } } catch (err) { log_1.LogUtil.log(err); } } scan();