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()