Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| import sys | |
| import os | |
| from cve_validator import validate_cve_id | |
| from api_client import fetch_cve_simple | |
| from storage import save_cve_analysis, load_cve_analysis | |
| def analyze_cve(cve_id, use_cache=True): | |
| """Analyze CVE with caching support""" | |
| # Check if already analyzed | |
| if use_cache: | |
| cached = load_cve_analysis(cve_id) | |
| if cached: | |
| print(f"Loading from cache: {cve_id}") | |
| return cached | |
| print(f"Analyzing {cve_id}...") | |
| # Fetch CVE data | |
| cve_data = fetch_cve_simple(cve_id) | |
| if not cve_data: | |
| print(f"Unable to fetch data for {cve_id}") | |
| return None | |
| # Display basic information | |
| cve = cve_data['cve'] | |
| print(f" {cve['id']}") | |
| print(f"Published: {cve['published']}") | |
| print(f"Description: {cve['descriptions'][0]['value'][:200]}...") | |
| # Get CVSS score | |
| if 'metrics' in cve and 'cvssMetricV31' in cve['metrics']: | |
| cvss = cve['metrics']['cvssMetricV31'][0]['cvssData'] | |
| print(f"CVSS Score: {cvss['baseScore']}") | |
| print(f"Severity: {cvss['baseSeverity']}") | |
| # Try to generate AI summary | |
| ai_summary = None | |
| if os.getenv('OPENAI_API_KEY'): | |
| print("\n Generating AI summary...") | |
| try: | |
| from llm_summarizer import summarize_cve | |
| ai_summary = summarize_cve(cve_data) | |
| print(ai_summary) | |
| except Exception as e: | |
| print(f"AI summary failed: {e}") | |
| else: | |
| print("\n OPENAI_API_KEY not set, skipping AI summary") | |
| # Save analysis results | |
| analysis = { | |
| 'cve_id': cve_id, | |
| 'cve_data': cve_data, | |
| 'ai_summary': ai_summary | |
| } | |
| save_cve_analysis(cve_id, cve_data, ai_summary) | |
| # Show similar CVEs if available | |
| try: | |
| from vector_storage import vector_storage | |
| similar_cves = vector_storage.find_similar_cves(cve_id, 3) | |
| if similar_cves: | |
| print(f"\n Similar CVEs:") | |
| for similar in similar_cves: | |
| print(f" • {similar['cve_id']} (similarity: {similar['similarity']}) - {similar['description'][:50]}...") | |
| except: | |
| pass | |
| return analysis | |
| def main(): | |
| if len(sys.argv) < 2: | |
| print("Usage:") | |
| print("python main.py CVE-YYYY-NNNN # Analyze CVE") | |
| print("python main.py CVE-YYYY-NNNN --force # Force re-analysis") | |
| sys.exit(1) | |
| cve_id = sys.argv[1] | |
| force = '--force' in sys.argv | |
| # Validate CVE ID | |
| if not validate_cve_id(cve_id): | |
| print(f"Invalid CVE ID: {cve_id}") | |
| sys.exit(1) | |
| # Analyze CVE | |
| result = analyze_cve(cve_id, use_cache=not force) | |
| if result: | |
| print(f"\n Analysis completed: {cve_id}") | |
| else: | |
| print(f"\n Analysis failed: {cve_id}") | |
| sys.exit(1) | |
| if __name__ == "__main__": | |
| main() |