From 86d4bd190494dfa5ee22e312627bb5f860d638de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 6 Mar 2025 23:01:21 +0100 Subject: [PATCH] fix --- .gitignore | 1 + app.py | 51 +++++++++++++++++++++++++++++++++++++++--------- daemon_token.txt | 0 3 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 daemon_token.txt diff --git a/.gitignore b/.gitignore index 1931769..5d5ba5e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ __pycache__ data/ instance/ venv/ +config.ini \ No newline at end of file diff --git a/app.py b/app.py index c5f6bd1..a3b3e0f 100644 --- a/app.py +++ b/app.py @@ -13,10 +13,24 @@ from croniter import croniter app = Flask(__name__) sslify = SSLify(app) -# Konfiguracja tokenu autoryzacyjnego (przyjmujemy pre-shared secret) -API_TOKEN = os.environ.get("HOSTS_DAEMON_API_TOKEN", "superSecretTokenABC123") +# Ścieżka do pliku z tokenem: +TOKEN_FILE_PATH = "/opt/hosts_daemon/token" -# Konfiguracja logowania – logi zapisywane do pliku /opt/hosts_daemon/logs/daemon.log +def read_token_from_file(path): + """Odczytuje token z pliku i zwraca jego zawartość (strip), + albo None, jeśli plik nie istnieje lub jest pusty.""" + if os.path.isfile(path): + try: + with open(path, 'r') as f: + content = f.read().strip() + if content: + return content + except Exception as e: + # Możesz zalogować błąd, jeśli np. plik jest niewidoczny/brak uprawnień + logger.error(f"Nie udało się odczytać pliku tokenu: {str(e)}") + return None + +# LOGOWANIE LOG_DIR = "/opt/hosts_daemon/logs" os.makedirs(LOG_DIR, exist_ok=True) LOG_FILE = os.path.join(LOG_DIR, "daemon.log") @@ -30,6 +44,24 @@ logging.basicConfig( ) logger = logging.getLogger("hosts_daemon") +# 1) Najpierw próbujemy odczytać token z pliku +file_token = read_token_from_file(TOKEN_FILE_PATH) + +# 2) Jeśli w pliku nie ma tokenu, sprawdzamy zmienną środowiskową +if file_token: + # Użyjemy tokenu z pliku + API_TOKEN = file_token + logger.info("API_TOKEN wczytany z pliku.") +else: + # Fallback: odczytujemy z ENV albo dajemy domyślny + env_token = os.environ.get("HOSTS_DAEMON_API_TOKEN") + if env_token: + API_TOKEN = env_token + logger.info("API_TOKEN wczytany ze zmiennej środowiskowej.") + else: + API_TOKEN = "superSecretTokenABC123" + logger.info("API_TOKEN ustawiony na wartość domyślną: superSecretTokenABC123") + # Globalne metryki metrics = { "total_requests": 0, @@ -46,7 +78,9 @@ metrics = { def require_auth(): """Wymusza autoryzację przy pomocy nagłówka Authorization, który powinien zawierać API_TOKEN.""" token = request.headers.get("Authorization") + logger.info(f"require_auth() -> Nagłówek Authorization: {token}") if token != API_TOKEN: + logger.warning("Nieprawidłowy token w nagłówku Authorization. Oczekiwano innego ciągu znaków.") abort(401, description="Unauthorized") def validate_hosts_syntax(hosts_content): @@ -59,7 +93,8 @@ def validate_hosts_syntax(hosts_content): (ograniczone do nowej treści, nie sprawdza starych plików). Zwraca None, jeśli OK, w przeciwnym razie string z opisem błędu. """ - # Słownik do wykrywania duplikatów: (ip, hostname) -> bool + import ipaddress + seen = {} lines = hosts_content.splitlines() for i, line in enumerate(lines, start=1): @@ -75,16 +110,12 @@ def validate_hosts_syntax(hosts_content): ip_addr = parts[0] hostnames = parts[1:] - # Prosta weryfikacja IP - w Pythonie można użyć ipaddress, ale zrobimy skrótowo: - import ipaddress + # Prosta weryfikacja IP try: _ = ipaddress.ip_address(ip_addr) except ValueError: return f"Linia {i}: '{ip_addr}' nie jest poprawnym adresem IP" - if not hostnames: - return f"Linia {i}: brak hostnamów." - for hn in hostnames: key = (ip_addr, hn) if key in seen: @@ -222,6 +253,8 @@ def system_info(): return jsonify(info), 200 if __name__ == '__main__': + # Możesz zalogować tylko informację, że startujesz: + logger.info("Uruchamiam hosts_daemon – token wczytany, nasłuch na porcie 8000 (HTTPS).") app.run( host='0.0.0.0', port=8000, diff --git a/daemon_token.txt b/daemon_token.txt new file mode 100644 index 0000000..e69de29