#!/usr/bin/env python3 import requests import argparse import sys def debug_print(debug, message): if debug: print(f"DEBUG: {message}") def check_gitea(server_address, repo_owner, repo_name, username, password, file_path, debug=False): try: base_url = f"https://{server_address}" session = requests.Session() # 1. Sprawdzenie dostępności serwera Gitea debug_print(debug, "Próba połączenia z serwerem Gitea...") try: response = session.get(base_url, timeout=10) response.raise_for_status() debug_print(debug, f"Serwer Gitea dostępny (HTTP {response.status_code})") except requests.exceptions.RequestException as e: print(f"CRITICAL - Nie można połączyć się z serwerem Gitea: {str(e)}") return 2 # 2. Logowanie login_url = f"{base_url}/user/login" debug_print(debug, f"Próba logowania na konto {username}...") try: response = session.get(login_url) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"CRITICAL - Nie można pobrać strony logowania: {str(e)}") return 2 from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') csrf_token = soup.find('input', {'name': '_csrf'}) if not csrf_token: print("CRITICAL - Nie można znaleźć tokena CSRF na stronie logowania") return 2 csrf_token = csrf_token['value'] debug_print(debug, f"Znaleziono token CSRF: {csrf_token}") login_data = { "user_name": username, "password": password, "_csrf": csrf_token } try: response = session.post(login_url, data=login_data) response.raise_for_status() if "invalid username or password" in response.text.lower() or "nieprawidłowa nazwa użytkownika lub hasło" in response.text.lower(): print("CRITICAL - Błąd logowania do Gitea: nieprawidłowa nazwa użytkownika lub hasło") return 2 debug_print(debug, "Logowanie zakończone sukcesem") except requests.exceptions.RequestException as e: print(f"CRITICAL - Błąd podczas logowania: {str(e)}") return 2 # 3. Sprawdzenie repozytorium repo_url = f"{base_url}/{repo_owner}/{repo_name}" debug_print(debug, f"Sprawdzanie dostępności repozytorium {repo_owner}/{repo_name}...") try: response = session.get(repo_url) if response.status_code == 404: print(f"CRITICAL - Repozytorium {repo_owner}/{repo_name} nie istnieje") return 2 response.raise_for_status() debug_print(debug, f"Repozytorium {repo_owner}/{repo_name} dostępne") except requests.exceptions.RequestException as e: print(f"CRITICAL - Problem z dostępem do repozytorium: {str(e)}") return 2 # 4. Sprawdzenie pliku w repozytorium - ZMIENIONA METODA DOSTĘPU file_url = f"{base_url}/{repo_owner}/{repo_name}/raw/branch/master/{file_path}" debug_print(debug, f"Próba odczytu pliku {file_path} z URL: {file_url}...") try: response = session.get(file_url) debug_print(debug, f"Odpowiedź HTTP: {response.status_code}") if response.status_code == 200: # Dodatkowe sprawdzenie czy to na pewno plik if response.text: # Jeśli odpowiedź zawiera treść print(f"OK - Pomyślnie odczytano plik {file_path} z repozytorium {repo_owner}/{repo_name}") return 0 else: print(f"WARNING - Plik {file_path} istnieje ale jest pusty") return 1 elif response.status_code == 404: print(f"WARNING - Plik {file_path} nie istnieje w repozytorium {repo_owner}/{repo_name}") debug_print(debug, f"Pełna ścieżka: {file_url}") return 1 else: print(f"CRITICAL - Nie można odczytać pliku {file_path} (HTTP {response.status_code})") return 2 except requests.exceptions.RequestException as e: print(f"CRITICAL - Błąd podczas odczytu pliku: {str(e)}") return 2 except Exception as e: print(f"CRITICAL - Wystąpił nieoczekiwany błąd: {str(e)}") return 2 if __name__ == "__main__": parser = argparse.ArgumentParser(description='Skrypt do weryfikacji działania Gitea') parser.add_argument('--server', required=True, help='Adres serwera Gitea (np. gitea.linuxiarz.pl)') parser.add_argument('--repo-owner', required=True, help='Właściciel repozytorium') parser.add_argument('--repo-name', required=True, help='Nazwa repozytorium') parser.add_argument('--username', required=True, help='Nazwa użytkownika') parser.add_argument('--password', required=True, help='Hasło użytkownika') parser.add_argument('--file', required=True, help='Ścieżka do pliku do odczytu w repozytorium') parser.add_argument('--debug', action='store_true', help='Wyświetl szczegółowe informacje debugowe') args = parser.parse_args() sys.exit(check_gitea( args.server, args.repo_owner, args.repo_name, args.username, args.password, args.file, args.debug )) # Przykładowa komenda: # ./check_gitea.py --server gitea.domena.pl --repo-owner testuser --repo-name testrepo --username testuser --password testpass --file README.md --debug