""" FastAPI Application Server Entry Point This module provides a server entry point for the FastAPI application defined in app.py. """ import logging import os import sys import argparse import webbrowser import socket import uvicorn # Import from backend modules from backend.server_config import PORT, HOST, MAX_PORT_ATTEMPTS, LOG_LEVEL, ensure_directories from backend.app import app # Import the FastAPI app from app.py # Setup logging logging.basicConfig( level=getattr(logging, LOG_LEVEL), format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) logger = logging.getLogger("agent_monitoring_server") def find_available_port(start_port: int, max_attempts: int) -> int: """Find an available port starting from the given port""" for port_offset in range(max_attempts): port = start_port + port_offset try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, port)) logger.info(f"Found available port: {port}") return port except OSError: logger.debug(f"Port {port} is not available") continue # If we reach here, try some common alternative ports alternative_ports = [8080, 8000, 3000, 9000, 5000] for port in alternative_ports: try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, port)) logger.info(f"Found available alternative port: {port}") return port except OSError: continue # If still no port found, raise an error raise RuntimeError( f"Could not find an available port after trying {max_attempts} " f"sequential ports and {len(alternative_ports)} alternatives" ) def parse_arguments(): """Parse command line arguments""" parser = argparse.ArgumentParser(description="Agent Monitoring System Server") parser.add_argument("--port", type=int, default=PORT, help=f"Server port (default: {PORT})") parser.add_argument("--host", default=HOST, help=f"Server host (default: {HOST})") parser.add_argument("--log-level", default=LOG_LEVEL, help=f"Log level (default: {LOG_LEVEL})") parser.add_argument("--no-open-browser", action="store_true", help="Do not open browser automatically") return parser.parse_args() def main(): """Main entry point for running the server""" # Parse command line arguments args = parse_arguments() # Ensure required directories exist ensure_directories() # Find an available port try: port = find_available_port(args.port, MAX_PORT_ATTEMPTS) except RuntimeError as e: logger.error(str(e)) sys.exit(1) # Log startup message logger.info(f"Starting Agent Monitoring System server on {args.host}:{port}") # Open browser if not disabled if not args.no_open_browser: webbrowser.open(f"http://{args.host}:{port}") # Start the server try: uvicorn.run( "backend.app:app", # Update to use app.py instead of main.py host=args.host, port=port, log_level=args.log_level.lower(), reload=False ) except KeyboardInterrupt: logger.info("Server stopped by user") except Exception as e: logger.error(f"Error running server: {str(e)}") sys.exit(1) if __name__ == "__main__": main()