import os from dotenv import load_dotenv import time import base64 import requests import threading import gradio as gr from fastapi.responses import JSONResponse, RedirectResponse from fastapi import FastAPI, Request, Response, status from src.utils import ( manage_urls, wake_up_space, get_wake_up_action_name, get_url_list, ) # Charger les variables d'environnement load_dotenv() app = FastAPI() USERNAME = os.getenv("USERNAME") PASSWORD = os.getenv("PASSWORD") @app.middleware("http") async def basic_auth(request: Request, call_next): auth = request.headers.get("Authorization") expected = "Basic " + base64.b64encode(f"{USERNAME}:{PASSWORD}".encode()).decode() if USERNAME and PASSWORD and auth != expected: return Response( status_code=status.HTTP_401_UNAUTHORIZED, headers={"WWW-Authenticate": "Basic"}, content="Unauthorized", ) return await call_next(request) # Interface Gradio interface = gr.Interface( fn=manage_urls, inputs=[ gr.Radio(choices=["Ajouter", "Supprimer"], label="Action"), gr.Textbox(label="URL"), ], outputs=[ gr.Textbox(label="Message"), gr.Textbox(label="Liste actuelle des URLs", lines=10, interactive=False), ], title="🔐 Gestion des URLs à pinger", description="Ajoutez ou supprimez dynamiquement des URLs à surveiller. La liste actuelle est toujours affichée.", flagging_dir="/tmp/flags" ) @app.get("/") def root_redirect(): return RedirectResponse(url="/gradio") @app.get("/check_health") def check_health(): return JSONResponse(content={"status": "ok", "nb_urls": len(get_url_list())}) # Background thread pour pinger les URLs toutes les heures def ping_loop(): while True: for url in get_url_list(): try: if get_wake_up_action_name(url): print(f"[wake-up] 🚀 {url}") wake_up_space(url) else: requests.get(url, timeout=5) print(f"[ping] ✅ {url}") except Exception as e: print(f"[ping] ❌ {url} | {e}") # Cooldown de 1 seconde entre les pings time.sleep(1) time.sleep(3600) # 1h threading.Thread(target=ping_loop, daemon=True).start() # Monter Gradio sur /gradio gr.mount_gradio_app(app, interface, path="/gradio")