jeongsoo commited on
Commit
18aeb7a
·
1 Parent(s): d7c9976
Files changed (1) hide show
  1. app.py +53 -65
app.py CHANGED
@@ -23,6 +23,9 @@ def connect_server(ngrok_url):
23
 
24
  def check_status(ngrok_url):
25
  """서버 상태 확인"""
 
 
 
26
  try:
27
  response = requests.get(f"{ngrok_url}/api/status", timeout=5)
28
 
@@ -35,6 +38,12 @@ def check_status(ngrok_url):
35
 
36
  def echo_test(ngrok_url, message):
37
  """에코 테스트"""
 
 
 
 
 
 
38
  try:
39
  payload = {
40
  "action": "echo",
@@ -58,20 +67,36 @@ def echo_test(ngrok_url, message):
58
 
59
  def get_devices(ngrok_url):
60
  """장치 목록 조회"""
 
 
 
61
  try:
62
  response = requests.get(f"{ngrok_url}/api/devices", timeout=5)
63
 
64
  if response.status_code == 200:
65
- return json.dumps(response.json(), indent=2, ensure_ascii=False)
 
 
 
 
 
 
 
 
 
 
66
  else:
67
- return f"장치 목록 조회 실패: HTTP {response.status_code}\n{response.text}"
68
  except RequestException as e:
69
- return f"장치 목록 조회 중 오류 발생: {str(e)}"
70
 
71
  def get_device_info(ngrok_url, device_id):
72
  """장치 상세 정보 조회"""
 
 
 
73
  if not device_id:
74
- return "장치 ID를 선택해주세요"
75
 
76
  try:
77
  response = requests.get(f"{ngrok_url}/api/device/{device_id}/info", timeout=5)
@@ -85,11 +110,24 @@ def get_device_info(ngrok_url, device_id):
85
 
86
  def get_programs(ngrok_url):
87
  """프로그램 목록 조회"""
 
 
 
88
  try:
89
  response = requests.get(f"{ngrok_url}/api/programs", timeout=5)
90
 
91
  if response.status_code == 200:
92
- return json.dumps(response.json(), indent=2, ensure_ascii=False), response.json().get("programs", [])
 
 
 
 
 
 
 
 
 
 
93
  else:
94
  return f"프로그램 목록 조회 실패: HTTP {response.status_code}\n{response.text}", []
95
  except RequestException as e:
@@ -97,8 +135,11 @@ def get_programs(ngrok_url):
97
 
98
  def execute_program(ngrok_url, program_id):
99
  """프로그램 실행"""
 
 
 
100
  if not program_id:
101
- return "프로그램 ID를 선택해주세요"
102
 
103
  try:
104
  response = requests.post(f"{ngrok_url}/api/programs/{program_id}/execute", timeout=5)
@@ -110,49 +151,14 @@ def execute_program(ngrok_url, program_id):
110
  except RequestException as e:
111
  return f"프로그램 실행 중 오류 발생: {str(e)}"
112
 
113
- # 장치 목록에서 드롭다운용 옵션 생성
114
- def get_device_options(devices_json):
115
- try:
116
- if not devices_json:
117
- return []
118
-
119
- try:
120
- devices_data = json.loads(devices_json)
121
- except:
122
- return []
123
-
124
- if "devices" not in devices_data:
125
- return []
126
-
127
- options = []
128
- for device in devices_data["devices"]:
129
- device_id = device.get("id", "")
130
- device_name = device.get("name", "Unknown Device")
131
- device_type = device.get("type", "Unknown")
132
- options.append((f"{device_name} ({device_type})", device_id))
133
-
134
- return options
135
- except:
136
- return []
137
-
138
- # 프로그램 목록에서 드롭다운용 옵션 생성
139
- def get_program_options(programs):
140
- try:
141
- options = []
142
- for program in programs:
143
- program_id = program.get("id", "")
144
- program_name = program.get("name", "Unknown Program")
145
- program_desc = program.get("description", "")
146
- options.append((f"{program_name} - {program_desc}", program_id))
147
- return options
148
- except:
149
- return []
150
-
151
  # UI 구성
152
  with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
153
  gr.Markdown("# LocalPCAgent 제어 인터페이스")
154
  gr.Markdown("로컬 PC의 기능을 원격으로 제어하고 관리할 수 있는 웹 인터페이스입니다.")
155
 
 
 
 
156
  # 서버 연결 섹션
157
  with gr.Group():
158
  gr.Markdown("## 서버 연결")
@@ -165,7 +171,6 @@ with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
165
  connect_btn = gr.Button("연결")
166
 
167
  connection_status = gr.Textbox(label="연결 상태", interactive=False)
168
- server_url = gr.State("")
169
 
170
  # 작업 메뉴 탭
171
  with gr.Tabs() as tabs:
@@ -195,7 +200,6 @@ with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
195
 
196
  with gr.Group():
197
  gr.Markdown("### 장치 상세 정보")
198
- devices_raw = gr.State("")
199
  device_dropdown = gr.Dropdown(label="장치 선택", choices=[])
200
  get_device_info_btn = gr.Button("장치 정보 가져오기")
201
  device_info_result = gr.Textbox(label="결과", interactive=False, lines=15)
@@ -237,14 +241,7 @@ with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
237
  get_devices_btn.click(
238
  get_devices,
239
  inputs=[server_url],
240
- outputs=[devices_result, devices_raw]
241
- )
242
-
243
- # 장치 목록 결과가 업데이트될 때 드롭다운 업데이트
244
- devices_raw.change(
245
- get_device_options,
246
- inputs=[devices_raw],
247
- outputs=[device_dropdown]
248
  )
249
 
250
  get_device_info_btn.click(
@@ -254,19 +251,10 @@ with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
254
  )
255
 
256
  # 프로그램 실행 이벤트
257
- programs_state = gr.State([])
258
-
259
- get_programs_result = get_programs_btn.click(
260
  get_programs,
261
  inputs=[server_url],
262
- outputs=[programs_result, programs_state]
263
- )
264
-
265
- # 프로그램 목록 결과가 업데이트될 때 드롭다운 업데이트
266
- programs_state.change(
267
- get_program_options,
268
- inputs=[programs_state],
269
- outputs=[program_dropdown]
270
  )
271
 
272
  execute_program_btn.click(
 
23
 
24
  def check_status(ngrok_url):
25
  """서버 상태 확인"""
26
+ if not ngrok_url:
27
+ return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요."
28
+
29
  try:
30
  response = requests.get(f"{ngrok_url}/api/status", timeout=5)
31
 
 
38
 
39
  def echo_test(ngrok_url, message):
40
  """에코 테스트"""
41
+ if not ngrok_url:
42
+ return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요."
43
+
44
+ if not message:
45
+ return "메시지를 입력해주세요."
46
+
47
  try:
48
  payload = {
49
  "action": "echo",
 
67
 
68
  def get_devices(ngrok_url):
69
  """장치 목록 조회"""
70
+ if not ngrok_url:
71
+ return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요.", []
72
+
73
  try:
74
  response = requests.get(f"{ngrok_url}/api/devices", timeout=5)
75
 
76
  if response.status_code == 200:
77
+ result_json = response.json()
78
+ device_options = []
79
+
80
+ # 장치 목록에서 드롭다운 옵션 생성
81
+ for device in result_json.get("devices", []):
82
+ device_id = device.get("id", "")
83
+ device_name = device.get("name", "Unknown Device")
84
+ device_type = device.get("type", "Unknown")
85
+ device_options.append((f"{device_name} ({device_type})", device_id))
86
+
87
+ return json.dumps(result_json, indent=2, ensure_ascii=False), device_options
88
  else:
89
+ return f"장치 목록 조회 실패: HTTP {response.status_code}\n{response.text}", []
90
  except RequestException as e:
91
+ return f"장치 목록 조회 중 오류 발생: {str(e)}", []
92
 
93
  def get_device_info(ngrok_url, device_id):
94
  """장치 상세 정보 조회"""
95
+ if not ngrok_url:
96
+ return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요."
97
+
98
  if not device_id:
99
+ return "장치를 선택해주세요."
100
 
101
  try:
102
  response = requests.get(f"{ngrok_url}/api/device/{device_id}/info", timeout=5)
 
110
 
111
  def get_programs(ngrok_url):
112
  """프로그램 목록 조회"""
113
+ if not ngrok_url:
114
+ return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요.", []
115
+
116
  try:
117
  response = requests.get(f"{ngrok_url}/api/programs", timeout=5)
118
 
119
  if response.status_code == 200:
120
+ result_json = response.json()
121
+ program_options = []
122
+
123
+ # 프로그램 목록에서 드롭다운 옵션 생성
124
+ for program in result_json.get("programs", []):
125
+ program_id = program.get("id", "")
126
+ program_name = program.get("name", "Unknown Program")
127
+ program_desc = program.get("description", "")
128
+ program_options.append((f"{program_name} - {program_desc}", program_id))
129
+
130
+ return json.dumps(result_json, indent=2, ensure_ascii=False), program_options
131
  else:
132
  return f"프로그램 목록 조회 실패: HTTP {response.status_code}\n{response.text}", []
133
  except RequestException as e:
 
135
 
136
  def execute_program(ngrok_url, program_id):
137
  """프로그램 실행"""
138
+ if not ngrok_url:
139
+ return "서버 URL이 설정되지 않았습니다. 먼저 서버에 연결하세요."
140
+
141
  if not program_id:
142
+ return "프로그램을 선택해주세요."
143
 
144
  try:
145
  response = requests.post(f"{ngrok_url}/api/programs/{program_id}/execute", timeout=5)
 
151
  except RequestException as e:
152
  return f"프로그램 실행 중 오류 발생: {str(e)}"
153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  # UI 구성
155
  with gr.Blocks(title="LocalPCAgent 제어 인터페이스") as demo:
156
  gr.Markdown("# LocalPCAgent 제어 인터페이스")
157
  gr.Markdown("로컬 PC의 기능을 원격으로 제어하고 관리할 수 있는 웹 인터페이스입니다.")
158
 
159
+ # 서버 URL 상태 저장
160
+ server_url = gr.State("")
161
+
162
  # 서버 연결 섹션
163
  with gr.Group():
164
  gr.Markdown("## 서버 연결")
 
171
  connect_btn = gr.Button("연결")
172
 
173
  connection_status = gr.Textbox(label="연결 상태", interactive=False)
 
174
 
175
  # 작업 메뉴 탭
176
  with gr.Tabs() as tabs:
 
200
 
201
  with gr.Group():
202
  gr.Markdown("### 장치 상세 정보")
 
203
  device_dropdown = gr.Dropdown(label="장치 선택", choices=[])
204
  get_device_info_btn = gr.Button("장치 정보 가져오기")
205
  device_info_result = gr.Textbox(label="결과", interactive=False, lines=15)
 
241
  get_devices_btn.click(
242
  get_devices,
243
  inputs=[server_url],
244
+ outputs=[devices_result, device_dropdown]
 
 
 
 
 
 
 
245
  )
246
 
247
  get_device_info_btn.click(
 
251
  )
252
 
253
  # 프로그램 실행 이벤트
254
+ get_programs_btn.click(
 
 
255
  get_programs,
256
  inputs=[server_url],
257
+ outputs=[programs_result, program_dropdown]
 
 
 
 
 
 
 
258
  )
259
 
260
  execute_program_btn.click(