Spaces:
Sleeping
Sleeping
release err fix
Browse files- DESCRIPTION.md +21 -0
- README.md +90 -13
- app.py +3 -33
- gradio_interface.py +38 -0
- title.md +1 -0
DESCRIPTION.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LocalPCAgent 웹 인터페이스
|
| 2 |
+
|
| 3 |
+
이 Space는 LocalPCAgent 서버와 통신하여 로컬 PC의 기능을 원격으로 제어하고 관리할 수 있는 웹 인터페이스를 제공합니다.
|
| 4 |
+
|
| 5 |
+
## 사용 방법
|
| 6 |
+
|
| 7 |
+
1. 로컬 PC에서 LocalPCAgent 서버와 ngrok을 실행합니다.
|
| 8 |
+
2. ngrok에서 제공하는 URL을 이 웹앱에 입력합니다.
|
| 9 |
+
3. '연결' 버튼을 클릭하여 서버와 통신을 시작합니다.
|
| 10 |
+
4. 다양한 기능 탭을 사용하여 로컬 PC의 장치 및 프로그램을 관리합니다.
|
| 11 |
+
|
| 12 |
+
## 주요 기능
|
| 13 |
+
|
| 14 |
+
- 서버 상태 모니터링
|
| 15 |
+
- 장치 목록 조회 및 관리
|
| 16 |
+
- 프로그램 실행
|
| 17 |
+
- 고급 API 요청 테스트
|
| 18 |
+
|
| 19 |
+
## 주의사항
|
| 20 |
+
|
| 21 |
+
이 웹앱은 개발 및 테스트 목적으로 제공됩니다. 인증 메커니즘 없이 ngrok URL만 알면 누구나 접속할 수 있으므로, 보안이 중요한 환경에서는 주의하여 사용하세요.
|
README.md
CHANGED
|
@@ -1,13 +1,90 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LocalPCAgent HuggingFace 웹 인터페이스
|
| 2 |
+
|
| 3 |
+
이 웹앱은 [LocalPCAgent](https://github.com/yourusername/LocalPCAgent) 서버와 통신하여 로컬 PC의 기능을 원격으로 제어하고 테스트할 수 있는 인터페이스를 제공합니다.
|
| 4 |
+
|
| 5 |
+
## 특징
|
| 6 |
+
|
| 7 |
+
- 직관적인 웹 기반 인터페이스
|
| 8 |
+
- ngrok URL을 통한 서버 연결
|
| 9 |
+
- 서버 상태 모니터링
|
| 10 |
+
- 장치 및 프로그램 관리
|
| 11 |
+
- 에코 테스트 및 커스텀 요청 기능
|
| 12 |
+
- 상세한 로그 기록
|
| 13 |
+
|
| 14 |
+
## 사용 방법
|
| 15 |
+
|
| 16 |
+
1. **서버 URL 설정**
|
| 17 |
+
- 로컬 PC에서 ngrok을 사용하여 LocalPCAgent 서버를 실행합니다.
|
| 18 |
+
- 생성된 ngrok URL을 웹앱의 입력 필드에 입력하고 '연결' 버튼을 클릭합니다.
|
| 19 |
+
|
| 20 |
+
2. **기본 기능**
|
| 21 |
+
- '상태 확인' 버튼을 클릭하여 서버 상태를 확인합니다.
|
| 22 |
+
- 메시지 입력 후 '에코 테스트' 버튼을 클릭하여 UDP 통신을 테스트합니다.
|
| 23 |
+
|
| 24 |
+
3. **장치 관리**
|
| 25 |
+
- '장치 목록 가져오기' 버튼을 클릭하여 연결된 장치를 조회합니다.
|
| 26 |
+
- 장치를 선택하고 '장치 정보 가져오기' 버튼을 클릭하여 상세 정보를 확인합니다.
|
| 27 |
+
|
| 28 |
+
4. **프로그램 실행**
|
| 29 |
+
- '프로그램 목록 가져오기' 버튼을 클릭하여 실행 가능한 프로그램을 조회합니다.
|
| 30 |
+
- 프로그램을 선택하고 '프로그램 실행' 버튼을 클릭하여 로컬 PC에서 실행합니다.
|
| 31 |
+
|
| 32 |
+
5. **고급 기능**
|
| 33 |
+
- 커스텀 API 요청을 작성하고 전송할 수 있습니다.
|
| 34 |
+
- 다양한 엔드포인트 및 HTTP 메소드 사용 가능
|
| 35 |
+
|
| 36 |
+
## 로컬에서 실행하기
|
| 37 |
+
|
| 38 |
+
1. 이 저장소를 클론합니다.
|
| 39 |
+
2. 웹 서버(예: Python의 `http.server`)를 사용하여 로컬에서 실행합니다:
|
| 40 |
+
```bash
|
| 41 |
+
python -m http.server 8080
|
| 42 |
+
```
|
| 43 |
+
3. 웹 브라우저에서 `http://localhost:8080`으로 접속합니다.
|
| 44 |
+
|
| 45 |
+
## HuggingFace Spaces 배포
|
| 46 |
+
|
| 47 |
+
이 웹앱은 [HuggingFace Spaces](https://huggingface.co/spaces)에 쉽게 배포할 수 있습니다:
|
| 48 |
+
|
| 49 |
+
1. HuggingFace 계정으로 로그인합니다.
|
| 50 |
+
2. 새 Space를 생성하고 "Static" 템플릿을 선택합니다.
|
| 51 |
+
3. 이 저장소의 파일을 Space에 업로드합니다.
|
| 52 |
+
|
| 53 |
+
## 보안 고려사항
|
| 54 |
+
|
| 55 |
+
이 웹앱은 개발 및 테스트 목적으로 설계되었습니다. 프로덕션 환경에서 사용하기 전에 다음 사항을 고려하세요:
|
| 56 |
+
|
| 57 |
+
1. ngrok은 임시 URL을 제공하므로 보안에 주의해야 합니다.
|
| 58 |
+
2. 인증 메커니즘이 없으므로 누구나 URL만 알면 접근할 수 있습니다.
|
| 59 |
+
3. 프로그램 실행 기능은 시스템에 영향을 줄 수 있으므로 신중하게 사용해야 합니다.
|
| 60 |
+
4. 민감한 정보를 포함한 시스템에서는 추가 보안 조치가 필요합니다.
|
| 61 |
+
|
| 62 |
+
## 기술 스택
|
| 63 |
+
|
| 64 |
+
- HTML5
|
| 65 |
+
- CSS3
|
| 66 |
+
- JavaScript (ES6+)
|
| 67 |
+
- LocalStorage API (URL 저장용)
|
| 68 |
+
- Fetch API (HTTP 요청용)
|
| 69 |
+
|
| 70 |
+
## API 참조
|
| 71 |
+
|
| 72 |
+
웹앱에서 사용하는 주요 API 엔드포인트:
|
| 73 |
+
|
| 74 |
+
| 엔드포인트 | 메소드 | 설명 |
|
| 75 |
+
|------------|--------|------|
|
| 76 |
+
| `/health` | GET | 서버 상태 확인 |
|
| 77 |
+
| `/api/status` | GET | 상세 서버 정보 조회 |
|
| 78 |
+
| `/api/send` | POST | UDP 메시지 전송 |
|
| 79 |
+
| `/api/devices` | GET | 장치 목록 조회 |
|
| 80 |
+
| `/api/device/{id}/info` | GET | 장치 상세 정보 조회 |
|
| 81 |
+
| `/api/programs` | GET | 프로그램 목록 조회 |
|
| 82 |
+
| `/api/programs/{id}/execute` | POST | 프로그램 실행 |
|
| 83 |
+
|
| 84 |
+
## 라이선스
|
| 85 |
+
|
| 86 |
+
MIT 라이선스
|
| 87 |
+
|
| 88 |
+
## 기여하기
|
| 89 |
+
|
| 90 |
+
이슈 및 풀 리퀘스트는 언제든지 환영합니다. 버그 리포트, 기능 요청, 또는 코드 기여를 통해 프로젝트를 개선하는 데 도움을 주세요.
|
app.py
CHANGED
|
@@ -1,36 +1,6 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
import
|
| 3 |
-
|
| 4 |
-
# 웹앱 파일들 경로
|
| 5 |
-
HTML_PATH = os.path.join(os.path.dirname(__file__), "index.html")
|
| 6 |
-
CSS_PATH = os.path.join(os.path.dirname(__file__), "style.css")
|
| 7 |
-
JS_PATH = os.path.join(os.path.dirname(__file__), "app.js")
|
| 8 |
-
|
| 9 |
-
# HTML 파일 불러오기
|
| 10 |
-
with open(HTML_PATH, "r", encoding="utf-8") as f:
|
| 11 |
-
html_content = f.read()
|
| 12 |
-
|
| 13 |
-
# CSS 파일 불러오기
|
| 14 |
-
with open(CSS_PATH, "r", encoding="utf-8") as f:
|
| 15 |
-
css_content = f.read()
|
| 16 |
-
|
| 17 |
-
# JS 파일 불러오기
|
| 18 |
-
with open(JS_PATH, "r", encoding="utf-8") as f:
|
| 19 |
-
js_content = f.read()
|
| 20 |
-
|
| 21 |
-
# HTML에 CSS와 JS 직접 삽입 (외부 참조 대신)
|
| 22 |
-
html_with_inline_assets = html_content.replace(
|
| 23 |
-
'<link rel="stylesheet" href="style.css">',
|
| 24 |
-
f'<style>{css_content}</style>'
|
| 25 |
-
).replace(
|
| 26 |
-
'<script src="app.js"></script>',
|
| 27 |
-
f'<script>{js_content}</script>'
|
| 28 |
-
)
|
| 29 |
-
|
| 30 |
-
# Gradio 인터페이스 생성
|
| 31 |
-
def create_interface():
|
| 32 |
-
return gr.HTML(html_with_inline_assets)
|
| 33 |
|
| 34 |
# Gradio 앱 시작
|
| 35 |
-
|
| 36 |
-
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
from gradio_interface import demo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
# Gradio 앱 시작
|
| 5 |
+
if __name__ == "__main__":
|
| 6 |
+
demo.launch()
|
gradio_interface.py
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import os
|
| 3 |
+
|
| 4 |
+
def create_webapp():
|
| 5 |
+
# 웹앱 파일들 경로
|
| 6 |
+
HTML_PATH = os.path.join(os.path.dirname(__file__), "index.html")
|
| 7 |
+
CSS_PATH = os.path.join(os.path.dirname(__file__), "style.css")
|
| 8 |
+
JS_PATH = os.path.join(os.path.dirname(__file__), "app.js")
|
| 9 |
+
|
| 10 |
+
# HTML 파일 불러오기
|
| 11 |
+
with open(HTML_PATH, "r", encoding="utf-8") as f:
|
| 12 |
+
html_content = f.read()
|
| 13 |
+
|
| 14 |
+
# CSS 파일 불러오기
|
| 15 |
+
with open(CSS_PATH, "r", encoding="utf-8") as f:
|
| 16 |
+
css_content = f.read()
|
| 17 |
+
|
| 18 |
+
# JS 파일 불러오기
|
| 19 |
+
with open(JS_PATH, "r", encoding="utf-8") as f:
|
| 20 |
+
js_content = f.read()
|
| 21 |
+
|
| 22 |
+
# HTML에 CSS와 JS 직접 삽입 (외부 참조 대신)
|
| 23 |
+
html_with_inline_assets = html_content.replace(
|
| 24 |
+
'<link rel="stylesheet" href="style.css">',
|
| 25 |
+
f'<style>{css_content}</style>'
|
| 26 |
+
).replace(
|
| 27 |
+
'<script src="app.js"></script>',
|
| 28 |
+
f'<script>{js_content}</script>'
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
# Gradio 블록 생성
|
| 32 |
+
with gr.Blocks(css="footer {display:none}") as demo:
|
| 33 |
+
gr.HTML(html_with_inline_assets)
|
| 34 |
+
|
| 35 |
+
return demo
|
| 36 |
+
|
| 37 |
+
# 웹 앱 생성 및 반환
|
| 38 |
+
demo = create_webapp()
|
title.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
LocalPCAgent 제어 인터페이스
|