Sistem Asistanı (v1.1) / sayfalar/site_engelleyici.py
site_engelleyici.py 119 satır • 6.84 KB
# sayfalar/site_engelleyici.py
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QListWidget, 
                             QPushButton, QLineEdit, QMessageBox, QGroupBox, QTimeEdit, QTabWidget)
from gorsel_araclar import SayfaBasligi, SvgIkonOlusturucu
import os
import subprocess

class SiteEngelleyiciSayfasi(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QVBoxLayout(self)
        icon = SvgIkonOlusturucu.block_ikonu("#33AADD", 32)
        layout.addWidget(SayfaBasligi("Site Engelleyici & Erişim Kontrolü", icon))

        self.hosts_path = "/etc/hosts"
        self.temp_hosts = "/tmp/hosts_temp"

        tabs = QTabWidget()
        layout.addWidget(tabs)

        # TAB 1: Site Engelleme
        tab_site = QWidget(); l_site = QVBoxLayout(tab_site)
        l_site.addWidget(QLabel("Bu araç, bilgisayarınızdan belirli web sitelerine erişimi tamamen engeller.\nİşlemler sistem (root) yetkisi gerektirir."))

        grp_ekle = QGroupBox("Yeni Site Engelle")
        l_ekle = QHBoxLayout(grp_ekle)
        self.txt_site = QLineEdit(); self.txt_site.setPlaceholderText("Örn: microsoft.com")
        btn_ekle = QPushButton("🚫 Engelle (Root)"); btn_ekle.setStyleSheet("background-color: #c0392b; color: white; font-weight: bold;")
        btn_ekle.clicked.connect(self.site_ekle)
        l_ekle.addWidget(self.txt_site); l_ekle.addWidget(btn_ekle); l_site.addWidget(grp_ekle)

        l_site.addWidget(QLabel("<b>Şu An Engelli Olan Siteler:</b>"))
        self.list_widget = QListWidget()
        self.list_widget.setStyleSheet("font-family: Monospace; font-size: 11pt;") 
        l_site.addWidget(self.list_widget)

        h_btn = QHBoxLayout()
        btn_yenile = QPushButton("🔄 Listeyi Yenile"); btn_yenile.clicked.connect(self.listeyi_yukle); h_btn.addWidget(btn_yenile)
        btn_kaldir = QPushButton("✅ Seçili Engeli Kaldır (Root)"); btn_kaldir.setStyleSheet("background-color: #27ae60; color: white; font-weight: bold; padding: 10px;")
        btn_kaldir.clicked.connect(self.site_kaldir); h_btn.addWidget(btn_kaldir)
        l_site.addLayout(h_btn); self.listeyi_yukle(); tabs.addTab(tab_site, "Web Sitesi Engelleme")

        # TAB 2: Zamanlayıcı
        tab_time = QWidget(); l_time = QVBoxLayout(tab_time)
        grp_zaman = QGroupBox("İnternet Erişimini Zamanla")
        lz = QVBoxLayout(grp_zaman)
        lz.addWidget(QLabel("Belirlediğiniz saatler arasında internet erişimi <b>tamamen kapatılır</b>."))
        
        h_t = QHBoxLayout()
        h_t.addWidget(QLabel("Başlangıç Saati (Kapanış):")); self.time_start = QTimeEdit(); self.time_start.setDisplayFormat("HH:mm"); h_t.addWidget(self.time_start)
        h_t.addWidget(QLabel("Bitiş Saati (Açılış):")); self.time_end = QTimeEdit(); self.time_end.setDisplayFormat("HH:mm"); h_t.addWidget(self.time_end)
        lz.addLayout(h_t)
        
        btn_zaman_kur = QPushButton("💾 Zamanlamayı Kaydet (Root)"); btn_zaman_kur.setStyleSheet("background-color: #e67e22; color: white; font-weight: bold; padding: 8px;")
        btn_zaman_kur.clicked.connect(self.zamanlama_kur); lz.addWidget(btn_zaman_kur)
        btn_zaman_sil = QPushButton("🗑️ Zamanlamayı İptal Et (Root)"); btn_zaman_sil.clicked.connect(self.zamanlama_sil); lz.addWidget(btn_zaman_sil)
        l_time.addWidget(grp_zaman)
        
        l_time.addStretch(); tabs.addTab(tab_time, "Zamanlama")

    def listeyi_yukle(self):
        self.list_widget.clear()
        try:
            with open(self.hosts_path, "r") as f:
                lines = f.readlines()
                for line in lines:
                    line = line.strip()
                    if line.startswith("0.0.0.0") and " " in line:
                        parts = line.split()
                        if len(parts) >= 2:
                            site = parts[1]
                            if site != "0.0.0.0": self.list_widget.addItem(site)
        except Exception as e: QMessageBox.warning(self, "Hata", f"Hosts dosyası okunamadı: {e}")

    def site_ekle(self):
        site = self.txt_site.text().strip()
        if not site: return
        site = site.replace("https://", "").replace("http://", "").split("/")[0]
        entry = f"\n0.0.0.0 {site}\n0.0.0.0 www.{site}"
        try:
            cmd = f"echo '{entry}' >> {self.hosts_path}"
            subprocess.run(["pkexec", "sh", "-c", cmd], check=True)
            self.txt_site.clear(); self.listeyi_yukle(); QMessageBox.information(self, "Başarılı", f"{site} engellendi.")
        except: QMessageBox.critical(self, "Hata", "Erişim engellendi.")

    def site_kaldir(self):
        item = self.list_widget.currentItem()
        if not item: QMessageBox.warning(self, "Seçim Yok", "Lütfen listeden seçim yapın."); return
        site = item.text()
        if QMessageBox.question(self, "Onay", f"'{site}' engelini kaldırmak istiyor musunuz?", QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) == QMessageBox.StandardButton.No: return
        try:
            with open(self.hosts_path, "r") as f: lines = f.readlines()
            new_lines = []
            for line in lines:
                if site not in line: new_lines.append(line)
            with open(self.temp_hosts, "w") as f: f.writelines(new_lines)
            cmd = f"mv {self.temp_hosts} {self.hosts_path}"
            subprocess.run(["pkexec", "sh", "-c", cmd], check=True)
            self.listeyi_yukle(); QMessageBox.information(self, "Başarılı", "Engel kaldırıldı.")
        except Exception as e: QMessageBox.critical(self, "Hata", f"İşlem başarısız: {e}")

    def zamanlama_kur(self):
        start = self.time_start.time().toString("HH:mm"); end = self.time_end.time().toString("HH:mm")
        sh, sm = start.split(":"); eh, em = end.split(":")
        cmd_block = "/usr/sbin/ufw default deny outgoing"; cmd_allow = "/usr/sbin/ufw default allow outgoing"
        cron_block = f"{sm} {sh} * * * {cmd_block} #SistemAsistani_Block"
        cron_allow = f"{em} {eh} * * * {cmd_allow} #SistemAsistani_Allow"
        try:
            self.zamanlama_sil_silent()
            script = f"(crontab -l 2>/dev/null; echo \"{cron_block}\"; echo \"{cron_allow}\") | crontab -"
            subprocess.run(["pkexec", "bash", "-c", script], check=True)
            QMessageBox.information(self, "Başarılı", f"Zamanlama kuruldu:\n{start}'da internet KAPANACAK.\n{end}'da internet AÇILACAK.")
        except Exception as e: QMessageBox.critical(self, "Hata", f"Zamanlama kurulamadı: {e}")

    def zamanlama_sil(self):
        try: self.zamanlama_sil_silent(); QMessageBox.information(self, "Başarılı", "Zamanlanmış kısıtlamalar kaldırıldı.")
        except: QMessageBox.warning(self, "Hata", "Silme işlemi başarısız oldu.")
    def zamanlama_sil_silent(self):
        script = "crontab -l | grep -v '#SistemAsistani_' | crontab -"; subprocess.run(["pkexec", "bash", "-c", script], check=True)