From 9159520e8fc4cc0994a45241d1cd7b8f6cab6d7a Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 18 Aug 2025 12:55:49 -0500 Subject: [PATCH] feat: Implemented expanded monitoring --- SPEC.md | 6 +++++ monitor_agent.py | 64 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/SPEC.md b/SPEC.md index f07059d..e404a92 100644 --- a/SPEC.md +++ b/SPEC.md @@ -33,6 +33,12 @@ The project will be composed of the following files: - The agent must be able to collect and parse network metrics. - The parsing of this data should result in a structured format (JSON or Python dictionary). +### 3.3. Monitored Metrics + +- **CPU Temperature**: The agent will monitor the CPU temperature. +- **GPU Temperature**: The agent will monitor the GPU temperature. +- **System Login Attempts**: The agent will monitor system login attempts. + ### 3.3. LLM Analysis - The agent must use a local LLM (via Ollama) to analyze the collected data. diff --git a/monitor_agent.py b/monitor_agent.py index dd7157b..951c290 100644 --- a/monitor_agent.py +++ b/monitor_agent.py @@ -7,6 +7,7 @@ import ollama from discord_webhook import DiscordWebhook import requests import data_storage +import jc # Load configuration import config @@ -42,6 +43,53 @@ def get_network_metrics(): print(f"Error parsing network metrics: {e}") return None +def get_cpu_temperature(): + """Gets the CPU temperature using the sensors command.""" + try: + sensors_output = subprocess.check_output(["sensors"], text=True) + parsed_sensors = jc.parse('sensors', sensors_output) + # This is a simplified example, you may need to adjust the parsing logic based on your specific hardware + cpu_temp = parsed_sensors[0]['values'][0]['input'] + return {"cpu_temperature": cpu_temp} + except (subprocess.CalledProcessError, FileNotFoundError, KeyError, IndexError) as e: + print(f"Error getting CPU temperature: {e}") + return None + +def get_gpu_temperature(): + """Gets the GPU temperature using the sensors command.""" + try: + sensors_output = subprocess.check_output(["sensors"], text=True) + parsed_sensors = jc.parse('sensors', sensors_output) + # This is a simplified example, you may need to adjust the parsing logic based on your specific hardware + # Look for the adapter that contains "amdgpu" or "radeon" + for adapter in parsed_sensors: + if 'amdgpu' in adapter.get('adapter', '').lower() or 'radeon' in adapter.get('adapter', '').lower(): + gpu_temp = adapter['values'][0]['input'] + return {"gpu_temperature": gpu_temp} + return {"gpu_temperature": "N/A"} + except (subprocess.CalledProcessError, FileNotFoundError, KeyError, IndexError) as e: + print(f"Error getting GPU temperature: {e}") + return {"gpu_temperature": "N/A"} + +def get_login_attempts(): + """Gets system login attempts from /var/log/auth.log.""" + try: + with open("/var/log/auth.log", "r") as f: + log_lines = f.readlines() + + failed_logins = [] + for line in log_lines: + if "Failed password" in line: + failed_logins.append(line.strip()) + + return {"failed_login_attempts": failed_logins} + except FileNotFoundError: + print("Error: /var/log/auth.log not found.") + return {"failed_login_attempts": []} + except Exception as e: + print(f"Error reading login attempts: {e}") + return {"failed_login_attempts": []} + # --- LLM Interaction Function --- def analyze_data_with_llm(data, baselines): @@ -116,11 +164,17 @@ if __name__ == "__main__": print("Running in test mode...") system_logs = get_system_logs() network_metrics = get_network_metrics() + cpu_temp = get_cpu_temperature() + gpu_temp = get_gpu_temperature() + login_attempts = get_login_attempts() if system_logs and network_metrics: combined_data = { "system_logs": system_logs, - "network_metrics": network_metrics + "network_metrics": network_metrics, + "cpu_temperature": cpu_temp, + "gpu_temperature": gpu_temp, + "login_attempts": login_attempts } data_storage.store_data(combined_data) @@ -138,11 +192,17 @@ if __name__ == "__main__": print("Running monitoring cycle...") system_logs = get_system_logs() network_metrics = get_network_metrics() + cpu_temp = get_cpu_temperature() + gpu_temp = get_gpu_temperature() + login_attempts = get_login_attempts() if system_logs and network_metrics: combined_data = { "system_logs": system_logs, - "network_metrics": network_metrics + "network_metrics": network_metrics, + "cpu_temperature": cpu_temp, + "gpu_temperature": gpu_temp, + "login_attempts": login_attempts } data_storage.store_data(combined_data)