import os import gradio as gr import threading from flask import Flask from psycopg2 import connect # Fetch environment variables DB_NAME = os.getenv("DB_NAME") DB_USER = os.getenv("DB_USER") DB_PASSWORD = os.getenv("DB_PASSWORD") DB_HOST = os.getenv("DB_HOST") DB_PORT = os.getenv("DB_PORT") APP_PASSWORD = os.getenv("APP_PASSWORD") # Database connection def get_db_connection(): return connect( dbname=DB_NAME, user=DB_USER, password=DB_PASSWORD, host=DB_HOST, port=DB_PORT ) # Dictionary to manage server threads server_threads = {} # Flask app template for HTTP servers def create_server(name, port): app = Flask(name) @app.route("/") def home(): return f"Server {name} is running on port {port}!" return app # Function to start a server def start_server(name, port): if name in server_threads: return f"Server {name} is already running!" app = create_server(name, port) def run(): app.run(host="0.0.0.0", port=port, debug=False, use_reloader=False) thread = threading.Thread(target=run, daemon=True) thread.start() server_threads[name] = thread # Update database status conn = get_db_connection() with conn.cursor() as cursor: cursor.execute( "INSERT INTO servers (name, port, status) VALUES (%s, %s, %s) ON CONFLICT (name) DO UPDATE SET status = EXCLUDED.status", (name, port, "running") ) conn.commit() conn.close() return f"Server {name} started on port {port}!" # Function to stop a server (dummy implementation for now) def stop_server(name): if name not in server_threads: return f"Server {name} is not running!" # Terminate the thread (not directly supported, requires external handling) server_threads.pop(name) return f"Server {name} stopped!" # Gradio UI def manage_servers(password, action, name, port): if password != APP_PASSWORD: return "Invalid password!" if action == "start": return start_server(name, port) elif action == "stop": return stop_server(name) else: return "Invalid action!" # Gradio Interface with gr.Blocks() as server_manager: gr.Markdown("# Server Manager") with gr.Row(): password = gr.Textbox(label="Password", type="password") with gr.Row(): action = gr.Radio(["start", "stop"], label="Action") name = gr.Textbox(label="Server Name") port = gr.Number(label="Port") with gr.Row(): submit = gr.Button("Submit") output = gr.Textbox(label="Output") submit.click( manage_servers, inputs=[password, action, name, port], outputs=output ) server_manager.launch()