ZeroCPU / app.py
wop's picture
Create app.py
456eb99 verified
raw
history blame
2.76 kB
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()