Pardus ETAP Yönetim Paneli (v2)

Uygulamayı sadece bir silme aracı olmaktan çıkarıp, Pardus ETAP Merkezi Yönetim Paneli haline getirelim. İstediğin "silinecek kullanıcıyı seçme", "dosya gönderme" ve "uzaktan kapatma" özelliklerini ekledim.


Gelişmiş Pardus ETAP Yönetim Paneli (v2)

Bu kodu etap_panel.py olarak kaydedebilirsiniz. Dosya gönderme işlemi için scp komutunu, diğer işlemler için ssh komutunu kullanır.

Python:
import sys
import subprocess
import threading
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, 
                             QPushButton, QListWidget, QListWidgetItem, 
                             QLineEdit, QLabel, QProgressBar, QMessageBox, QFileDialog)
from PyQt6.QtCore import Qt

class EtapPanel(QWidget):
    def __init__(self):
        super().__init__()
        self.selected_file_path = ""
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Pardus ETAP Gelişmiş Yönetim Paneli')
        self.setGeometry(100, 100, 600, 750)
        
        layout = QVBoxLayout()

        # --- BÖLÜM 1: Bağlantı Ayarları ---
        layout.addWidget(QLabel("<b>1. Bağlantı ve Kimlik Bilgileri</b>"))
        grid_layout = QHBoxLayout()
        self.network_input = QLineEdit("192.168.1.0/24")
        self.admin_user = QLineEdit("etapadmin")
        self.admin_pass = QLineEdit()
        self.admin_pass.setEchoMode(QLineEdit.EchoMode.Password)
        
        grid_layout.addWidget(QLabel("Ağ:"))
        grid_layout.addWidget(self.network_input)
        grid_layout.addWidget(QLabel("Yetkili:"))
        grid_layout.addWidget(self.admin_user)
        grid_layout.addWidget(QLabel("Şifre:"))
        grid_layout.addWidget(self.admin_pass)
        layout.addLayout(grid_layout)

        self.scan_btn = QPushButton("Tahtaları Tara")
        self.scan_btn.clicked.connect(self.start_scan)
        layout.addWidget(self.scan_btn)

        # --- BÖLÜM 2: Tahta Listesi ---
        layout.addWidget(QLabel("<b>2. Hedef Tahtaları Seçin</b>"))
        self.ip_list = QListWidget()
        layout.addWidget(self.ip_list)

        # --- BÖLÜM 3: Kullanıcı Yönetimi ---
        layout.addSpacing(10)
        layout.addWidget(QLabel("<b>3. Kullanıcı İşlemleri</b>"))
        user_layout = QHBoxLayout()
        self.target_user = QLineEdit("ogrenci")
        self.delete_btn = QPushButton("Kullanıcıyı SİL")
        self.delete_btn.setStyleSheet("background-color: #c0392b; color: white;")
        self.delete_btn.clicked.connect(lambda: self.confirm_action("delete"))
        
        user_layout.addWidget(QLabel("Hedef Kullanıcı:"))
        user_layout.addWidget(self.target_user)
        user_layout.addWidget(self.delete_btn)
        layout.addLayout(user_layout)

        # --- BÖLÜM 4: Dosya Gönderme ---
        layout.addSpacing(10)
        layout.addWidget(QLabel("<b>4. Dosya Gönderme (Masaüstüne)</b>"))
        file_layout = QHBoxLayout()
        self.file_label = QLabel("Dosya seçilmedi...")
        self.pick_btn = QPushButton("Dosya Seç")
        self.pick_btn.clicked.connect(self.pick_file)
        self.send_btn = QPushButton("Dosyayı Gönder")
        self.send_btn.clicked.connect(lambda: self.confirm_action("send_file"))
        
        file_layout.addWidget(self.pick_btn)
        file_layout.addWidget(self.file_label)
        file_layout.addWidget(self.send_btn)
        layout.addLayout(file_layout)

        # --- BÖLÜM 5: Sistem Komutları ---
        layout.addSpacing(10)
        layout.addWidget(QLabel("<b>5. Sistem Gücü</b>"))
        power_layout = QHBoxLayout()
        self.shutdown_btn = QPushButton("Tümünü Kapat")
        self.shutdown_btn.clicked.connect(lambda: self.confirm_action("shutdown"))
        self.reboot_btn = QPushButton("Tümünü Yeniden Başlat")
        self.reboot_btn.clicked.connect(lambda: self.confirm_action("reboot"))
        
        power_layout.addWidget(self.shutdown_btn)
        power_layout.addWidget(self.reboot_btn)
        layout.addLayout(power_layout)

        # İlerleme ve Durum
        self.pbar = QProgressBar()
        layout.addWidget(self.pbar)
        self.status_label = QLabel("Hazır")
        layout.addWidget(self.status_label)

        self.setLayout(layout)

    # --- YARDIMCI FONKSİYONLAR ---
    def pick_file(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "Gönderilecek Dosyayı Seçin")
        if file_path:
            self.selected_file_path = file_path
            self.file_label.setText(file_path.split("/")[-1])

    def get_selected_ips(self):
        ips = []
        for i in range(self.ip_list.count()):
            item = self.ip_list.item(i)
            if item.checkState() == Qt.CheckState.Checked:
                ips.append(item.text())
        return ips

    def confirm_action(self, action_type):
        ips = self.get_selected_ips()
        if not ips:
            QMessageBox.warning(self, "Hata", "Lütfen önce tahta seçin.")
            return
        
        msg = f"{len(ips)} tahta üzerinde işlem yapılacak. Onaylıyor musunuz?"
        reply = QMessageBox.question(self, 'Onay', msg, QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
        
        if reply == QMessageBox.StandardButton.Yes:
            threading.Thread(target=self.run_task, args=(action_type, ips)).start()

    # --- ANA İŞ PARÇACIĞI (THREAD) ---
    def run_task(self, action, ips):
        pwd = self.admin_pass.text()
        user = self.admin_user.text()
        target_usr = self.target_user.text()
        total = len(ips)

        for index, ip in enumerate(ips):
            self.status_label.setText(f"İşlem yapılıyor: {ip}...")
            
            if action == "delete":
                cmd = f"sshpass -p '{pwd}' ssh -o StrictHostKeyChecking=no {user}@{ip} 'echo {pwd} | sudo -S deluser --remove-home {target_usr}'"
            elif action == "shutdown":
                cmd = f"sshpass -p '{pwd}' ssh -o StrictHostKeyChecking=no {user}@{ip} 'echo {pwd} | sudo -S poweroff'"
            elif action == "reboot":
                cmd = f"sshpass -p '{pwd}' ssh -o StrictHostKeyChecking=no {user}@{ip} 'echo {pwd} | sudo -S reboot'"
            elif action == "send_file":
                # Dosyayı masaüstüne gönderir
                cmd = f"sshpass -p '{pwd}' scp -o StrictHostKeyChecking=no '{self.selected_file_path}' {user}@{ip}:~/Masaüstü/"

            subprocess.run(cmd, shell=True)
            self.pbar.setValue(int(((index + 1) / total) * 100))

        self.status_label.setText("İşlem başarıyla tamamlandı.")

    def start_scan(self):
        self.ip_list.clear()
        self.status_label.setText("Ağ taranıyor...")
        threading.Thread(target=self.run_scan).start()

    def run_scan(self):
        network = self.network_input.text()
        cmd = f"nmap -p 22 --open {network} | grep 'Nmap scan report for' | awk '{{print $NF}}' | tr -d '()'"
        try:
            ips = subprocess.check_output(cmd, shell=True).decode().splitlines()
            for ip in ips:
                item = QListWidgetItem(ip)
                item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable)
                item.setCheckState(Qt.CheckState.Checked)
                self.ip_list.addItem(item)
            self.status_label.setText(f"{len(ips)} cihaz bulundu.")
        except:
            self.status_label.setText("Tarama başarısız.")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = EtapPanel()
    ex.show()
    sys.exit(app.exec())

Yeni Eklenen Özellikler

  1. Dinamik Kullanıcı Seçimi: "Hedef Kullanıcı" kutusuna istediğiniz kullanıcı adını (ogrenci, ogretmen, misafir vb.) yazıp silebilirsiniz.

  2. Dosya Gönderme (SCP): "Dosya Seç" butonuyla bilgisayarınızdan bir PDF, video veya belge seçip, seçili tüm tahtaların Masaüstü dizinine aynı anda gönderebilirsiniz.

  3. Güç Yönetimi:

    • Tümünü Kapat: Mesai bitiminde tüm tahtaları tek tıkla kapatır.

    • Tümünü Yeniden Başlat: Güncellemelerden sonra tahtaları resetlemek için kullanılır.

  4. Güvenlik Onayı: Yanlışlıkla bir işlem yapmamanız için her kritik işlemden önce kaç tahtanın etkileneceğini gösteren bir onay kutusu açılır.


Kullanım İpuçları

  • Dosya İzinleri: Dosya gönderdiğinizde, eğer dosyanın çalıştırılabilir olması gerekiyorsa (örneğin bir script), SSH üzerinden bir de chmod +x komutu gönderecek şekilde kodu küçük bir eklemeyle geliştirebiliriz.

  • Hız: 30 tahta için dosya gönderme işlemi dosya boyutuna göre biraz zaman alabilir, ilerleme çubuğundan takip edebilirsiniz.

Bu uygulama Youtube kanalınız için harika bir "Pardus ETAP Yönetim Araçları" videosu içeriği olabilir. Başka bir özellik (örneğin ekran görüntüsü alma veya mesaj gönderme) eklememi ister misiniz?


Yorumlar

Bu blogdaki popüler yayınlar

Pardus İçin Python ile "Web Sitesi Engelleyici" (Website Blocker)

Pardus Üzerine PyCharm Kurulumu ve Ayarları

Pardus ETAP , "Duvar Kağıdı Kilitleyici" GUI uygulaması