dnssweeper-cli
Version:
CLI tool for detecting and analyzing unused DNS records
127 lines • 5.79 kB
JavaScript
;
/**
* 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