#!/usr/bin/env python3 """ VPN Access Server - Main Entry Point Unified command-line interface for all VPN Access Server operations. Supports authentication, session management, database operations, and testing. """ import sys import os import argparse from pathlib import Path # Add the access module to the Python path sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'access')) def run_auth(): """Run authentication module.""" from access.auth import main as auth_main auth_main() def run_session(): """Run session management module.""" from access.session import main as session_main session_main() def run_init_db(): """Initialize database schema.""" sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'scripts')) from scripts.init_db import main as init_db_main init_db_main() def run_seed_data(): """Seed database with sample data.""" sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'scripts')) from scripts.seed_data import main as seed_data_main seed_data_main() def run_tests(): """Run unit tests.""" import subprocess try: result = subprocess.run([ sys.executable, '-m', 'pytest', 'tests/', '-v' ], cwd=os.path.dirname(os.path.abspath(__file__))) sys.exit(result.returncode) except FileNotFoundError: print("pytest not found. Install test dependencies with: uv add --group test pytest pytest-cov") sys.exit(1) def health_check(): """Check system health and connectivity.""" from access.config import config from access.db import db from access.utils import setup_logging logger = setup_logging(log_level='INFO') print("šŸ” VPN Access Server Health Check") print("=" * 50) # Configuration check print("šŸ“‹ Configuration...") if config.validate(): print("āœ… Configuration is valid") else: print("āŒ Configuration validation failed") return False # Database check print("šŸ—„ļø Database connectivity...") if db.health_check(): print("āœ… Database connection successful") else: print("āŒ Database connection failed") return False # Test utilities print("šŸ”§ Utility functions...") from access.utils import validate_mac_address, normalize_mac_address test_mac = "00:11:22:33:44:55" if validate_mac_address(test_mac) and normalize_mac_address("001122334455") == test_mac: print("āœ… Utility functions working") else: print("āŒ Utility functions failed") return False print("=" * 50) print("āœ… All health checks passed!") return True def show_status(): """Show system status and configuration.""" from access.config import config print("šŸ“Š VPN Access Server Status") print("=" * 50) print(f"Database Host: {config.database.host}:{config.database.port}") print(f"Database Name: {config.database.database}") print(f"Database User: {config.database.username}") print(f"Log Level: {config.server.log_level}") print(f"Log File: {config.server.log_file}") print(f"Default Session Limit: {config.server.default_session_limit}s ({config.server.default_session_limit//3600}h)") print(f"Max Session Limit: {config.server.max_session_limit}s ({config.server.max_session_limit//3600}h)") print("=" * 50) def main(): """Main entry point with command-line interface.""" parser = argparse.ArgumentParser( description="VPN Access Server - OpenVPN authentication and session management", formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" Examples: %(prog)s auth # Run authentication (for OpenVPN) %(prog)s session # Run session management (for OpenVPN) %(prog)s init-db # Initialize database schema %(prog)s seed-data # Add sample data for testing %(prog)s test # Run unit tests %(prog)s health-check # Check system health %(prog)s status # Show configuration status Environment Variables: DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD LOG_LEVEL, DEFAULT_SESSION_LIMIT, MAX_SESSION_LIMIT See .env.example for full configuration options. """ ) parser.add_argument( 'command', choices=['auth', 'session', 'init-db', 'seed-data', 'test', 'health-check', 'status'], help='Command to execute' ) parser.add_argument( '--version', action='version', version='VPN Access Server 1.0.0' ) if len(sys.argv) == 1: parser.print_help() sys.exit(1) args = parser.parse_args() try: if args.command == 'auth': run_auth() elif args.command == 'session': run_session() elif args.command == 'init-db': run_init_db() elif args.command == 'seed-data': run_seed_data() elif args.command == 'test': run_tests() elif args.command == 'health-check': if not health_check(): sys.exit(1) elif args.command == 'status': show_status() except KeyboardInterrupt: print("\nāš ļø Operation cancelled by user") sys.exit(1) except Exception as e: print(f"āŒ Error: {e}") sys.exit(1) if __name__ == "__main__": main()