Python Scriptini Systemd Servisine(Daemon) Dönüştürme

Bir sistem yöneticisi için en değerli kaynak zamandır. Geliştirdiğimiz Python tabanlı yönetim panelini manuel kullanmak yerine, arka planda çalışan bir Daemon (Servis) haline getirmek, okulun tüm etkileşimli tahtalarını "kendi kendini yöneten" bir ekosisteme dönüştürür.

1. Neden Daemon (Arka Plan Servisi)?

Grafiksel arayüzler (GUI) kullanıcı etkileşimi için harikadır; ancak sürekli çalışma gerektiren görevler için verimli değildirler. Servis yapısına geçmenin avantajları şunlardır:

  • Oturum Bağımsızlığı: Bilgisayarda oturum açmasanız dahi zil programı çalışmaya devam eder.

  • Hata Yönetimi: Script bir şekilde çökerse, Linux (Systemd) onu otomatik olarak yeniden başlatır.

  • Kaynak Tasarrufu: Arka planda sadece gerekli mantık (mantıksal döngü) çalışır, grafiksel yük oluşmaz.


2. Çekirdek Yapı: etap-service.py

Öncelikle, görsel arayüzden bağımsız, sadece JSON dosyalarınızı okuyup saat takibi yapan bir "worker" scripti oluşturmalıyız. Bu script, her 30 saniyede bir program.json dosyasını kontrol ederek aksiyon alır.

Önemli Not: Arka plan servislerinde dosya yolları her zaman tam yol (absolute path) olarak verilmelidir.

Python:

import time
import socket
import paramiko
import json
import os
import logging # Loglama kütüphanesi eklendi
from datetime import datetime

# Yapılandırma Yolları
BASE_DIR = "/home/nuri/Masaüstü" 
SETTINGS_FILE = os.path.join(BASE_DIR, "ayarlar.json")
SCHEDULE_FILE = os.path.join(BASE_DIR, "program.json")
IPS_FILE = os.path.join(BASE_DIR, "tahtalar.json")
LOG_FILE = os.path.join(BASE_DIR, "servis.log")

# Loglama Ayarları
logging.basicConfig(
    filename=LOG_FILE,
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)

def execute_ssh(ip, user, pw, action):
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip, username=user, password=pw, timeout=5)
        
        if action == "lock":
            cmd = "dbus-send --system --dest=org.freedesktop.DisplayManager --type=method_call /org/freedesktop/DisplayManager/Seat0 org.freedesktop.DisplayManager.Seat.Lock"
        else:
            cmd = "dbus-send --system --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.UnlockSessions"
        
        ssh.exec_command(cmd)
        ssh.close()
        logging.info(f"BAŞARILI: {ip} adresi üzerinden '{action}' işlemi yapıldı.")
    except Exception as e:
        logging.error(f"HATA: {ip} bağlantısı başarısız. Detay: {str(e)}")

def run_service():
    logging.info("TSOMTAL ETAP Otomasyon Servisi başlatıldı.")
    while True:
        now = datetime.now()
        cur_t = now.strftime("%H:%M")
        gunler = ["Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"]
        cur_d = gunler[now.weekday()]

        if os.path.exists(SCHEDULE_FILE):
            try:
                with open(SCHEDULE_FILE, 'r') as f: schedule = json.load(f)
                with open(SETTINGS_FILE, 'r') as f: config = json.load(f)
                with open(IPS_FILE, 'r') as f: saved_ips = json.load(f)

                if cur_d in schedule:
                    for slot in schedule[cur_d]:
                        if slot["start"] == cur_t or slot["end"] == cur_t:
                            action = slot["action"]
                            logging.info(f"Zamanlayıcı Tetiklendi: {cur_t} - İşlem: {action}")
                            for ip in saved_ips:
                                execute_ssh(ip, config["user"], config["pass"], action)
                            time.sleep(61)
            except Exception as e:
                logging.error(f"Dosya okuma veya JSON hatası: {str(e)}")
        
        time.sleep(30)

