Sistem Asistanı (v1.1) / sayfalar/bakim.py
bakim.py 61 satır • 3.86 KB
# sayfalar/bakim.py

from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QGridLayout, QPushButton, QLabel,
                             QListWidget, QListWidgetItem, QApplication)
from PyQt6.QtGui import QColor, QIcon
from gorsel_araclar import SayfaBasligi, SvgIkonOlusturucu
import subprocess
import os

class BakimSayfasi(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QVBoxLayout(self)
        
        icon = SvgIkonOlusturucu.maintenance_ikonu("#33AADD", 32)
        layout.addWidget(SayfaBasligi("Bakım & Onarım", icon))

        grid = QGridLayout(); grid.setSpacing(15)

        def btn(txt, cmd, icon_pixmap, r, c):
            b = QPushButton(f"  {txt}")
            b.setIcon(QIcon(icon_pixmap)); b.setIconSize(icon_pixmap.size()); b.setMinimumHeight(60)
            b.setStyleSheet("text-align:left; padding-left:15px; font-weight:bold;")
            b.clicked.connect(lambda: self.islem_baslat(cmd, txt))
            grid.addWidget(b, r, c)

        blue = "#33AADD"; orange = "#e67e22"; red = "#e74c3c"
        cmd_prefix = "DEBIAN_FRONTEND=noninteractive"
        
        btn("Sistemi Güncelle", f"{cmd_prefix} apt-get update && {cmd_prefix} apt-get upgrade -y", SvgIkonOlusturucu.refresh_ikonu(blue), 0, 0)
        btn("Gereksizleri Sil", f"{cmd_prefix} apt-get autoremove -y && {cmd_prefix} apt-get autoclean && {cmd_prefix} apt-get clean", SvgIkonOlusturucu.clean_ikonu(blue), 0, 1)
        btn("Paketleri Onar", f"{cmd_prefix} apt-get install --fix-broken -y && dpkg --configure -a", SvgIkonOlusturucu.fix_ikonu(blue), 1, 0)
        btn("Önbellek Temizle", "sync; echo 3 > /proc/sys/vm/drop_caches", SvgIkonOlusturucu.ram_ikonu(orange), 1, 1)
        # Agresif log temizleme
        log_cmd = "journalctl --rotate && journalctl --vacuum-time=1s && rm -rf /var/log/*.gz && rm -rf /var/log/*.1"
        btn("Tüm Logları Temizle", log_cmd, SvgIkonOlusturucu.log_ikonu(red), 2, 0)
        btn("GRUB Güncelle", "update-grub", SvgIkonOlusturucu.grub_ikonu(blue), 2, 1)

        layout.addLayout(grid); layout.addSpacing(20); layout.addWidget(QLabel("İşlem Durumu:"))
        self.status_list = QListWidget()
        # Stil temizlendi, sadece font ayarı kaldı
        self.status_list.setStyleSheet("font-family: Monospace; font-size: 9pt;")
        layout.addWidget(self.status_list)

    def islem_baslat(self, komut_str, baslik):
        header = QListWidgetItem(f"⏳ {baslik}: İşlem Başlatılıyor..."); header.setForeground(QColor("#f1c40f")); self.status_list.addItem(header); self.status_list.scrollToBottom(); QApplication.processEvents()
        env = os.environ.copy(); env["DISPLAY"] = ":0"
        full_cmd = ["pkexec", "sh", "-c", komut_str]
        
        try:
            process = subprocess.run(full_cmd, capture_output=True, text=True, env=env)
            if process.stdout:
                for line in process.stdout.splitlines():
                    if line.strip(): item = QListWidgetItem(f"  > {line.strip()}"); item.setForeground(QColor("#aaaaaa")); self.status_list.addItem(item)
            if process.stderr:
                for line in process.stderr.splitlines():
                    if line.strip() and "WARNING: apt" not in line: item = QListWidgetItem(f"  ! {line.strip()}"); item.setForeground(QColor("#e74c3c")); self.status_list.addItem(item)
            if process.returncode == 0: fin = QListWidgetItem(f"✅ {baslik}: Başarıyla Tamamlandı."); fin.setForeground(QColor("#2ecc71")); self.status_list.addItem(fin)
            else: err = QListWidgetItem(f"❌ {baslik}: Hata ile Sonlandı."); err.setForeground(QColor("#e74c3c")); self.status_list.addItem(err)
        except Exception as e: item = QListWidgetItem(f"⚠️ {baslik}: Kritik Sistem Hatası ({str(e)})"); item.setForeground(QColor("#e74c3c")); self.status_list.addItem(item)
        self.status_list.addItem(QListWidgetItem("-" * 40)); self.status_list.scrollToBottom()