Mario

WFN Üye
Konular
581
Mesajlar
581
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Zonguldak
Web Sitesi
Var
Alanı
Google Optimiz.
1/1
Konu sahibi
İşlem için shutil.disk_usage() ile sunucudaki dosya sisteminin boş alanını ölçüp belirlediğiniz eşik altına inildiğinde smtplib ve EmailMessage ile SMTP sunucusundan e-posta gönderebilirsiniz. Aşağıdaki örnek, / bölümünde boş alan yüzde 15’in altına düştüğünde uyarı gönderir; SMTP bilgilerinin kod içine yazılmaması için ortam değişkenlerini kullanır.

Çalışan Python betiği​


Önce SMTP sağlayıcınızdan sunucu adresini, portu, kullanıcı adını ve uygulama parolasını öğrenin. Normal SMTP bağlantısı için SMTP, TLS ile doğrudan bağlantı için SMTP_SSL kullanılabilir. Sağlayıcınızın istediği yönteme göre aşağıdaki iki bağlantı biçiminden birini seçin.

Python:
import os
import shutil
import smtplib
from email.message import EmailMessage

# İzlenecek bölüm ve uyarı eşiği
IZLENECEK_YOL = "/"
ESIK_YUZDE = 15

SMTP_SUNUCU = os.environ["SMTP_SUNUCU"]
SMTP_PORT = int(os.environ.get("SMTP_PORT", "465"))
SMTP_KULLANICI = os.environ["SMTP_KULLANICI"]
SMTP_PAROLA = os.environ["SMTP_PAROLA"]
GONDEREN = os.environ.get("UYARI_GONDEREN", SMTP_KULLANICI)
ALICI = os.environ["UYARI_ALICI"]

def eposta_gonder(kullanilan_yuzde, bos_gb, toplam_gb):
    mesaj = EmailMessage()
    mesaj["Subject"] = f"Disk alanı uyarısı: %{kullanilan_yuzde:.1f} kullanılıyor"
    mesaj["From"] = GONDEREN
    mesaj["To"] = ALICI
    mesaj.set_content(
        f"{IZLENECEK_YOL} bölümünde disk kullanımı %{kullanilan_yuzde:.1f}.\n"
        f"Boş alan: {bos_gb:.2f} GB\n"
        f"Toplam alan: {toplam_gb:.2f} GB\n"
        f"Eşik: %{ESIK_YUZDE} boş alan"
    )

    with smtplib.SMTP_SSL(SMTP_SUNUCU, SMTP_PORT, timeout=30) as smtp:
        smtp.login(SMTP_KULLANICI, SMTP_PAROLA)
        smtp.send_message(mesaj)

def kontrol_et():
    toplam, kullanilan, bos = shutil.disk_usage(IZLENECEK_YOL)
    bos_yuzde = bos / toplam * 100
    kullanilan_yuzde = 100 - bos_yuzde

    if bos_yuzde < ESIK_YUZDE:
        eposta_gonder(
            kullanilan_yuzde,
            bos / (1024 ** 3),
            toplam / (1024 ** 3)
        )
        print("Disk eşiği aşıldı; uyarı e-postası gönderildi.")
    else:
        print(f"Disk durumu normal: %{bos_yuzde:.1f} boş alan var.")

if __name__ == "__main__":
    kontrol_et()

shutil.disk_usage() toplam, kullanılan ve boş alanı bayt cinsinden döndürür. Kod bu değerleri gigabayta çevirir, boş alan yüzdesini hesaplar ve yalnızca boş alan %15 değerinin altına indiğinde e-posta gönderir.

SMTP bilgilerini güvenli biçimde tanımlama​


Betiği çalıştırmadan önce sunucuda şu ortam değişkenlerini tanımlayın. Değerleri kendi SMTP hizmetinizin bilgileriyle değiştirin:

Bash:
export SMTP_SUNUCU="smtp.ornek.com"
export SMTP_PORT="465"
export SMTP_KULLANICI="[email protected]"
export SMTP_PAROLA="uygulama-parolasi"
export UYARI_GONDEREN="[email protected]"
export UYARI_ALICI="[email protected]"
python3 disk_uyari.py

Çıktıda Disk durumu normal görülürse ölçüm yapılmış, ancak eşik aşılmadığı için e-posta gönderilmemiştir. uyarı e-postası gönderildi çıktısı yalnızca SMTP sunucusunun mesajı kabul ettiğini gösterir; alıcının gelen kutusuna ulaştığını garanti etmez. Mesaj gelmezse SMTP sunucusu, port, kimlik doğrulama, uygulama parolası ve spam klasörünü ayrı ayrı kontrol edin. SMTPAuthenticationError alırsanız özellikle normal hesap parolası yerine sağlayıcının gerektirdiği uygulama parolasını kullanın.

SMTP bağlantınız TLS ile 587 portunda çalışıyorsa bağlantı bölümünü şu şekilde değiştirin:

Python:
with smtplib.SMTP(SMTP_SUNUCU, 587, timeout=30) as smtp:
    smtp.starttls()
    smtp.login(SMTP_KULLANICI, SMTP_PAROLA)
    smtp.send_message(mesaj)

send_message() bir EmailMessage nesnesini SMTP üzerinden gönderir; with kullanımı bağlantının işlem sonunda kapatılmasını sağlar.

Betiği otomatik çalıştırma​


Sunucuda betiği elle çalıştırıp önce normal durum çıktısını, ardından geçici olarak ESIK_YUZDE değerini yükselterek uyarı gönderimini test edin. Test başarılı olduktan sonra betiği işletim sisteminin zamanlayıcısına ekleyin. Linux’ta örneğin crontab -e ile şu satır, betiği her 10 dakikada bir çalıştırır:

Kod:
*/10 * * * * /usr/bin/python3 /opt/disk_uyari.py >> /var/log/disk_uyari.log 2>&1

Cron ayrı bir oturumla çalıştığı için ortam değişkenlerini yalnızca kullanıcı oturumunda tanımlamak yeterli olmayabilir. Değişkenleri cron ortamında da tanımlayın veya betiğin okuyacağı, yalnızca yetkili kullanıcının erişebildiği bir yapılandırma dosyası kullanın. Parola içeren dosyanın izinlerini kısıtlayın; parolayı doğrudan Python kaynak koduna ya da komut satırı geçmişine yazmayın.

Aynı eşik altında her 10 dakikada bir e-posta almak istemiyorsanız son uyarı zamanını bir dosyada saklayıp yalnızca belirli bir süre geçtiğinde gönderim yapacak bir bekleme mekanizması ekleyin. Aksi hâlde disk temizlenene kadar zamanlayıcının her çalışmasında yeni uyarı gönderilir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic