generador-post-mortem / src /custom_tools.py
vvillarreal-cfee's picture
fix(env): Ahora aceptamos variables de entorno para las API KEYS
9fceb39 verified
import requests
from crewai.tools import BaseTool
from typing import Type, List
from pydantic import BaseModel, Field
import streamlit as st
# --- 1. IPInfo Geo Lookup Tool ---
class IPInfoToolInput(BaseModel):
"""Input schema for IPInfo Geo Lookup Tool."""
target: List[str] = Field(
...,
description="A list of IP addresses (e.g., ['8.8.8.8', '1.1.1.1']) to query."
)
class IPInfoGeoLookup(BaseTool):
# See https://ipinfo.io/developers/lite-api
name: str = "IPInfo Geo Lookup"
description: str = "Looks up geolocation, Internet Service Provider (ISP), and network details for an IP address. Useful for determining the geographic location of a digital asset."
args_schema: Type[BaseModel] = IPInfoToolInput
def _run(self, target: List[str]) -> str:
api_key = st.session_state['ipinfo_api_key']
if not api_key:
return "Error: La variable de entorno IPINFO_APIKEY no está configurada."
results = []
for ip_address in target:
try:
url = f"https://api.ipinfo.io/lite/{ip_address}?token={api_key}"
response = requests.get(url)
response.raise_for_status()
data = response.json()
# Formateamos la salida para que sea legible y útil para el agente
result_str = (
f"IP: {data.get('ip')}, Country: {data.get('country')}, ASN: {data.get('as_name')}"
)
results.append(result_str)
except requests.exceptions.RequestException as e:
results.append(f"Error al consultar la IP {ip_address}: {e}")
return "\n".join(results)
# --- 2. VirusTotal Scanner Tool ---
class VirusTotalToolInput(BaseModel):
"""Input schema for VirusTotal Scanner Tool."""
resources: List[str] = Field(
...,
description="A list of resources to scan. Valid resources include file hash (MD5, SHA256), a URL, a domain, or an IP address."
)
class VirusTotalScanner(BaseTool):
# See https://blog.virustotal.com/2024/08/VT-S1-EffectiveResearch.html
# See https://docs.virustotal.com/reference/ip-info
name: str = "VirusTotal Scanner"
description: str = "Analyzes files, URLs, domains, or IP addresses for malware and other security threats using multiple antivirus engines and reputation services. Provides a detailed security analysis report."
args_schema: Type[BaseModel] = VirusTotalToolInput
def _run(self, resources: List[str]) -> str:
# Placeholder logic for the actual VirusTotal API call
print(f"DEBUG: Running VirusTotal Scan for {resources}")
return f"Simulation: Resource {resources} analyzed. 0/90 engines flagged it as malicious. Reputation: Clean."