first commit

This commit is contained in:
stephan
2025-06-29 07:39:33 +02:00
commit 4ed4d69b21
20 changed files with 2754 additions and 0 deletions

179
hardware.py Normal file
View File

@ -0,0 +1,179 @@
#sysinfo.py
#Version : 0.1.0
import os
import sys
import subprocess
import cpuinfo
import json
import psutil
import platform
import distro
import socket
import logging
import argparse
from datetime import datetime
try:
import GPUtil
gpu_available = True
except ImportError:
gpu_available = False
# Farben für Debug-Logging
class LogColors:
INFO = "\033[94m"
DEBUG = "\033[92m"
WARNING = "\033[93m"
ERROR = "\033[91m"
RESET = "\033[0m"
# Logging einrichten
LOG_FILE = os.path.expanduser("~/hardware_info.log")
logging.basicConfig(
filename=LOG_FILE,
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
def log_message(level, message):
"""Loggt Nachrichten mit Farben für die CLI, falls Debug aktiv ist."""
if level == "info":
logging.info(message)
if args.debug:
print(f"{LogColors.INFO}[INFO]{LogColors.RESET} {message}")
elif level == "debug":
logging.debug(message)
if args.debug:
print(f"{LogColors.DEBUG}[DEBUG]{LogColors.RESET} {message}")
elif level == "warning":
logging.warning(message)
if args.debug:
print(f"{LogColors.WARNING}[WARNING]{LogColors.RESET} {message}")
elif level == "error":
logging.error(message)
if args.debug:
print(f"{LogColors.ERROR}[ERROR]{LogColors.RESET} {message}")
def get_hardware_info():
"""Sammelt die relevanten Hardware- und Systeminformationen."""
hardware_info = {}
# Betriebssystem
log_message("info", "Sammle Betriebssystem-Daten...")
try:
os_info = {
"name": platform.system(),
"distribution": distro.name(pretty=True)
}
log_message("info", f"OS: {os_info['name']} - {os_info['distribution']}")
except Exception as e:
os_info = {}
log_message("warning", f"Konnte Betriebssystem-Daten nicht ermitteln: {str(e)}")
hardware_info["os"] = os_info
# CPU
log_message("info", "Sammle CPU-Daten...")
try:
cpu_info = {
"model": cpuinfo.get_cpu_info().get('brand_raw', 'Unbekannt'),
"cores": psutil.cpu_count(logical=False),
"threads": psutil.cpu_count(logical=True),
"usage": psutil.cpu_percent(interval=1)
}
log_message("info", f"CPU: {cpu_info['model']} - {cpu_info['cores']} Cores, {cpu_info['threads']} Threads - {cpu_info['usage']}% Auslastung")
except Exception as e:
cpu_info = {}
log_message("warning", f"Konnte CPU-Daten nicht ermitteln: {str(e)}")
hardware_info["cpu"] = cpu_info
# RAM
log_message("info", "Sammle RAM-Daten...")
try:
ram_info = {
"total": round(psutil.virtual_memory().total / (1024**3), 2),
"used": round(psutil.virtual_memory().used / (1024**3), 2),
"available": round(psutil.virtual_memory().available / (1024**3), 2)
}
log_message("info", f"RAM: {ram_info['total']}GB gesamt, {ram_info['used']}GB genutzt, {ram_info['available']}GB verfügbar")
except Exception as e:
ram_info = {}
log_message("warning", f"Konnte RAM-Daten nicht ermitteln: {str(e)}")
hardware_info["ram"] = ram_info
# Festplatte
log_message("info", "Sammle Festplattendaten...")
try:
disk_info = {
"total": round(psutil.disk_usage('/').total / (1024**3), 2),
"used": round(psutil.disk_usage('/').used / (1024**3), 2),
"free": round(psutil.disk_usage('/').free / (1024**3), 2)
}
log_message("info", f"Disk: {disk_info['total']}GB gesamt, {disk_info['used']}GB genutzt, {disk_info['free']}GB frei")
except Exception as e:
disk_info = {}
log_message("warning", f"Konnte Festplatten-Daten nicht ermitteln: {str(e)}")
hardware_info["disk"] = disk_info
log_message("info", "Sammle Netzwerkinformationen...")
try:
network_info = {
"hostname": socket.gethostname(),
"ip_address": socket.gethostbyname(socket.gethostname())
}
log_message("info", f"Netzwerk: Hostname {network_info['hostname']}, IP {network_info['ip_address']}")
except Exception as e:
network_info = {}
log_message("warning", f"Konnte Netzwerkinformationen nicht ermitteln: {str(e)}")
hardware_info["network"] = network_info
log_message("info", "Sammle Benutzerinformationen...")
try:
user_info = {
"logged_in": [user.name for user in psutil.users()],
"active_user": os.getlogin()
}
log_message("info", f"Benutzer: {', '.join(user_info['logged_in'])}, Aktiver User: {user_info['active_user']}")
except Exception as e:
user_info = {}
log_message("warning", f"Konnte Benutzerinformationen nicht ermitteln: {str(e)}")
hardware_info["users"] = user_info
log_message("info", "Sammle dedizierte GPU-Daten...")
gpu_info = []
try:
if gpu_available:
gpus = GPUtil.getGPUs()
for gpu in gpus:
gpu_info.append({
"name": gpu.name,
"memory_total": f"{gpu.memoryTotal}MB",
"memory_used": f"{gpu.memoryUsed}MB",
"memory_free": f"{gpu.memoryFree}MB",
"load": f"{gpu.load * 100:.1f}%"
})
log_message("info", f"Gefundene GPUs: {len(gpus)}")
else:
log_message("warning", "GPUtil nicht installiert oder keine dedizierte GPU vorhanden.")
except Exception as e:
log_message("warning", f"Konnte GPU-Daten nicht ermitteln: {str(e)}")
hardware_info["gpu"] = gpu_info
log_message("info", "Hardware-Informationen erfolgreich erfasst.")
return hardware_info
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Ermittelt Hardware- und Systeminformationen.")
parser.add_argument("--debug", action="store_true", help="Aktiviert Debug-Logging auf der CLI.")
parser.add_argument("--json", type=str, help="Speichert die Ausgabe in einer JSON-Datei.")
args = parser.parse_args()
# Hardware-Informationen abrufen
hardware_info = get_hardware_info()
if args.json:
try:
with open(args.json, "w") as json_file:
json.dump(hardware_info, json_file, indent=4)
log_message("info", f"Hardware-Infos in JSON gespeichert: {args.json}")
except Exception as e:
log_message("error", f"Fehler beim Speichern der JSON-Datei: {str(e)}")