UNPKG

dnsweeper

Version:

Advanced CLI tool for DNS record risk analysis and cleanup. Features CSV import for Cloudflare/Route53, automated risk assessment, and parallel DNS validation.

215 lines (196 loc) 4.91 kB
/** * 共通API型定義 */ // 基本的なAPIレスポンス型 export interface ApiResponse<T = any> { success: boolean; data?: T; error?: { message: string; code: string; statusCode: number; details?: any; }; timestamp: string; } // ファイルアップロード関連 export interface FileInfo { id: string; originalName: string; filename: string; path: string; size: number; mimetype: string; uploadedAt: string; } export interface UploadResponse extends ApiResponse<FileInfo> {} // 分析関連 export interface AnalysisRequest { fileId: string; format: 'cloudflare' | 'route53' | 'generic'; options?: { enableDnsValidation?: boolean; riskThresholds?: { ttl?: { low: number; high: number }; naming?: { riskPatterns: string[] }; }; timeout?: number; retries?: number; }; } export interface AnalysisProgress { stage: 'parsing' | 'validating' | 'analyzing' | 'complete' | 'error'; percentage: number; message: string; details?: { totalRecords?: number; processedRecords?: number; errors?: number; warnings?: number; }; } export interface DNSRecord { domain: string; type: string; value: string; ttl: number; priority?: number; weight?: number; port?: number; riskScore: number; riskLevel: 'high' | 'medium' | 'low'; issues: string[]; dnsResolution?: { resolved: boolean; actualValue?: string; responseTime?: number; error?: string; }; } export interface AnalysisResult { id: string; fileId: string; status: 'pending' | 'running' | 'completed' | 'failed'; startedAt: string; completedAt?: string; duration?: number; results?: { totalRecords: number; validRecords: number; riskySummary: { high: number; medium: number; low: number; }; records: DNSRecord[]; statistics: { recordTypes: Record<string, number>; ttlDistribution: Record<string, number>; topDomains: Array<{ domain: string; count: number }>; riskFactors: Record<string, number>; }; }; error?: string; } export interface AnalysisResponse extends ApiResponse<{ analysisId: string }> {} export interface AnalysisResultResponse extends ApiResponse<{ analysis: AnalysisResult }> {} // 設定関連 export interface AppSettings { analysis: { riskThresholds: { ttl: { low: number; high: number; }; naming: { riskPatterns: string[]; safePatterns: string[]; }; }; dns: { timeout: number; retries: number; servers: string[]; enableCache: boolean; }; performance: { maxConcurrency: number; batchSize: number; memoryWarningThreshold: number; }; }; ui: { theme: 'light' | 'dark' | 'auto'; language: 'en' | 'ja'; dateFormat: string; timezone: string; }; api: { maxFileSize: number; allowedFormats: string[]; rateLimit: { windowMs: number; max: number; }; }; } export interface SettingsResponse extends ApiResponse<{ settings: AppSettings }> {} // WebSocket イベント型 export interface WebSocketEvents { 'analysis:progress': (data: AnalysisProgress & { analysisId: string; timestamp: string }) => void; 'analysis:complete': (data: { analysisId: string; result: AnalysisResult }) => void; 'analysis:error': (data: { analysisId: string; error: string }) => void; 'subscribe:analysis': (analysisId: string) => void; 'unsubscribe:analysis': (analysisId: string) => void; } // フィルタリング・ソート関連 export interface RecordFilter { riskLevel?: ('high' | 'medium' | 'low')[]; recordType?: string[]; domainPattern?: string; ttlRange?: { min?: number; max?: number }; hasIssues?: boolean; resolved?: boolean; } export interface SortOption { field: keyof DNSRecord | 'domain' | 'riskScore' | 'ttl'; direction: 'asc' | 'desc'; } export interface PaginationOptions { page: number; limit: number; sortBy?: SortOption; filter?: RecordFilter; } // エクスポート関連 export interface ExportOptions { format: 'csv' | 'json' | 'xlsx' | 'pdf'; includeFields?: (keyof DNSRecord)[]; filter?: RecordFilter; sortBy?: SortOption; } export interface ExportResponse extends ApiResponse<{ downloadUrl: string; filename: string }> {} // 履歴関連 export interface AnalysisHistoryItem { id: string; fileId: string; originalFilename: string; status: AnalysisResult['status']; startedAt: string; completedAt?: string; duration?: number; recordCount?: number; riskySummary?: { high: number; medium: number; low: number; }; } export interface AnalysisHistory { items: AnalysisHistoryItem[]; total: number; page: number; limit: number; totalPages: number; } export interface HistoryResponse extends ApiResponse<{ history: AnalysisHistory }> {}