More logging
Build and Push Docker Images / build-and-push (push) Successful in 21s

This commit is contained in:
2025-10-24 22:31:24 +02:00
parent 258ca8617f
commit 7daa18b8cd
+51 -12
View File
@@ -3,20 +3,32 @@ import os
import time import time
import requests import requests
import tempfile import tempfile
import logging
from pathlib import Path from pathlib import Path
from watchdog.observers import Observer from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler from watchdog.events import FileSystemEventHandler
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)
class PortFileHandler(FileSystemEventHandler): class PortFileHandler(FileSystemEventHandler):
def __init__(self, port_syncer): def __init__(self, port_syncer):
self.port_syncer = port_syncer self.port_syncer = port_syncer
def on_modified(self, event): def on_modified(self, event):
if not event.is_directory and event.src_path == self.port_syncer.port_file: if not event.is_directory and event.src_path == self.port_syncer.port_file:
logger.info(f"Port file {event.src_path} was modified")
self.port_syncer.update_port() self.port_syncer.update_port()
class QBitTorrentPortSyncer: class QBitTorrentPortSyncer:
def __init__(self): def __init__(self):
logger.info("Initializing QBitTorrent Port Syncer...")
self.cookies_file = "/tmp/cookies.txt" self.cookies_file = "/tmp/cookies.txt"
self.port_file = os.getenv('PORT_FORWARDED', '/tmp/port_forwarded') self.port_file = os.getenv('PORT_FORWARDED', '/tmp/port_forwarded')
self.qbittorrent_user = os.getenv('QBITTORRENT_USER') self.qbittorrent_user = os.getenv('QBITTORRENT_USER')
@@ -25,6 +37,11 @@ class QBitTorrentPortSyncer:
self.qbittorrent_port = os.getenv('QBITTORRENT_PORT') self.qbittorrent_port = os.getenv('QBITTORRENT_PORT')
self.http_s = os.getenv('HTTP_S', 'http') self.http_s = os.getenv('HTTP_S', 'http')
logger.info(f"Configuration loaded:")
logger.info(f" Port file: {self.port_file}")
logger.info(f" qBittorrent server: {self.qbittorrent_server}:{self.qbittorrent_port}")
logger.info(f" Protocol: {self.http_s}")
# Validate required environment variables # Validate required environment variables
required_vars = [ required_vars = [
'PORT_FORWARDED', 'QBITTORRENT_USER', 'QBITTORRENT_PASS', 'PORT_FORWARDED', 'QBITTORRENT_USER', 'QBITTORRENT_PASS',
@@ -33,21 +50,29 @@ class QBitTorrentPortSyncer:
missing_vars = [var for var in required_vars if not os.getenv(var)] missing_vars = [var for var in required_vars if not os.getenv(var)]
if missing_vars: if missing_vars:
logger.error(f"Missing required environment variables: {', '.join(missing_vars)}")
raise ValueError(f"Missing required environment variables: {', '.join(missing_vars)}") raise ValueError(f"Missing required environment variables: {', '.join(missing_vars)}")
logger.info("Initialization completed successfully")
def update_port(self): def update_port(self):
"""Update qBittorrent port from the port file""" """Update qBittorrent port from the port file"""
logger.info(f"Attempting to update port from file: {self.port_file}")
try: try:
# Read the port from the file # Read the port from the file
with open(self.port_file, 'r') as f: with open(self.port_file, 'r') as f:
port = f.read().strip() port = f.read().strip()
if not port: if not port:
print(f"Warning: Port file {self.port_file} is empty") logger.warning(f"Port file {self.port_file} is empty")
return return
logger.info(f"Read port from file: {port}")
# Remove old cookies file # Remove old cookies file
if os.path.exists(self.cookies_file): if os.path.exists(self.cookies_file):
logger.debug(f"Removing old cookies file: {self.cookies_file}")
os.remove(self.cookies_file) os.remove(self.cookies_file)
# Login to qBittorrent # Login to qBittorrent
@@ -57,66 +82,80 @@ class QBitTorrentPortSyncer:
'password': self.qbittorrent_pass 'password': self.qbittorrent_pass
} }
logger.info(f"Attempting to login to qBittorrent at: {login_url}")
session = requests.Session() session = requests.Session()
login_response = session.post(login_url, data=login_data) login_response = session.post(login_url, data=login_data)
if login_response.status_code != 200: if login_response.status_code != 200:
print(f"Failed to login to qBittorrent: HTTP {login_response.status_code}") logger.error(f"Failed to login to qBittorrent: HTTP {login_response.status_code}")
logger.error(f"Response content: {login_response.text}")
return return
logger.info("Successfully logged into qBittorrent")
# Update port preferences # Update port preferences
prefs_url = f"{self.http_s}://{self.qbittorrent_server}:{self.qbittorrent_port}/api/v2/app/setPreferences" prefs_url = f"{self.http_s}://{self.qbittorrent_server}:{self.qbittorrent_port}/api/v2/app/setPreferences"
prefs_data = { prefs_data = {
'json': f'{{"listen_port": "{port}"}}' 'json': f'{{"listen_port": "{port}"}}'
} }
logger.info(f"Updating port preferences to: {port}")
prefs_response = session.post(prefs_url, data=prefs_data) prefs_response = session.post(prefs_url, data=prefs_data)
if prefs_response.status_code == 200: if prefs_response.status_code == 200:
print(f"Successfully updated qbittorrent to port {port}") logger.info(f"Successfully updated qBittorrent to port {port}")
else: else:
print(f"Failed to update port: HTTP {prefs_response.status_code}") logger.error(f"Failed to update port: HTTP {prefs_response.status_code}")
logger.error(f"Response content: {prefs_response.text}")
except FileNotFoundError: except FileNotFoundError:
print(f"Couldn't find file {self.port_file}") logger.error(f"Couldn't find file {self.port_file}")
except Exception as e: except Exception as e:
print(f"Error updating port: {e}") logger.error(f"Error updating port: {e}")
def run(self): def run(self):
"""Main loop to monitor port file changes""" """Main loop to monitor port file changes"""
logger.info("Starting QBitTorrent Port Syncer...")
observer = Observer() observer = Observer()
event_handler = PortFileHandler(self) event_handler = PortFileHandler(self)
while True: while True:
if os.path.exists(self.port_file): if os.path.exists(self.port_file):
print(f"Found port file {self.port_file}, starting monitoring...") logger.info(f"Found port file {self.port_file}, starting monitoring...")
# Push port on startup - wait a moment for file to be fully written # Push port on startup - wait a moment for file to be fully written
logger.info("Waiting 2 seconds for port file to be fully written...")
time.sleep(2) time.sleep(2)
print("Pushing port on startup...")
logger.info("Pushing port on startup...")
self.update_port() self.update_port()
# Start file monitoring # Start file monitoring
logger.info(f"Starting file monitoring for directory: {os.path.dirname(self.port_file)}")
observer.schedule(event_handler, os.path.dirname(self.port_file), recursive=False) observer.schedule(event_handler, os.path.dirname(self.port_file), recursive=False)
observer.start() observer.start()
logger.info("File monitoring started successfully")
try: try:
while True: while True:
time.sleep(1) time.sleep(1)
except KeyboardInterrupt: except KeyboardInterrupt:
logger.info("Received keyboard interrupt, stopping...")
observer.stop() observer.stop()
break break
else: else:
print(f"Couldn't find file {self.port_file}") logger.warning(f"Couldn't find file {self.port_file}")
print("Trying again in 10 seconds") logger.info("Trying again in 10 seconds...")
time.sleep(10) time.sleep(10)
if __name__ == "__main__": if __name__ == "__main__":
try: try:
logger.info("Starting QBitTorrent Port Syncer application...")
syncer = QBitTorrentPortSyncer() syncer = QBitTorrentPortSyncer()
syncer.run() syncer.run()
except KeyboardInterrupt: except KeyboardInterrupt:
print("\nShutting down...") logger.info("Shutting down...")
except Exception as e: except Exception as e:
print(f"Error: {e}") logger.error(f"Application error: {e}")
exit(1) exit(1)