UNPKG

dnssweeper-cli

Version:

CLI tool for detecting and analyzing unused DNS records

174 lines 5.7 kB
"use strict"; /** * リスク分析機能 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.generateAnalysisSummary = generateAnalysisSummary; exports.getRiskLevelColor = getRiskLevelColor; exports.getRecommendedForDeletion = getRecommendedForDeletion; exports.calculateStatistics = calculateStatistics; exports.getCommonRiskPatterns = getCommonRiskPatterns; exports.analyzeRiskByTime = analyzeRiskByTime; /** * 分析結果のサマリーを生成 * @param results - 分析結果の配列 * @param processingTime - 処理時間(秒) * @returns 分析サマリー */ function generateAnalysisSummary(results, processingTime) { const riskDistribution = { critical: 0, high: 0, medium: 0, low: 0, safe: 0, }; // リスクレベル別の集計 for (const result of results) { riskDistribution[result.riskLevel]++; } // 高リスクレコードトップ10を取得 const topRiskyRecords = results .filter(result => result.riskLevel !== 'safe') .sort((a, b) => b.riskScore - a.riskScore) .slice(0, 10); return { totalRecords: results.length, riskDistribution, topRiskyRecords, processingTime, }; } /** * リスクレベルの色分け情報を取得 * @param riskLevel - リスクレベル * @returns 色分け情報 */ function getRiskLevelColor(riskLevel) { switch (riskLevel) { case 'critical': return { color: 'red', symbol: '🔴', label: 'クリティカル' }; case 'high': return { color: 'redBright', symbol: '🟠', label: '高リスク' }; case 'medium': return { color: 'yellow', symbol: '🟡', label: '中リスク' }; case 'low': return { color: 'blue', symbol: '🔵', label: '低リスク' }; case 'safe': return { color: 'green', symbol: '🟢', label: '安全' }; default: return { color: 'gray', symbol: '⚪', label: '不明' }; } } /** * 削除推奨レコードを取得 * @param results - 分析結果の配列 * @param minRiskLevel - 削除推奨の最小リスクレベル * @returns 削除推奨レコード */ function getRecommendedForDeletion(results, minRiskLevel = 'high') { const riskLevelOrder = [ 'safe', 'low', 'medium', 'high', 'critical', ]; const minIndex = riskLevelOrder.indexOf(minRiskLevel); return results.filter(result => { const resultIndex = riskLevelOrder.indexOf(result.riskLevel); return resultIndex >= minIndex; }); } /** * 統計情報を計算 * @param results - 分析結果の配列 * @returns 統計情報 */ function calculateStatistics(results) { if (results.length === 0) { return { averageRiskScore: 0, medianRiskScore: 0, maxRiskScore: 0, minRiskScore: 0, riskScoreDistribution: {}, }; } const scores = results.map(r => r.riskScore); const sortedScores = [...scores].sort((a, b) => a - b); // 基本統計 const averageRiskScore = scores.reduce((sum, score) => sum + score, 0) / scores.length; const medianRiskScore = sortedScores[Math.floor(sortedScores.length / 2)]; const maxRiskScore = Math.max(...scores); const minRiskScore = Math.min(...scores); // スコア分布(10点刻み) const riskScoreDistribution = {}; for (const score of scores) { const range = Math.floor(score / 10) * 10; const key = `${range}-${range + 9}`; riskScoreDistribution[key] = (riskScoreDistribution[key] || 0) + 1; } return { averageRiskScore: Math.round(averageRiskScore * 10) / 10, medianRiskScore, maxRiskScore, minRiskScore, riskScoreDistribution, }; } /** * 最も一般的なリスクパターンを特定 * @param results - 分析結果の配列 * @returns 一般的なリスクパターン */ function getCommonRiskPatterns(results) { const patternCount = {}; const totalRecords = results.length; for (const result of results) { for (const pattern of result.matchedPatterns) { patternCount[pattern] = (patternCount[pattern] || 0) + 1; } } return Object.entries(patternCount) .map(([pattern, count]) => ({ pattern, count, percentage: Math.round((count / totalRecords) * 100 * 10) / 10, })) .sort((a, b) => b.count - a.count) .slice(0, 10); } /** * 時系列でのリスク分析 * @param results - 分析結果の配列 * @returns 時系列リスク分析 */ function analyzeRiskByTime(results) { const yearlyRiskDistribution = {}; // 年別リスク分布 for (const result of results) { const year = new Date(result.record.modified).getFullYear().toString(); if (!yearlyRiskDistribution[year]) { yearlyRiskDistribution[year] = { critical: 0, high: 0, medium: 0, low: 0, safe: 0, }; } yearlyRiskDistribution[year][result.riskLevel]++; } // 最も古いレコードと新しいレコード const sortedByModified = [...results].sort((a, b) => new Date(a.record.modified).getTime() - new Date(b.record.modified).getTime()); const oldestRecords = sortedByModified.slice(0, 5); const newestRecords = sortedByModified.slice(-5).reverse(); return { yearlyRiskDistribution, oldestRecords, newestRecords, }; } //# sourceMappingURL=riskAnalyzer.js.map