🢂Monitoring dostępności serwerów (WWW lub SMTP) w Python z przykładami

Skrypt próbuje nawiązać połączenie z określonym serwerem (WWW lub SMTP), a w przypadku niepowodzenia - informuje o tym przez wysłanie powiadomienia e-mail. Dzięki temu administratorzy mogą szybko zareagować na problemy z dostępnością serwera, minimalizując potencjalny czas przestoju.

Monitoring dostępności serwerów, jest niezbędne do wczesnego wykrywania i rozwiązywania problemów, zanim wpłyną one na codzienne operacje. W tym wpisie przedstawiam, jak za pomocą prostego skryptu w Pythonie można monitorować dostępność serwera.

Przed użyciem skryptu, upewnij się, że masz skonfigurowane środowisko Python oraz zainstalowane wymagane biblioteki. Możesz potrzebować dostosować parametry serwera SMTP oraz dane logowania do Twoich potrzeb.

Jak go uruchomić?

Aby uruchomić przygotowany skrypt monitorujący sieć i dostępność serwerów w Pythonie, wykonaj poniższe kroki:

  1. Przygotuj środowisko:
    • Upewnij się, że masz zainstalowanego Pythona na swoim komputerze. Możesz to sprawdzić, wpisując python --version lub python3 --version w wierszu poleceń (terminalu).
    • Jeśli nie masz Pythona, pobierz go ze strony python.org i zainstaluj zgodnie z instrukcjami.
  2. Zapisz skrypt w pliku:
    • Otwórz edytor tekstu (np. Notatnik, Visual Studio Code, PyCharm).
    • Skopiuj kod skryptu do nowego pliku.
    • Zapisz plik z rozszerzeniem .py, na przykład monitoring_serwerow.py.
  3. Dostosuj skrypt:
    • Edytuj skrypt, aby dostosować listę serwerów (serwery), dane do logowania SMTP oraz adresy e-mail. Uzupełnij zmienne na początku skryptu swoimi danymi.
  4. Uruchom skrypt:
    • Otwórz terminal lub wiersz poleceń.
    • Przejdź do katalogu, w którym zapisałeś plik, używając komendy cd ścieżka/do/katalogu.
    • Uruchom skrypt, wpisując python monitoring_serwerow.py lub python3 monitoring_serwerow.py (w zależności od tego, jak został zainstalowany Python na Twoim systemie).

Po uruchomieniu skrypt będzie próbował połączyć się z każdym serwerem zdefiniowanym w liście serwery. Jeśli napotka problemy z dostępnością któregokolwiek z serwerów, wyśle e-mail z powiadomieniem na skonfigurowany adres.

Pamiętaj, że skrypt należy uruchamiać w środowisku, które ma dostęp do Internetu i może nawiązywać połączenia zewnętrzne, aby mógł poprawnie sprawdzać dostępność serwerów i wysyłać e-maile.

Poniżej znajdziesz wersję skryptu z dodanymi komentarzami, które wyjaśniają działanie poszczególnych części kodu. Komentarze te pomogą Ci lepiej zrozumieć, co robi każdy fragment skryptu.

Kod skryptu monitorującego adres IP lub nazwę domenową

import socket
import smtplib
from email.mime.text import MIMEText

# Lista serwerów do monitorowania (adres IP lub nazwa domenowa i port)
# Możesz dodać lub usunąć serwery z tej listy zgodnie z potrzebami
serwery = [
    ('example.com', 80),  # HTTP
    ('example.com', 443),  # HTTPS
]

# Dane do wysyłania powiadomień email
# Należy dostosować te zmienne do własnej konfiguracji
adres_email_nadawcy = 'your_email@example.com'
adres_email_odbiorcy = 'recipient_email@example.com'
smtp_server = 'smtp.example.com'
smtp_port = 587
smtp_username = 'your_email@example.com'
smtp_password = 'your_password'

def sprawdz_serwer(adres, port):
    """Funkcja sprawdza dostępność serwera na podanym adresie i porcie."""
    print(f"Sprawdzanie serwera: {adres}:{port}")
    try:
        socket.setdefaulttimeout(5)  # Ustawienie limitu czasu na próbę połączenia
        socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((adres, port))
        print(f"Serwer {adres}:{port} jest dostępny.")
        return True
    except socket.error as ex:
        print(f"Błąd połączenia z {adres}:{port} - {ex}")
        return False

