File size: 2,763 Bytes
456eb99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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()