if __name__ == "__main__":
    run_service()

3. Linux Sistemine Servis Olarak Tanıtma (Systemd)

Pardus üzerinde bu scriptin bir sistem bileşeni gibi çalışması için bir .service dosyası oluşturmamız gerekir.

  1. Terminalden şu komutla servis dosyasını oluşturun: sudo nano /etc/systemd/system/etap-otomasyon.service

  2. İçeriği şu şekilde düzenleyin:

    Ini:
    [Unit]
    Description=TSOMTAL ETAP Otomatik Tahta Yönetim Servisi
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/python3 /home/nuri/Masaüstü/etap-servis.py
    WorkingDirectory=/home/nuri/Masaüstü
    User=nuri
    Restart=always
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target

4. Servisi Yayına Alma ve İzleme

Servis dosyasını kaydettikten sonra sistemi haberdar edip servisi başlatalım:

  • Sistemi Yenile: sudo systemctl daemon-reload

  • Servisi Başlat: sudo systemctl start etap-otomasyon.service

  • Başlangıca Ekle: sudo systemctl enable etap-otomasyon.service

  • Durumu Kontrol Et: sudo systemctl status etap-otomasyon.service


Sonuç

Artık iki parçalı bir yönetim sisteminiz var:

  1. Görsel Panel (GUI): Logo, okul adı ve progress bar ile tahtaları taradığınız, zil programını "Sihirbaz" ile oluşturduğunuz ve verileri kaydettiğiniz yönetim merkezi.

  2. Arka Plan Servisi (Daemon): Panel kapalı olsa dahi sizin yerinize saatleri takip eden ve tahtaları yöneten görünmez güç.

Bu yapı, TSOMTAL gibi kurumsal bir okulun IT altyapısını çok daha modern ve hatasız bir hale getirecektir.

"Sistem İzlenebilirliği ve Loglama"

Profesyonel Bir Dokunuş: Neden Log (Günlük) Tutmalıyız?

Bir otomasyon sistemi kurduğunuzda, sistemin arka planda gerçekten ne yaptığını bilmek istersiniz. Örneğin; "Salı günü 3. teneffüste 10-A sınıfının tahtası neden kilitlenmedi?" sorusunun cevabı, tutulan log kayıtlarında gizlidir.

Sistemimizde Loglama Nasıl Çalışır? Geliştirdiğimiz Python servisi, her işlem adımını servis.log dosyasına kronolojik olarak kaydeder. Bu kayıtlarda şunları görebiliriz:

  • Hangi saatte hangi ders programı tetiklendi?

  • Hangi IP adreslerine SSH komutu başarıyla ulaştı?

  • Hangi tahtalarda (bağlantı hatası, yanlış şifre vb.) sorun yaşandı?

Bu sayede, TSOMTAL bilişim laboratuvarından tüm okulun tahtalarını yönetirken, fiziksel olarak sınıfları gezmeye gerek kalmadan arıza tespiti yapabiliriz. Python'un logging kütüphanesi sayesinde, hataları seviyelerine göre (INFO, ERROR) ayırarak sistem sağlığını anlık olarak takip etmek artık çok kolay.


Bu ekleme ile projeniz tam teşekküllü bir Enterprise (Kurumsal) yazılım kimliği kazandı. Servisi tekrar başlatmak için şu komutu kullanmanız yeterlidir: 

sudo systemctl restart etap-otomasyon.service

Kayıtları canlı izlemek isterseniz terminale şu komutu yazabilirsiniz: 

tail -f /home/nuri/Masaüstü/servis.log

Yorumlar

Bu blogdaki popüler yayınlar

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

Pardus ETAP 23 Uzaktan Yönetim Paneli: Uyandırma, Kapatma ve Durum Takibi

Python ve PyQt6 ile Pardus ETAP Merkezi Kilit Paneli Geliştirme