def wyslij_powiadomienie(adres, port):
    """Funkcja wysyła powiadomienie e-mail, gdy serwer jest niedostępny."""
    print(f"Wysyłanie powiadomienia o problemie z serwerem {adres}:{port}.")
    msg = MIMEText(f'Nie można połączyć się z serwerem {adres}:{port}')
    msg['Subject'] = 'Błąd dostępności serwera'
    msg['From'] = adres_email_nadawcy
    msg['To'] = adres_email_odbiorcy

    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()  # Rozpoczęcie szyfrowanego połączenia
        server.login(smtp_username, smtp_password)  # Logowanie do serwera SMTP
        server.sendmail(adres_email_nadawcy, adres_email_odbiorcy, msg.as_string())
        server.quit()
        print(f'Powiadomienie wysłane pomyślnie.')
    except Exception as e:
        print(f'Nie udało się wysłać powiadomienia email: {e}')

# Pętla przechodząca przez listę serwerów i sprawdzająca ich dostępność
for adres, port in serwery:
    if not sprawdz_serwer(adres, port):
        wyslij_powiadomienie(adres, port)
    else:
        print(f"Serwer {adres}:{port} działa poprawnie.")

W skrypcie tym:

  • Najpierw definiowana jest lista serwerów do monitorowania wraz z ich adresami i portami.
  • Następnie, określone są dane konieczne do wysłania powiadomienia e-mail, które również musisz dostosować do swoich ustawień.
  • Funkcja sprawdz_serwer służy do sprawdzania dostępności danego serwera. Jeśli serwer nie odpowiada, funkcja zwraca False.
  • Funkcja wyslij_powiadomienie jest używana do wysyłania e-maila, gdy któryś z serwerów jest niedostępny.
  • Na końcu, skrypt iteruje przez listę serwerów, wywołując funkcję sprawdz_serwer dla każdego z nich. W przypadku problemów z dostępnością serwera, wywoływana jest funkcja wyslij_powiadomienie.

Przed uruchomieniem skryptu pamiętaj, aby dostosować go do swoich potrzeb, zmieniając dane serwerów, konfigurację SMTP oraz dane logowania.

Monitorowanie SMTP

Skrypt może być dostosowany do monitorowania dostępności serwera SMTP poprzez próbę nawiązania z nim połączenia. Monitorowanie serwera SMTP wymaga nawiązania połączenia z odpowiednim portem (zazwyczaj port 25, 465 dla SSL lub 587 dla TLS) i opcjonalnie wysłania komendy EHLO, aby sprawdzić, czy serwer odpowiada prawidłowo.

Poniżej przykładowy skrypt Python, który monitoruje dostępność serwera SMTP. Skrypt próbuje nawiązać połączenie z serwerem SMTP i wysyła e-mail z powiadomieniem w przypadku wykrycia błędu (np. serwer SMTP jest niedostępny).

Zakładam, że masz dostęp do serwera SMTP, który może być użyty do wysyłania e-maili z powiadomieniami. Należy dostosować dane serwera SMTP, adres e-mail nadawcy, adres e-mail odbiorcy oraz dane uwierzytelniające do Twoich potrzeb.

Kod skryptu monitorującego SMTP

import smtplib
from email.mime.text import MIMEText

# Dane serwera SMTP do monitorowania
adres_smtp = 'smtp.example.com'
port_smtp = 587
timeout_smtp = 10  # Limit czasu w sekundach

# Dane do wysyłania powiadomień email
smtp_server_notyfikacje = 'smtp.example_notify.com'
smtp_port_notyfikacje = 587
smtp_username_notyfikacje = 'notify@example.com'
smtp_password_notyfikacje = 'password'
adres_email_nadawcy = 'notify@example.com'
adres_email_odbiorcy = 'your_email@example.com'

def sprawdz_smtp(adres, port, timeout):
    try:
        server = smtplib.SMTP(timeout=timeout)
        server.set_debuglevel(0)
        server.connect(adres, port)
        server.ehlo()
        server.quit()
        return True
    except (socket.error, smtplib.SMTPException) as e:
        print(f"Nie można połączyć się z serwerem SMTP {adres}:{port} w czasie {timeout} sekund: {e}")
        wyslij_powiadomienie(adres, port, e)
        return False

