File size: 5,853 Bytes
4f2be76
 
4e1c32a
cb65975
 
4e1c32a
db7d3b2
4e1c32a
4f2be76
d870b92
2877b2d
67c9619
 
 
 
 
 
 
 
 
d870b92
 
67c9619
 
d3f4fff
3a30bef
d3f4fff
 
01b6321
d3f4fff
01b6321
 
 
 
 
 
 
 
 
 
 
 
d3f4fff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67c9619
 
cb65975
db7d3b2
67c9619
b262257
67c9619
b262257
67c9619
db7d3b2
b262257
67c9619
db7d3b2
4e1c32a
67c9619
db7d3b2
b262257
db7d3b2
2877b2d
67c9619
 
 
 
 
46a61fe
cb65975
 
 
 
 
 
 
db7d3b2
b262257
4f2be76
d870b92
db7d3b2
46a61fe
d870b92
67c9619
4f2be76
03fea9e
 
 
 
 
cb65975
 
 
2877b2d
b262257
d870b92
 
b262257
db7d3b2
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import gradio as gr
import requests
import logging
import threading
import time

# ๋กœ๊น… ์„ค์ •
logging.basicConfig(level=logging.INFO)

css = """
footer { visibility: hidden; }
.status-button { 
    display: inline-block;
    padding: 5px 10px;
    margin: 5px;
    border-radius: 5px;
    font-size: 12px;
}
.status-normal { background-color: green; color: white; }
.status-abnormal { background-color: red; color: white; }
"""

# ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์ƒ ๋ชฉ๋ก
TARGETS = [
    {"name": "[GINI/DS]ํ…Œ์ŠคํŠธ", "url": "http://hugpu.ai:8888"},
    {"name": "[OFAI/DS]ํ…Œ์ŠคํŠธ", "url": "http://hugpu.ai:8888"},
    {"name": "[HF]ํ…Œ์ŠคํŠธ", "url": "http://hugpu.ai:8888"},    
    {"name": "[H100]AI ๊ฐœ์ธ๋น„์„œ JinJAVIS", "url": "http://hugpu.ai:8000"},
    
    {"name": "[HUGPU]FLUX ํ™•์žฅ ์ด๋ฏธ์ง€ ์ƒ์„ฑ", "url": "https://fantaxy-ofai-flx-expl-store.hf.space"},
    {"name": "[HUGPU]FLUX GIF ์ƒ์„ฑ", "url": "https://aiqtech-flxgif.hf.space"},     
    {"name": "[HUGPU]LOGO ๋””์ž์ธ ์ƒ์„ฑ ", "url": "https://fantaxy-ofai-flx-logo.hf.space"},     
    {"name": "[HUGPU]FLUX ํ”„๋กฌํ”„ํŠธ ์ƒ์„ฑ ", "url": "https://ginipick-flux-prompt-generator.hf.space"},     
    {"name": "[HUGPU]ํ”„๋กฌํ”„ํŠธ+์ด๋ฏธ์ง€๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ", "url": "https://.hf.space"},  ##์ž˜๋ชป๋œ URL: INDEX.HTML๋„ ์ˆ˜์ •ํ• ๊ฒƒ   
    {"name": "[HUGPU]LoRA: ๊ธฐ๋ธ”๋ฆฌ ์Šคํƒ€์ผ ", "url": "https://aiqtech-flux-ghibli-studio-lora.hf.space"},  
    {"name": "[HUGPU]LoRA: ์นดํˆฐ ์Šคํƒ€์ผ ", "url": "https://aiqtech-flxani.hf.space"},     
    {"name": "[HUGPU]FLUX 8step LoRA ์ด๋ฏธ์ง€ ์ƒ์„ฑ ", "url": "https://fantos-flx8lora.hf.space"},     
    {"name": "[HUGPU]FLUX ํ…์ŠคํŠธ TO ๋น„๋””์˜ค ์ƒ์„ฑ ", "url": "https://fantos-cogvidx.hf.space"},     
    {"name": "[HUGPU]FLUX ํŒจ์…˜๋ชจ๋ธ ์ƒ์„ฑ ", "url": "https://fantos-flxfashmodel.hf.space"},     
    {"name": "[HUGPU]FLUX Controlnet ", "url": "https://fantos-flxcontrol.hf.space"},  
    {"name": "[HUGPU]FLUX NF4 ์ด๋ฏธ์ง€ ์ƒ์„ฑ ", "url": "https://ginipick-ofai-flxnf4.hf.space"},     
    
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},      
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},  
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},  
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},  
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},  
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},  
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},     
    {"name": "[HUGPU] ", "url": "https://.hf.space"},       
]


# URL ์ƒํƒœ ํ™•์ธ ํ•จ์ˆ˜
def check_url_status(url):
    try:
        response = requests.get(url, timeout=5)
        if response.status_code == 200:
            logging.info(f"URL ์ ‘์† ์„ฑ๊ณต: {url}")
            return "์ •์ƒ", "normal"
        else:
            logging.error(f"URL ์ ‘์† ์˜ค๋ฅ˜: {url}, ์ƒํƒœ ์ฝ”๋“œ {response.status_code}")
            return "๋น„์ •์ƒ", "abnormal"
    except requests.exceptions.RequestException as e:
        logging.exception(f"์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {url}")
        return "๋น„์ •์ƒ", "abnormal"

# ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜
def update_status():
    status_html = ""
    for target in TARGETS:
        status, status_class = check_url_status(target["url"])
        status_html += f'<span class="status-button status-{status_class}">{target["name"]}: {status}</span>'
    return status_html

# ์ฃผ๊ธฐ์  ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜
def periodic_update(status_html):
    while True:
        time.sleep(10)  # 10์ดˆ ๋Œ€๊ธฐ
        new_status = update_status()
        status_html.update(value=new_status)

# Gradio ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ •
def create_dashboard():
    with gr.Blocks(css=css) as app:
        gr.Image("banner.png", show_label=False)
        gr.Markdown("# 24์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ")
        gr.Markdown("## \n")
        
        status_html = gr.HTML()
        
        refresh_button = gr.Button("์ƒํƒœ ์ƒˆ๋กœ๊ณ ์นจ")
        refresh_button.click(fn=update_status, outputs=status_html)

        # ์ดˆ๊ธฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
        app.load(fn=update_status, outputs=status_html)

        # ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฃผ๊ธฐ์  ์—…๋ฐ์ดํŠธ ์‹œ์ž‘
        threading.Thread(target=periodic_update, args=(status_html,), daemon=True).start()
    
    return app

if __name__ == "__main__":
    dashboard = create_dashboard()
    dashboard.launch()