Spaces:
Running
Running
| 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") | |
| 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" | |
| ) | |
| def root_redirect(): | |
| return RedirectResponse(url="/gradio") | |
| 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") | |