Pardus ETAP Yönetim Paneli (v3)
Bu özellikler, sınıfları yönetirken hem disiplini sağlamak hem de tahtada ne yapıldığını kontrol etmek için çok işe yarayacaktır.
Uygulamaya "Anlık Bildirim Gönder" ve "Ekran Görüntüsü Al" özelliklerini ekledim. Ayrıca bu işlemlerin grafik arayüzünde (öğrencinin ekranında) görünebilmesi için gerekli olan DISPLAY=:0 komutlarını da entegre ettim.
Yeni Gerekli Paketler
Tahtalarda ekran görüntüsü alabilmek için scrot yazılımının yüklü olması gerekir. Uygulama üzerinden bunu da toplu olarak kurdurabiliriz ama önce şu komutla kendi bilgisayarınıza ve tahtalara kurmanızı öneririm:
sudo apt install scrot zenity -y
Pardus ETAP Yönetim Paneli (v3 - Tam Sürüm)
import sys
import subprocess
import threading
import os
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,
QPushButton, QListWidget, QListWidgetItem,
QLineEdit, QLabel, QProgressBar, QMessageBox, QFileDialog)
from PyQt6.QtCore import Qt
class EtapPanelV3(QWidget):
def __init__(self):
super().__init__()
self.selected_file_path = ""
self.initUI()
def initUI(self):
self.setWindowTitle('Pardus ETAP Merkezi Yönetim Sistemi v3')
self.setGeometry(100, 100, 700, 850)
layout = QVBoxLayout()
# --- BÖLÜM 1: Bağlantı ve Tarama ---
conn_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)
conn_layout.addWidget(QLabel("Ağ:"))
conn_layout.addWidget(self.network_input)
conn_layout.addWidget(self.admin_user)
conn_layout.addWidget(self.admin_pass)
layout.addLayout(conn_layout)
self.scan_btn = QPushButton("Bağlı Tahtaları Tara")
self.scan_btn.clicked.connect(self.start_scan)
layout.addWidget(self.scan_btn)
self.ip_list = QListWidget()
layout.addWidget(self.ip_list)
# --- BÖLÜM 2: Mesaj Gönderme ---
layout.addWidget(QLabel("<b>📢 Sınıfa Mesaj Gönder</b>"))
msg_layout = QHBoxLayout()
self.msg_input = QLineEdit()
self.msg_input.setPlaceholderText("Tahtada görünecek mesajı yazın...")
self.send_msg_btn = QPushButton("Mesajı Yolla")
self.send_msg_btn.clicked.connect(lambda: self.confirm_action("send_message"))
msg_layout.addWidget(self.msg_input)
msg_layout.addWidget(self.send_msg_btn)
layout.addLayout(msg_layout)
# --- BÖLÜM 3: Ekran Görüntüsü ---
layout.addWidget(QLabel("<b>📸 Ekran Takibi</b>"))
self.ss_btn = QPushButton("Seçili Tahtaların Ekran Görüntüsünü Al (Kaydet: ~/Resimler)")
self.ss_btn.clicked.connect(lambda: self.confirm_action("screenshot"))
layout.addWidget(self.ss_btn)
# --- BÖLÜM 4: Dosya, Kullanıcı ve Güç ---
layout.addWidget(QLabel("<b>⚙️ Sistem ve Dosya Yönetimi</b>"))
sys_layout = QHBoxLayout()
self.target_user = QLineEdit("ogrenci")
self.del_user_btn = QPushButton("Kullanıcı Sil")
self.del_user_btn.clicked.connect(lambda: self.confirm_action("delete"))
self.shutdown_btn = QPushButton("Kapat")
self.shutdown_btn.clicked.connect(lambda: self.confirm_action("shutdown"))
sys_layout.addWidget(QLabel("Kullanıcı:"))
sys_layout.addWidget(self.target_user)
sys_layout.addWidget(self.del_user_btn)
sys_layout.addWidget(self.shutdown_btn)
layout.addLayout(sys_layout)
# Durum Çubuğu
self.pbar = QProgressBar()
layout.addWidget(self.pbar)
self.status_label = QLabel("Hazır")
layout.addWidget(self.status_label)
self.setLayout(layout)
# --- İŞLEM YÖNETİMİ ---
def get_selected_ips(self):
return [self.ip_list.item(i).text() for i in range(self.ip_list.count())
if self.ip_list.item(i).checkState() == Qt.CheckState.Checked]
def confirm_action(self, action_type):
ips = self.get_selected_ips()
if not ips:
QMessageBox.warning(self, "Hata", "Önce tahta seçmelisiniz!")
return
threading.Thread(target=self.run_task, args=(action_type, ips)).start()
def run_task(self, action, ips):
pwd = self.admin_pass.text()
user = self.admin_user.text()
total = len(ips)
for index, ip in enumerate(ips):
self.status_label.setText(f"İşlem: {ip}...")
# Ortak SSH öneki
ssh_prefix = f"sshpass -p '{pwd}' ssh -o StrictHostKeyChecking=no {user}@{ip}"
if action == "send_message":
msg = self.msg_input.text()
# Zenity ile ekrana mesaj kutusu çıkartır
cmd = f"{ssh_prefix} 'export DISPLAY=:0; zenity --info --text=\"{msg}\" --title=\"Sistem Mesajı\"'"
elif action == "screenshot":
# Ekran görüntüsü al ve admin bilgisayarına çek
remote_path = f"/tmp/ss_{ip}.png"
local_path = os.path.expanduser(f"~/Resimler/ss_{ip}.png")
# 1. Görüntüyü tahtada çek
subprocess.run(f"{ssh_prefix} 'export DISPLAY=:0; scrot {remote_path}'", shell=True)
# 2. Dosyayı kendi bilgisayarına çek
subprocess.run(f"sshpass -p '{pwd}' scp {user}@{ip}:{remote_path} {local_path}", shell=True)
cmd = "echo 'Screenshot bitti'"
elif action == "delete":
target = self.target_user.text()
cmd = f"{ssh_prefix} 'echo {pwd} | sudo -S deluser --remove-home {target}'"
elif action == "shutdown":
cmd = f"{ssh_prefix} 'echo {pwd} | sudo -S poweroff'"
subprocess.run(cmd, shell=True)
self.pbar.setValue(int(((index + 1) / total) * 100))
self.status_label.setText("Tüm işlemler tamamlandı.")
def start_scan(self):
self.ip_list.clear()
self.status_label.setText("Taramayı Başlatı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)} Tahta bulundu.")
except: self.status_label.setText("Tarama hatası!")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = EtapPanelV3()
ex.show()
sys.exit(app.exec())
Yeni Eklenen Fonksiyonlar ve Çalışma Mantığı
📢 Mesaj Gönder: *
zenityaracını kullanır. Siz butona bastığınızda öğrencinin ekranında bir bilgi kutusu (pop-up) açılır ve öğrenci "Tamam" diyene kadar kapanmaz.Örn: "Dersin bitmesine 5 dakika kaldı, lütfen dosyalarınızı kaydedin."
📸 Ekran Takibi (Screenshot):
Bu özellik çok güçlüdür. Seçili 30 tahtanın her birinin o anki ekran görüntüsünü alır.
Görüntüler sizin bilgisayarınızdaki Resimler (Pictures) klasörüne
ss_192.168.1.50.pnggibi IP adresiyle kaydedilir. Böylece kimin ne yaptığını tek tek dosyalardan görebilirsiniz.
🖥️ Grafik Arayüz Desteği (
DISPLAY=:0):SSH üzerinden gönderilen komutlar normalde arka planda çalışır.
export DISPLAY=:0komutu, sistemin bu mesajı veya ekran görüntüsü alma işlemini "ana ekranda" (öğrencinin gördüğü yerde) yapmasını sağlar.
Yorumlar
Yorum Gönder