|
import os |
|
import gradio as gr |
|
import threading |
|
from flask import Flask |
|
from psycopg2 import connect |
|
|
|
|
|
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") |
|
|
|
|
|
def get_db_connection(): |
|
return connect( |
|
dbname=DB_NAME, |
|
user=DB_USER, |
|
password=DB_PASSWORD, |
|
host=DB_HOST, |
|
port=DB_PORT |
|
) |
|
|
|
|
|
server_threads = {} |
|
|
|
|
|
def create_server(name, port): |
|
app = Flask(name) |
|
|
|
@app.route("/") |
|
def home(): |
|
return f"Server {name} is running on port {port}!" |
|
|
|
return app |
|
|
|
|
|
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 |
|
|
|
|
|
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}!" |
|
|
|
|
|
def stop_server(name): |
|
if name not in server_threads: |
|
return f"Server {name} is not running!" |
|
|
|
|
|
server_threads.pop(name) |
|
return f"Server {name} stopped!" |
|
|
|
|
|
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!" |
|
|
|
|
|
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() |
|
|