def wyslij_powiadomienie(adres, port, error):
    wiadomosc = MIMEText(f'Nie można połączyć się z serwerem SMTP {adres}:{port}. Błąd: {error}')
    wiadomosc['Subject'] = 'Błąd dostępności serwera SMTP'
    wiadomosc['From'] = adres_email_nadawcy
    wiadomosc['To'] = adres_email_odbiorcy

    try:
        server = smtplib.SMTP(smtp_server_notyfikacje, smtp_port_notyfikacje)
        server.starttls()
        server.login(smtp_username_notyfikacje, smtp_password_notyfikacje)
        server.sendmail(adres_email_nadawcy, adres_email_odbiorcy, wiadomosc.as_string())
        server.quit()
        print('Powiadomienie o błędzie zostało wysłane.')
    except Exception as e:
        print(f'Nie udało się wysłać powiadomienia email: {e}')

if sprawdz_smtp(adres_smtp, port_smtp, timeout_smtp):
    print("Monitoring SMTP: Serwer jest dostępny.")
else:
    print("Monitoring SMTP: Serwer NIE jest dostępny.")

W tym skrypcie, funkcja sprawdz_smtp próbuje nawiązać połączenie z serwerem SMTP i w przypadku niepowodzenia (np. serwer jest niedostępny lub połączenie przekracza limit czasu), wywołuje funkcję wyslij_powiadomienie, która wysyła e-mail z informacją o błędzie. W funkcji wyslij_powiadomienie należy dostosować dane serwera SMTP używanego do wysyłania powiadomień, wraz z odpowiednimi danymi logowania i adresami e-mail.

Wersja SMTP - bardziej rozbudowana

import smtplib
from email.mime.text import MIMEText
import socket

# Dane serwera SMTP do monitorowania
adres_smtp = 'smtp.example.com'
port_smtp = 587
timeout_smtp = 10  # Limit czasu w sekundach

# Dane do wysyłania powiadomień email
smtp_server_notyfikacje = 'smtp.example_notify.com'
smtp_port_notyfikacje = 587
smtp_username_notyfikacje = 'notify@example.com'
smtp_password_notyfikacje = 'password'
adres_email_nadawcy = 'notify@example.com'
adres_email_odbiorcy = 'your_email@example.com'

def sprawdz_smtp(adres, port, timeout):
    try:
        print(f"Łączenie z serwerem SMTP {adres} na porcie {port} z limitem czasu {timeout} sekund.")
        server = smtplib.SMTP(timeout=timeout)
        server.set_debuglevel(1)
        server.connect(adres, port)
        server.ehlo()
        print(f"Serwer SMTP {adres}:{port} jest dostępny.")
        server.quit()
        return True
    except Exception as e:
        print(f"Błąd połączenia z serwerem SMTP {adres}:{port}: {e}")
        wyslij_powiadomienie_email(adres, port, e)
        return False

def wyslij_powiadomienie_email(adres, port, error):
    wiadomosc = MIMEText(f'Nie można połączyć się z serwerem SMTP {adres}:{port}. Szczegóły błędu: {error}')
    wiadomosc['Subject'] = 'Błąd dostępności serwera SMTP'
    wiadomosc['From'] = adres_email_nadawcy
    wiadomosc['To'] = adres_email_odbiorcy

    try:
        server = smtplib.SMTP(smtp_server_notyfikacje, smtp_port_notyfikacje)
        server.starttls()
        server.login(smtp_username_notyfikacje, smtp_password_notyfikacje)
        server.sendmail(adres_email_nadawcy, adres_email_odbiorcy, wiadomosc.as_string())
        server.quit()
        print('Powiadomienie o błędzie zostało wysłane.')
    except Exception as e:
        print(f'Nie udało się wysłać powiadomienia email: {e}')

# Wywołanie funkcji sprawdzającej dostępność serwera SMTP z limitem czasu
if sprawdz_smtp(adres_smtp, port_smtp, timeout_smtp):
    print("Monitoring SMTP: Serwer jest dostępny.")
else:
    print("Monitoring SMTP: Serwer NIE jest dostępny.")