UNPKG

dnssweeper-cli

Version:

CLI tool for detecting and analyzing unused DNS records

127 lines 5.79 kB
"use strict"; /** * analyzeコマンドの実装 * CSVファイルを分析して未使用DNSレコードを検出 */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.analyzeCommand = analyzeCommand; const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const csvParser_1 = require("../parsers/csvParser"); const patternLoader_1 = require("../patterns/patternLoader"); const patternMatcher_1 = require("../patterns/patternMatcher"); const riskAnalyzer_1 = require("../analyzers/riskAnalyzer"); const formatter_1 = require("../utils/formatter"); const messages_1 = require("../utils/messages"); const patternMatcher_2 = require("../patterns/patternMatcher"); const fs_1 = require("fs"); /** * analyzeコマンドのメイン実装 * @param file - 分析するCSVファイルのパス * @param options - コマンドオプション */ async function analyzeCommand(file, options) { // 言語設定 const language = options.english ? 'en' : 'ja'; const messages = (0, messages_1.getMessages)(language); // CI環境ではスピナーを無効化(stderrへの出力を防ぐ) const isCI = process.env.CI === 'true' || process.env.NODE_ENV === 'test'; const spinner = isCI ? { start: () => ({ text: '', succeed: () => { }, fail: () => { } }), text: '', succeed: () => { }, fail: () => { }, } : (0, ora_1.default)(messages.app.analyzing).start(); try { // 実行時間の計測開始 const startTime = Date.now(); console.log(chalk_1.default.blue(messages.app.title)); console.log(chalk_1.default.gray(`${messages.app.target}: ${file}`)); console.log(chalk_1.default.gray(`${messages.app.outputFormat}: ${options.output}`)); // パターン設定の読み込み if (!isCI) { spinner.text = language === 'ja' ? 'パターン設定を読み込み中...' : 'Loading pattern configuration...'; } const patternConfig = await (0, patternLoader_1.loadPatternConfig)(); // CSVファイルの解析 if (!isCI) { spinner.text = language === 'ja' ? 'CSVファイルを解析中...' : 'Parsing CSV file...'; } const records = await (0, csvParser_1.parseDNSRecordsFromCSV)(file); // DNSレコードの分析 if (!isCI) { spinner.text = language === 'ja' ? 'DNSレコードを分析中...' : 'Analyzing DNS records...'; } const analysisResults = (0, patternMatcher_1.analyzeRecords)(records, patternConfig, language); // 結果をリスクスコア順でソート let sortedResults = (0, patternMatcher_1.sortByRiskScore)(analysisResults); // リスクレベルでフィルタリング if (options.riskLevel) { sortedResults = (0, patternMatcher_2.filterByRiskLevel)(sortedResults, options.riskLevel); if (!isCI) { if (language === 'ja') { spinner.text = `${options.riskLevel}以上のリスクレコードをフィルタリング中...`; } else { spinner.text = `Filtering ${options.riskLevel}+ risk records...`; } } } if (!isCI) { spinner.succeed(messages.app.analysisComplete); } // 実行時間の計算 const endTime = Date.now(); const processingTime = (endTime - startTime) / 1000; // サマリー生成(フィルタリング後の結果で) const summary = (0, riskAnalyzer_1.generateAnalysisSummary)(sortedResults, processingTime); // ファイル出力が指定されている場合 if (options.outputFile) { const detailedCSV = (0, formatter_1.formatAsDetailedCSV)(sortedResults, language); await fs_1.promises.writeFile(options.outputFile, detailedCSV); const savedMsg = language === 'ja' ? `✅ 結果を ${options.outputFile} に保存しました` : `✅ Results saved to ${options.outputFile}`; console.log(chalk_1.default.green(savedMsg)); } // 出力形式に応じた結果表示 switch (options.output) { case 'json': console.log((0, formatter_1.formatAsJSON)(sortedResults, summary)); break; case 'csv': console.log((0, formatter_1.formatAsCSV)(sortedResults)); break; case 'table': default: { // サマリー表示 (0, formatter_1.printAnalysisSummary)(summary, options.verbose, language); // 詳細テーブル表示(リスクレベルフィルタリングを考慮) const limit = options.verbose ? 50 : 20; const minDisplayLevel = options.riskLevel || 'medium'; (0, formatter_1.printAnalysisTable)(sortedResults, limit, minDisplayLevel, language); // 実行時間の表示 const timeUnit = language === 'ja' ? '秒' : ' seconds'; console.log(chalk_1.default.green(`\n${messages.analysis.executionComplete} ${processingTime.toFixed(2)}${timeUnit}`)); break; } } } catch (error) { if (!isCI) { spinner.fail(messages.errors.analysisFailure); } throw error; } } //# sourceMappingURL=analyze.js.map