import subprocess
import json
import sys
def get_errors():
"""
Obtiene los errores del sistema desde el journal (systemd).
Retorna una lista de líneas de error (hasta 50).
"""
try:
# Opción 1: journalctl (mejor para sistemas con systemd)
# -p 3 : solo errores (priority err)
# -b : desde el último arranque
# -n 50: últimas 50 líneas
result = subprocess.run(
['journalctl', '-p', '3', '-b', '-n', '50', '--no-pager'],
capture_output=True,
text=True,
check=True
)
lines = result.stdout.strip().splitlines()
# Filtra líneas vacías
errors = [line for line in lines if line.strip()]
if errors:
return errors
else:
# Si no hay errores en journal, probar con dmesg
return get_errors_dmesg()
except (subprocess.CalledProcessError, FileNotFoundError):
# Si journalctl no está disponible, usar dmesg
return get_errors_dmesg()
def get_errors_dmesg():
"""Fallback: obtener errores del buffer de kernel con dmesg."""
try:
result = subprocess.run(
['dmesg', '-T', '--level=err', '--color=never'],
capture_output=True,
text=True,
check=True
)
lines = result.stdout.strip().splitlines()
# Tomar últimas 30 líneas
return lines[-30:] if lines else []
except (subprocess.CalledProcessError, FileNotFoundError):
# Si nada funciona, retornar lista vacía
return []
def analyze_with_llama(errors):
"""Envía los errores a llama.cpp para análisis."""
if not errors:
return "No hay errores que analizar."
# Limitamos a los primeros 10 para no exceder el contexto
error_text = "\n".join(errors[:10])
prompt = f"""
Eres un experto en administración de sistemas Linux.
Analiza los siguientes errores del sistema y sugiere soluciones concretas:
{error_text}
Sugerencias (en español, concisas):
"""
try:
# Ajusta la ruta del modelo si es necesario
result = subprocess.run(
[
'llama-cli',
'-m', '/home/jared/llamacpp/gemma-3-1b-it-Q4_K_M.gguf',
'-p', prompt,
'-n', '200',
'--temp', '0.3'
],
capture_output=True,
text=True,
check=True
)
return result.stdout
except subprocess.CalledProcessError as e:
return f"Error al ejecutar llama-cli: {e.stderr}"
except FileNotFoundError:
return "Error: No se encontró 'llama-cli'. Asegúrate de que esté instalado y en el PATH."
def main():
errors = get_errors()
if not errors:
print("✅ Sistema limpio. No se encontraron errores recientes.")
return
print("🧠 Analizando errores con IA...")
suggestions = analyze_with_llama(errors)
print("\n💡 Sugerencias:")
print(suggestions)
if __name__ == "__main__":
main()