import os import time import requests import gradio as gr import openstack from openstack import exceptions # --- CONFIGURATION & SHARED STATE --- active_user_count = 0 is_dekcib_alive = False clean_link = "149.165.152.222:3000" full_url = f"http://{clean_link}" # Styled HTML - Text: "Click here for De-KCIB Copilot" GREEN_FLASHING_LINK = f"""
""" def get_conn(): return openstack.connect( auth_url=os.getenv("OS_AUTH_URL"), application_credential_id=os.getenv("OS_APPLICATION_CREDENTIAL_ID"), application_credential_secret=os.getenv("OS_APPLICATION_CREDENTIAL_SECRET"), auth_type="v3applicationcredential", region_name="IU", interface="public" ) def get_current_status(): global active_user_count, is_dekcib_alive try: conn = get_conn() instance_id = os.getenv("OS_INSTANCE_ID") server = conn.compute.find_server(instance_id) status_text = "❌ Error: Instance Not Found" if server: status_map = { "ACTIVE": "🟢 RUNNING (ACTIVE)", "SHELVED_OFFLOADED": "💤 SLEEPING (SHELVED)", "SHUTOFF": "🔴 POWERED OFF", "BUILD": "🛠️ STARTING...", "SHELVING": "⏳ SAVING STATE..." } status_text = status_map.get(server.status, f"❓ STATE: {server.status}") if "RUNNING" in status_text: try: if requests.get(full_url, timeout=3).status_code < 500: is_dekcib_alive = True else: is_dekcib_alive = False except: is_dekcib_alive = False else: is_dekcib_alive = False link_update = gr.update(value=GREEN_FLASHING_LINK if is_dekcib_alive else "", visible=is_dekcib_alive) return status_text, f"👥 Space Visitors: {active_user_count}", link_update except Exception as e: return f"❌ Connection Error: {str(e)}", f"👥 Space Visitors: {active_user_count}", gr.update() def user_joined(): global active_user_count active_user_count += 1 return f"👥 Space Visitors: {active_user_count}" def user_left(): global active_user_count active_user_count = max(0, active_user_count - 1) def manage_instance(): global is_dekcib_alive try: conn = get_conn() instance_id = os.getenv("OS_INSTANCE_ID") server = conn.compute.find_server(instance_id) if not server: yield ("❌ Error: Instance ID not found in Jetstream2", gr.update(visible=False)) return if server.status != "ACTIVE": yield ("⏳ Milestone 1/3: Un-shelving De-KCIB...", gr.update(visible=False)) if server.status == "SHELVED_OFFLOADED": conn.compute.unshelve_server(server) conn.compute.wait_for_server(server, status='ACTIVE', wait=600) yield ("✅ Milestone 2/3: VM is ACTIVE. Starting software...", gr.update(visible=False)) yield ("🔄 Milestone 3/3: Connecting to De-KCIB Frontend...", gr.update(visible=False)) for i in range(30): try: if requests.get(full_url, timeout=3).status_code < 500: is_dekcib_alive = True yield ("🎉 Success! De-KCIB is ready for use.", gr.update(value=GREEN_FLASHING_LINK, visible=True)) return except: pass yield (f"🔄 Milestone 3/3: Software booting ({i+1}/30)...", gr.update(visible=False)) time.sleep(5) except Exception as e: yield (f"❌ Error during activation: {str(e)}", gr.update(visible=False)) combined_js = """ """ with gr.Blocks(title="De-KCIB Access Portal") as demo: gr.HTML(combined_js) session_tracker = gr.State(value="active", delete_callback=user_left) gr.HTML("