Python ve iPerf3 ile Görsel Performans Analizi
Pardus ETAP akıllı tahtalarınızda veya laboratuvardaki bilgisayarlarda, terminal ile uğraşmak istemediğiniz anlar için işinizi kolaylaştıracak, PyQt6 tabanlı bir "Ağ Performans Test Aracı" tasarlayalım.
Bu araç, arka planda iperf3 komutunu çalıştıracak ve sonuçları görsel bir arayüzde sunacak.
Proje Tasarımı: Pardus Ağ Test Asistanı
Bu uygulama iki ana moddan oluşacak:
Sunucu Modu: Tahtayı/PC'yi dinleme moduna alır.
Test Modu: Hedef IP'ye bağlanıp hızı ölçer.
Gerekli Kütüphane
Öncelikle sistemde python3-pyqt6 ve iperf3 kurulu olmalıdır:
sudo apt install python3-pyqt6 iperf3
Python Kod Taslağı (Hızlı Başlangıç)
Aşağıdaki kod, temel bir arayüz sunar. QProcess kullanarak terminal komutlarını arayüze bağlar:
import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow, QPushButton,
QVBoxLayout, QWidget, QTextEdit, QLineEdit, QLabel)
from PyQt6.QtCore import QProcess
class NetworkTestApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Pardus Ağ Performans Testi (iPerf3)")
self.setMinimumSize(500, 400)
# Arayüz Elemanları
self.layout = QVBoxLayout()
self.status_label = QLabel("Durum: Hazır")
self.ip_input = QLineEdit()
self.ip_input.setPlaceholderText("Sunucu IP Adresini Girin (Örn: 192.168.1.50)")
self.btn_server = QPushButton("Sunucu Modunu Başlat (Listen)")
self.btn_client = QPushButton("Testi Başlat (Connect)")
self.output_area = QTextEdit()
self.output_area.setReadOnly(True)
# Düzenleme
self.layout.addWidget(self.status_label)
self.layout.addWidget(QLabel("Hedef IP:"))
self.layout.addWidget(self.ip_input)
self.layout.addWidget(self.btn_client)
self.layout.addWidget(self.btn_server)
self.layout.addWidget(self.output_area)
container = QWidget()
container.setLayout(self.layout)
self.setCentralWidget(container)
# İşlem Yönetimi
self.process = QProcess()
self.process.readyReadStandardOutput.connect(self.handle_output)
# Sinyaller
self.btn_server.clicked.connect(self.start_server)
self.btn_client.clicked.connect(self.start_client)
def handle_output(self):
data = self.process.readAllStandardOutput().data().decode()
self.output_area.append(data)
def start_server(self):
self.output_area.clear()
self.status_label.setText("Durum: Sunucu Dinleniyor (Port 5201)...")
self.process.start("iperf3", ["-s"])
def start_client(self):
target_ip = self.ip_input.text()
if not target_ip:
self.output_area.setText("Lütfen bir IP adresi girin!")
return
self.output_area.clear()
self.status_label.setText(f"Durum: {target_ip} adresine bağlanılıyor...")
self.process.start("iperf3", ["-c", target_ip])
if __name__ == "__main__":
app = QApplication(sys.argv)
window = NetworkTestApp()
window.show()
sys.exit(app.exec())
Hem görsel bir arayüzümüz olsun hem de test sonuçlarını analiz edip JSON veya CSV formatında Pardus Ağ Analizörü kod yapısı ve detayları:
Gelişmiş Özellikler: Raporlama ve Analiz
Sadece hızı ölçmek yetmez; bu verileri biriktirip okulun ağ haritasındaki zayıf halkaları (örneğin 9-B sınıfındaki tahtanın hızı neden düşük?) bulmak için kayıt tutmak gerekir.
Python Kodu (Gelişmiş Versiyon)
Bu kodda iperf3'ü --json parametresiyle çalıştırıp, veriyi Python ile ayıklıyoruz (Parse).
import sys
import json
import csv
from datetime import datetime
from PyQt6.QtWidgets import (QApplication, QMainWindow, QPushButton,
QVBoxLayout, QWidget, QTextEdit, QLineEdit, QLabel, QFileDialog)
from PyQt6.QtCore import QProcess
class PardusNetworkAnalyzer(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
self.process = QProcess()
self.process.readyReadStandardOutput.connect(self.handle_output)
self.process.finished.connect(self.test_finished)
def init_ui(self):
self.setWindowTitle("Pardus ETAP - Ağ Performans Analizörü")
self.setMinimumSize(600, 500)
layout = QVBoxLayout()
self.status_label = QLabel("Durum: Hazır. Lütfen Sunucu IP girin veya Sunucu Modunu başlatın.")
self.ip_input = QLineEdit()
self.ip_input.setPlaceholderText("Sunucu IP (Örn: 10.0.0.50)")
self.btn_client = QPushButton("Performans Testini Başlat")
self.btn_client.setStyleSheet("background-color: #2ecc71; color: white; font-weight: bold; height: 40px;")
self.btn_server = QPushButton("Bu Cihazı Sunucu Yap (Dinle)")
self.btn_save = QPushButton("Sonucu CSV Olarak Kaydet")
self.btn_save.setEnabled(False)
self.output_area = QTextEdit()
self.output_area.setReadOnly(True)
self.output_area.setStyleSheet("background-color: #2c3e50; color: #ecf0f1; font-family: Courier;")
layout.addWidget(self.status_label)
layout.addWidget(QLabel("Hedef Cihaz IP:"))
layout.addWidget(self.ip_input)
layout.addWidget(self.btn_client)
layout.addWidget(self.btn_server)
layout.addWidget(self.output_area)
layout.addWidget(self.btn_save)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self.btn_client.clicked.connect(self.run_test)
self.btn_server.clicked.connect(self.run_server)
self.btn_save.clicked.connect(self.save_to_csv)
def handle_output(self):
data = self.process.readAllStandardOutput().data().decode()
self.output_area.append(data)
def run_test(self):
ip = self.ip_input.text()
if not ip: return
self.output_area.clear()
self.status_label.setText(f"Test yapılıyor: {ip}...")
# JSON formatında çıktı alarak veriyi işlenebilir kılıyoruz
self.process.start("iperf3", ["-c", ip, "--json"])
def run_server(self):
self.output_area.clear()
self.status_label.setText("Sunucu aktif, bağlantı bekleniyor...")
self.process.start("iperf3", ["-s"])
def test_finished(self):
self.status_label.setText("Test tamamlandı.")
self.btn_save.setEnabled(True)
def save_to_csv(self):
# Ham JSON verisini ayıklayıp CSV'ye aktarma mantığı
try:
raw_data = self.output_area.toPlainText()
data_json = json.loads(raw_data)
file_path, _ = QFileDialog.getSaveFileName(self, "Kaydet", "ag_testi.csv", "CSV Files (*.csv)")
if file_path:
with open(file_path, 'a', newline='') as f:
writer = csv.writer(f)
# Tarih, Sunucu, Hız (Bits Per Second)
speed = data_json['end']['sum_sent']['bits_per_second'] / 1e6 # Mbps cinsinden
writer.writerow([datetime.now(), self.ip_input.text(), f"{speed:.2f} Mbps"])
self.status_label.setText("Veri başarıyla kaydedildi.")
except:
self.status_label.setText("Hata: JSON verisi ayrıştırılamadı!")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = PardusNetworkAnalyzer()
window.show()
sys.exit(app.exec())
Teknik Notlar (Blog İçeriği)
Bu kodun çalışma mantığını öğrencilerine anlatırken şu üç noktaya değinebilirsin:
QProcess Kullanımı: Python'un içinden terminal komutlarını sanki arka planda bir "hayalet" kullanıcı çalıştırıyormuş gibi tetikliyoruz.
JSON Veri İşleme:
iperf3 --jsonparametresi, bize karmaşık metinler yerine bilgisayarın anlayacağı bir sözlük yapısı sunar. Bu, "Veri Madenciliği"ne (Data Mining) giriş için harika bir örnektir.Hata Ayıklama: Eğer
json.loadshata veriyorsa, muhtemelen ağ bağlantısı kurulamamıştır ve terminale hata metni düşmüştür.
Bir Sonraki Adım Ne Olsun?
O zaman hem "Çoklu Tahta Testi" mantığını hem de bu uygulamayı Pardus ETAP masaüstüne profesyonel bir araç olarak eklemeyi sağlayan .desktop dosyası oluşturma rehberini birleştirelim.
1. Bölüm: Pardus Masaüstü Kısayolu Oluşturma (.desktop Dosyası)
Öğrencilerinizin veya öğretmen arkadaşlarınızın terminalle uğraşmadan uygulamayı başlatabilmesi için bir "Başlatıcı" oluşturmalıyız.
Adımlar:
Masaüstünde sağ tıklayıp "Yeni Boş Dosya" oluşturun ve adını
ag-testi.desktopyapın.İçine şu bilgileri yapıştırın (Dosya yolunu kendi kullanıcı adınıza göre düzenleyin):
[Desktop Entry]
Name=Pardus Ağ Analizörü
Comment=iPerf3 tabanlı ağ performans ölçüm aracı
Exec=python3 /home/kullanici_adiniz/ag_testi.py
Icon=network-transmit-receive
Terminal=false
Type=Application
Categories=System;Network;
Dosyaya sağ tıklayıp Özellikler > İzinler sekmesinden "Dosyayı bir program gibi çalıştırmaya izin ver" seçeneğini işaretleyin. Artık çift tıklayarak uygulamanızı başlatabilirsiniz.
2. Bölüm: Çoklu Tahta (Multi-Client) Test Stratejisi
Okuldaki tüm tahtaları (ETAP) tek tek gezmek yerine, merkezden bir test yönetmek için şu mimariyi kullanabiliriz:
Mantık:
Merkez PC (Sunucu):
iperf3 -smodunda sürekli açık bekler.Tahtalar (İstemciler): Hazırladığımız Python betiği bir "zamanlanmış görev" (cron job) veya bir ağ komutuyla tetiklendiğinde test yapıp sonuçları merkeze gönderir.
Python Koduna Eklenecek "Otomatik Raporlama" Fonksiyonu:
Eğer sonuçların size (merkezi bir paylaşıma) otomatik gelmesini isterseniz, save_to_csv fonksiyonunu şu şekilde güncelleyebiliriz (Örneğin ağdaki bir ortak klasöre yazması için):
def auto_report_to_server(self, speed_value):
# Ağ üzerindeki ortak bir klasör yolu (Örn: Samba paylaşımı)
central_log_path = "/mnt/ag_raporlari/tum_siniflar.csv"
hostname = socket.gethostname() # Tahtanın adı (örn: SINIF-9A)
with open(central_log_path, 'a') as f:
f.write(f"{datetime.now()},{hostname},{speed_value} Mbps\n")
3. Bölüm: Blog İçin "Eğitim Serisi" Taslağı
Bu çalışmayı blogunda (https://www.google.com/search?q=nuritiras.com.tr) şu şekilde bir seri haline getirebilirsin:
Ders 1: Ağ Performansını Neden Ölçmeliyiz? (Darboğazların Tespiti).
Ders 2: iPerf3 Komut Satırı Kullanımı ve Parametreler.
Ders 3: Python ve PyQt6 ile Görsel Arayüz Geliştirme.
Ders 4: JSON Veri Analizi ve CSV Raporlama Teknikleri.
Ders 5: Pardus ETAP İçin Uygulama Paketleme ve Yaygınlaştırma.
Yorumlar
Yorum Gönder