Загрузка данных


import os
import platform
import subprocess
import sys
import psutil

def get_size(bytes_value):
    """Конвертирует байты в гигабайты с округлением"""
    gb_value = bytes_value / (1024 ** 3)
    return f"{gb_value:.2f} GB"

def get_gpu_model():
    """Получает точное название видеокарты через lspci"""
    try:
        output = subprocess.check_output("lspci | grep -Ei 'vga|3d|display'", shell=True).decode('utf-8')
        lines = output.strip().split('\n')
        gpus = []
        for line in lines:
            if ":" in line:
                parts = line.split(":")
                gpu_name = parts[1].strip() if len(parts) > 2 else parts[0].strip()
                gpu_name = gpu_name.replace("Controller", "").replace("Graphics", "").strip()
                gpus.append(gpu_name)
        return ", ".join(gpus) if gpus else "Unknown GPU"
    except Exception:
        return "Unknown GPU"

def get_motherboard():
    """Получает модель материнской платы"""
    try:
        with open("/sys/class/dmi/id/board_name", "r") as f:
            board = f.read().strip()
        with open("/sys/class/dmi/id/board_vendor", "r") as f:
            vendor = f.read().strip()
        return f"{vendor} {board}"
    except Exception:
        return "Unknown Motherboard"

# Маленький и аккуратный Tux из Neofetch
NEOFETCH_SMALL_TUX = [
    "    .--.       ",
    "   |o_o |      ",
    "   |:_/ |      ",
    "  //   \\\\      ",
    " (|     | )    ",
    "/'\\_   _/`\\    ",
    "\\___)=(___/    "
]

def main():
    # Сбор данных о системе
    username = os.getlogin()
    hostname = platform.node()
    
    cpu_model = "Unknown"
    try:
        if os.path.exists("/proc/cpuinfo"):
            with open("/proc/cpuinfo", "r") as f:
                for line in f:
                    if "model name" in line:
                        cpu_model = line.split(":")[1].strip()
                        break
    except Exception:
        pass

    if not cpu_model or cpu_model == "Unknown":
        cpu_model = platform.processor()

    # Детали процессора (Частота)
    try:
        cpu_freq = f"{psutil.cpu_freq().max:.0f} MHz" if psutil.cpu_freq() else "Unknown"
    except Exception:
        cpu_freq = "Unknown"

    # Сбор данных о памяти
    memory = psutil.virtual_memory()
    ram_total = get_size(memory.total)
    ram_used = get_size(memory.used)
    ram_free = get_size(memory.available)
    
    # Сбор данных о диске
    disk = psutil.disk_usage('/')
    disk_total = get_size(disk.total)
    disk_used = get_size(disk.used)
    disk_free = get_size(disk.free)

    # Формируем список характеристик железа (без строки батареи)
    info_lines = [
        f"{username}@{hostname}",
        "--------------------------------------------------",
        f"OS:         {platform.system()} {platform.release()} ({platform.machine()})",
        f"MOTHERBOARD:{get_motherboard()}",
        f"CPU:        {cpu_model} @ {cpu_freq}",
        f"CORES:      {psutil.cpu_count(logical=False)} physical / {psutil.cpu_count(logical=True)} logical",
        f"GPU:        {get_gpu_model()}",
        f"RAM USED:   {ram_used} / {ram_total} (Free: {ram_free})",
        f"DISK USED:  {disk_used} / {disk_total} (Free: {disk_free})"
    ]

    # Вывод маленького пингвина и подробной инфы бок о бок
    max_lines = max(len(NEOFETCH_SMALL_TUX), len(info_lines))
    for i in range(max_lines):
        logo_part = NEOFETCH_SMALL_TUX[i] if i < len(NEOFETCH_SMALL_TUX) else " " * 15
        info_part = info_lines[i] if i < len(info_lines) else ""
        print(f"{logo_part}   {info_part}")

if __name__ == "__main__":
    main()