Spaces:
Sleeping
Sleeping
""" | |
RAG ๊ฒ์ ์ฑ๋ด ์น ์ ํ๋ฆฌ์ผ์ด์ - ์ฅ์น ๊ด๋ฆฌ API ๋ผ์ฐํธ ์ ์ (API ๊ฒฝ๋ก ์์ ๋จ) | |
""" | |
import logging | |
import requests | |
from flask import request, jsonify | |
# ๋ก๊ฑฐ ๊ฐ์ ธ์ค๊ธฐ | |
logger = logging.getLogger(__name__) | |
def register_device_routes(app, login_required, DEVICE_SERVER_URL): | |
"""Flask ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฅ์น ๊ด๋ฆฌ ๊ด๋ จ ๋ผ์ฐํธ ๋ฑ๋ก""" | |
# ์ฌ์ฉ์ ์ง์ ์ฅ์น ์๋ฒ URL ๋ณ์ | |
custom_device_url = None | |
# URL ์ค์ ํจ์ | |
def get_device_url(): | |
# ์ฌ์ฉ์ ์ง์ URL์ด ์์ผ๋ฉด ์ฌ์ฉ, ์์ผ๋ฉด ํ๊ฒฝ๋ณ์ ๊ฐ ์ฌ์ฉ | |
return custom_device_url or DEVICE_SERVER_URL | |
def connect_device_server(): | |
"""์ฌ์ฉ์ ์ง์ ์ฅ์น ์๋ฒ URL ์ฐ๊ฒฐ API""" | |
nonlocal custom_device_url # ์์ ์ค์ฝํ์ ๋ณ์ ์ฐธ์กฐ | |
try: | |
# ์์ฒญ์์ URL ๊ฐ์ ธ์ค๊ธฐ | |
request_data = request.get_json() | |
if not request_data or 'url' not in request_data: | |
logger.error("URL์ด ์ ๊ณต๋์ง ์์์ต๋๋ค.") | |
return jsonify({ | |
"success": False, | |
"error": "URL์ด ์ ๊ณต๋์ง ์์์ต๋๋ค." | |
}), 400 # Bad Request | |
new_url = request_data['url'].strip() | |
if not new_url: | |
logger.error("URL์ด ๋น์ด ์์ต๋๋ค.") | |
return jsonify({ | |
"success": False, | |
"error": "URL์ด ๋น์ด ์์ต๋๋ค." | |
}), 400 # Bad Request | |
# URL ์ค์ | |
logger.info(f"์ฌ์ฉ์ ์ง์ ์ฅ์น ์๋ฒ URL ์ค์ : {new_url}") | |
custom_device_url = new_url | |
# ์ค์ ๋ URL๋ก ์ํ ํ์ธ ์๋ | |
try: | |
api_path = "/api/status" | |
logger.info(f"์ฅ์น ์๋ฒ ์ํ ํ์ธ ์์ฒญ: {custom_device_url}{api_path}") | |
response = requests.get(f"{custom_device_url}{api_path}", timeout=5) | |
if response.status_code == 200: | |
try: | |
data = response.json() | |
logger.info(f"์ฌ์ฉ์ ์ง์ ์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ์ฑ๊ณต. ์๋ต ๋ฐ์ดํฐ: {data}") | |
return jsonify({ | |
"success": True, | |
"message": "์ฅ์น ์๋ฒ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ต๋๋ค.", | |
"server_status": data.get("status", "์ ์") | |
}) | |
except requests.exceptions.JSONDecodeError: | |
logger.error("์ฅ์น ์๋ฒ ์๋ต JSON ํ์ฑ ์คํจ") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ์๋ฒ๋ก๋ถํฐ ์ ํจํ์ง ์์ JSON ์๋ต์ ๋ฐ์์ต๋๋ค." | |
}), 502 # Bad Gateway | |
else: | |
error_message = f"์ฅ์น ์๋ฒ ์๋ต ์ค๋ฅ: {response.status_code}" | |
try: | |
error_detail = response.json().get("error", response.text) | |
error_message += f" - {error_detail}" | |
except Exception: | |
error_message += f" - {response.text}" | |
logger.warning(error_message) | |
custom_device_url = None # ์ฐ๊ฒฐ ์คํจ ์ URL ์ด๊ธฐํ | |
return jsonify({ | |
"success": False, | |
"error": error_message | |
}), 502 # Bad Gateway | |
except requests.exceptions.Timeout: | |
logger.error(f"์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ํ์์์ ({custom_device_url})") | |
custom_device_url = None # ์ฐ๊ฒฐ ์คํจ ์ URL ์ด๊ธฐํ | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ํ์์์. ์๋ฒ ์๋ต์ด ๋๋ฌด ๋๋ฆฝ๋๋ค." | |
}), 504 # Gateway Timeout | |
except requests.exceptions.ConnectionError: | |
logger.error(f"์ฅ์น ๊ด๋ฆฌ ์๋ฒ ์ฐ๊ฒฐ ์คํจ ({custom_device_url})") | |
custom_device_url = None # ์ฐ๊ฒฐ ์คํจ ์ URL ์ด๊ธฐํ | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ๊ด๋ฆฌ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์คํ ์ค์ธ์ง, URL์ด ์ ํํ์ง ํ์ธํด์ฃผ์ธ์." | |
}), 502 # Bad Gateway | |
except Exception as e: | |
logger.error(f"์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ์ค ์์์น ๋ชปํ ์ค๋ฅ ๋ฐ์: {e}", exc_info=True) | |
custom_device_url = None # ์ฐ๊ฒฐ ์คํจ ์ URL ์ด๊ธฐํ | |
return jsonify({ | |
"success": False, | |
"error": f"์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 # Internal Server Error | |
except Exception as e: | |
logger.error(f"/api/device/connect ์ฒ๋ฆฌ ์ค ๋ด๋ถ ์๋ฒ ์ค๋ฅ: {e}", exc_info=True) | |
return jsonify({ | |
"success": False, | |
"error": f"๋ด๋ถ ์๋ฒ ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 # Internal Server Error | |
def device_status(): | |
"""์ฅ์น ๊ด๋ฆฌ ์๋ฒ์ ์ํ๋ฅผ ํ์ธํ๋ API ์๋ํฌ์ธํธ""" | |
try: | |
# requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ์ ๋ด์์ ์ํฌํธํ ํ์ ์์ (์๋จ ์ํฌํธ ์ฌ์ฉ) | |
# json, jsonify๋ Flask์์ ์ด๋ฏธ ์ํฌํธ๋จ (์๋จ ์ํฌํธ ์ฌ์ฉ) | |
# ์ฐ๊ฒฐ ํ์์์ ์ค์ | |
timeout = 5 # 5์ด๋ก ํ์์์ ์ค์ | |
try: | |
# ์ฅ์น ์๋ฒ ์ํ ํ์ธ - ๊ฒฝ๋ก: /api/status | |
current_device_url = get_device_url() | |
api_path = "/api/status" | |
logger.info(f"์ฅ์น ์๋ฒ ์ํ ํ์ธ ์์ฒญ: {current_device_url}{api_path}") | |
response = requests.get(f"{current_device_url}{api_path}", timeout=timeout) | |
# ์๋ต ์ํ ์ฝ๋ ๋ฐ ๋ด์ฉ ๋ก๊น (๋๋ฒ๊น ๊ฐํ) | |
logger.debug(f"์ฅ์น ์๋ฒ ์๋ต ์ํ ์ฝ๋: {response.status_code}") | |
try: | |
logger.debug(f"์ฅ์น ์๋ฒ ์๋ต ๋ด์ฉ: {response.text[:200]}...") # ๋๋ฌด ๊ธธ๋ฉด ์๋ผ์ ๋ก๊น | |
except Exception: | |
logger.debug("์ฅ์น ์๋ฒ ์๋ต ๋ด์ฉ ๋ก๊น ์คํจ (ํ ์คํธ ํ์ ์๋?)") | |
if response.status_code == 200: | |
# ์ฑ๊ณต ์ ์๋ต ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ์ธ ๋ฐ ๋ก๊น | |
try: | |
data = response.json() | |
logger.info(f"์ฅ์น ์๋ฒ ์ํ ํ์ธ ์ฑ๊ณต. ์๋ต ๋ฐ์ดํฐ: {data}") | |
return jsonify({"success": True, "status": "connected", "data": data}) | |
except requests.exceptions.JSONDecodeError: | |
logger.error("์ฅ์น ์๋ฒ ์๋ต JSON ํ์ฑ ์คํจ") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ์๋ฒ๋ก๋ถํฐ ์ ํจํ์ง ์์ JSON ์๋ต์ ๋ฐ์์ต๋๋ค." | |
}), 502 # Bad Gateway (์ ์คํธ๋ฆผ ์๋ฒ ์ค๋ฅ) | |
else: | |
# ์คํจ ์ ์ค๋ฅ ๋ฉ์์ง ํฌํจ ๋ก๊น | |
error_message = f"์ฅ์น ์๋ฒ ์๋ต ์ค๋ฅ: {response.status_code}" | |
try: | |
# ์๋ฒ์์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ json์ผ๋ก ๋ณด๋ด๋ ๊ฒฝ์ฐ ํฌํจ | |
error_detail = response.json().get("error", response.text) | |
error_message += f" - {error_detail}" | |
except Exception: | |
error_message += f" - {response.text}" # JSON ํ์ฑ ์คํจ ์ ์๋ณธ ํ ์คํธ | |
logger.warning(error_message) # ๊ฒฝ๊ณ ๋ ๋ฒจ๋ก ๋ก๊น | |
return jsonify({ | |
"success": False, | |
"error": error_message | |
}), 502 # Bad Gateway | |
except requests.exceptions.Timeout: | |
logger.error(f"์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ํ์์์ ({DEVICE_SERVER_URL})") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ํ์์์. ์๋ฒ ์๋ต์ด ๋๋ฌด ๋๋ฆฝ๋๋ค." | |
}), 504 # Gateway Timeout | |
except requests.exceptions.ConnectionError: | |
current_device_url = get_device_url() | |
logger.error(f"์ฅ์น ๊ด๋ฆฌ ์๋ฒ ์ฐ๊ฒฐ ์คํจ ({current_device_url})") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ๊ด๋ฆฌ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์คํ ์ค์ธ์ง, URL์ด ์ ํํ์ง ํ์ธํด์ฃผ์ธ์." | |
}), 502 # Bad Gateway (์ฐ๊ฒฐ ์คํจ๋ ์ ์คํธ๋ฆผ ๋ฌธ์ ๋ก ๊ฐ์ฃผ) | |
except Exception as e: | |
logger.error(f"์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ์ค ์์์น ๋ชปํ ์ค๋ฅ ๋ฐ์: {e}", exc_info=True) # ์์ธ ์คํ ํธ๋ ์ด์ค ๋ก๊น | |
return jsonify({ | |
"success": False, | |
"error": f"์ฅ์น ์๋ฒ ์ฐ๊ฒฐ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 # Internal Server Error (Flask ์ฑ ๋ด๋ถ ๋๋ requests ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์ ๊ฐ๋ฅ์ฑ) | |
except Exception as e: | |
# ์ด try-except ๋ธ๋ก์ /api/device/status ๋ผ์ฐํธ ์์ฒด์ ๋ด๋ถ ์ค๋ฅ ์ฒ๋ฆฌ | |
logger.error(f"/api/device/status ์ฒ๋ฆฌ ์ค ๋ด๋ถ ์๋ฒ ์ค๋ฅ: {e}", exc_info=True) | |
return jsonify({ | |
"success": False, | |
"error": f"๋ด๋ถ ์๋ฒ ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 # Internal Server Error | |
def device_list(): | |
"""์ฅ์น ๋ชฉ๋ก ์กฐํ API""" | |
logger.info("์ฅ์น ๋ชฉ๋ก ์กฐํ ์์ฒญ") | |
try: | |
current_device_url = get_device_url() | |
api_path = "/api/devices" | |
logger.info(f"์ฅ์น ๋ชฉ๋ก ์กฐํ ์์ฒญ: {current_device_url}{api_path}") | |
response = requests.get(f"{current_device_url}{api_path}", timeout=5) | |
logger.debug(f"์ฅ์น ๋ชฉ๋ก ์๋ต ์ํ ์ฝ๋: {response.status_code}") | |
if response.status_code == 200: | |
try: | |
data = response.json() | |
devices = data.get("devices", []) | |
logger.info(f"์ฅ์น ๋ชฉ๋ก ์กฐํ ์ฑ๊ณต: {len(devices)}๊ฐ ์ฅ์น") | |
return jsonify({ | |
"success": True, | |
"devices": devices | |
}) | |
except requests.exceptions.JSONDecodeError: | |
logger.error("์ฅ์น ๋ชฉ๋ก ์๋ต JSON ํ์ฑ ์คํจ") | |
return jsonify({"success": False, "error": "์ฅ์น ์๋ฒ๋ก๋ถํฐ ์ ํจํ์ง ์์ JSON ์๋ต"}), 502 | |
else: | |
error_message = f"์ฅ์น ๋ชฉ๋ก ์กฐํ ์คํจ: {response.status_code}" | |
try: error_message += f" - {response.json().get('error', response.text)}" | |
except Exception: error_message += f" - {response.text}" | |
logger.warning(error_message) | |
return jsonify({ | |
"success": False, | |
"error": error_message | |
}), 502 | |
except requests.exceptions.Timeout: | |
logger.error("์ฅ์น ๋ชฉ๋ก ์กฐํ ์๊ฐ ์ด๊ณผ") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ๋ชฉ๋ก ์กฐํ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค." | |
}), 504 | |
except requests.exceptions.ConnectionError: | |
logger.error("์ฅ์น ๊ด๋ฆฌ ์๋ฒ ์ฐ๊ฒฐ ์คํจ") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ๊ด๋ฆฌ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์คํ ์ค์ธ์ง ํ์ธํด์ฃผ์ธ์." | |
}), 503 # Service Unavailable | |
except Exception as e: | |
logger.error(f"์ฅ์น ๋ชฉ๋ก ์กฐํ ์ค ์ค๋ฅ ๋ฐ์: {e}", exc_info=True) | |
return jsonify({ | |
"success": False, | |
"error": f"์ฅ์น ๋ชฉ๋ก ์กฐํ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 | |
def device_programs(): | |
"""์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ API""" | |
logger.info("ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์์ฒญ") | |
try: | |
current_device_url = get_device_url() | |
api_path = "/api/programs" | |
logger.info(f"ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์์ฒญ: {current_device_url}{api_path}") | |
response = requests.get(f"{current_device_url}{api_path}", timeout=5) | |
logger.debug(f"ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์๋ต ์ํ ์ฝ๋: {response.status_code}") | |
if response.status_code == 200: | |
try: | |
data = response.json() | |
programs = data.get("programs", []) | |
logger.info(f"ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์ฑ๊ณต: {len(programs)}๊ฐ ํ๋ก๊ทธ๋จ") | |
return jsonify({ | |
"success": True, | |
"programs": programs | |
}) | |
except requests.exceptions.JSONDecodeError: | |
logger.error("ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์๋ต JSON ํ์ฑ ์คํจ") | |
return jsonify({"success": False, "error": "์ฅ์น ์๋ฒ๋ก๋ถํฐ ์ ํจํ์ง ์์ JSON ์๋ต"}), 502 | |
else: | |
error_message = f"ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์คํจ: {response.status_code}" | |
try: error_message += f" - {response.json().get('error', response.text)}" | |
except Exception: error_message += f" - {response.text}" | |
logger.warning(error_message) | |
return jsonify({ | |
"success": False, | |
"error": error_message | |
}), 502 | |
except requests.exceptions.Timeout: | |
logger.error("ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์๊ฐ ์ด๊ณผ") | |
return jsonify({ | |
"success": False, | |
"error": "ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค." | |
}), 504 | |
except requests.exceptions.ConnectionError: | |
logger.error("์ฅ์น ๊ด๋ฆฌ ์๋ฒ ์ฐ๊ฒฐ ์คํจ") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ๊ด๋ฆฌ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์คํ ์ค์ธ์ง ํ์ธํด์ฃผ์ธ์." | |
}), 503 | |
except Exception as e: | |
logger.error(f"ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์ค ์ค๋ฅ ๋ฐ์: {e}", exc_info=True) | |
return jsonify({ | |
"success": False, | |
"error": f"ํ๋ก๊ทธ๋จ ๋ชฉ๋ก ์กฐํ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 | |
def execute_program(program_id): | |
"""ํ๋ก๊ทธ๋จ ์คํ API""" | |
logger.info(f"ํ๋ก๊ทธ๋จ ์คํ ์์ฒญ: {program_id}") | |
try: | |
current_device_url = get_device_url() | |
api_path = f"/api/programs/{program_id}/execute" | |
logger.info(f"ํ๋ก๊ทธ๋จ ์คํ ์์ฒญ: {current_device_url}{api_path}") | |
response = requests.post( | |
f"{current_device_url}{api_path}", | |
json={}, # ํ์์ ์ฌ๊ธฐ์ ํ๋ผ๋ฏธํฐ ์ถ๊ฐ ๊ฐ๋ฅ | |
timeout=10 # ํ๋ก๊ทธ๋จ ์คํ์๋ ๋ ๊ธด ์๊ฐ ๋ถ์ฌ | |
) | |
logger.debug(f"ํ๋ก๊ทธ๋จ ์คํ ์๋ต ์ํ ์ฝ๋: {response.status_code}") | |
if response.status_code == 200: | |
try: | |
data = response.json() | |
success = data.get("success", False) | |
message = data.get("message", "") | |
logger.info(f"ํ๋ก๊ทธ๋จ ์คํ ์๋ต: {success}, {message}") | |
return jsonify(data) # ์๋ฒ ์๋ต ๊ทธ๋๋ก ๋ฐํ | |
except requests.exceptions.JSONDecodeError: | |
logger.error("ํ๋ก๊ทธ๋จ ์คํ ์๋ต JSON ํ์ฑ ์คํจ") | |
# ์ฑ๊ณต(200)ํ์ง๋ง ์๋ต์ด ๋น์ ์์ ์ธ ๊ฒฝ์ฐ | |
return jsonify({ | |
"success": False, # ํ์ฑ ์คํจํ์ผ๋ฏ๋ก False๋ก ๊ฐ์ฃผ | |
"error": "ํ๋ก๊ทธ๋จ ์คํ ์๋ฒ๋ก๋ถํฐ ์ ํจํ์ง ์์ JSON ์๋ต" | |
}), 502 | |
else: | |
error_message = f"ํ๋ก๊ทธ๋จ ์คํ ์์ฒญ ์คํจ: {response.status_code}" | |
try: error_message += f" - {response.json().get('error', response.text)}" | |
except Exception: error_message += f" - {response.text}" | |
logger.warning(error_message) | |
return jsonify({ | |
"success": False, | |
"error": error_message | |
}), 502 # ๋๋ response.status_code ๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ ๊ฒ๋ ๊ณ ๋ ค | |
except requests.exceptions.Timeout: | |
logger.error("ํ๋ก๊ทธ๋จ ์คํ ์์ฒญ ์๊ฐ ์ด๊ณผ") | |
return jsonify({ | |
"success": False, | |
"error": "ํ๋ก๊ทธ๋จ ์คํ ์์ฒญ ์๊ฐ์ด ์ด๊ณผ๋์์ต๋๋ค." | |
}), 504 | |
except requests.exceptions.ConnectionError: | |
logger.error("์ฅ์น ๊ด๋ฆฌ ์๋ฒ ์ฐ๊ฒฐ ์คํจ") | |
return jsonify({ | |
"success": False, | |
"error": "์ฅ์น ๊ด๋ฆฌ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฒ๊ฐ ์คํ ์ค์ธ์ง ํ์ธํด์ฃผ์ธ์." | |
}), 503 | |
except Exception as e: | |
logger.error(f"ํ๋ก๊ทธ๋จ ์คํ ์ค ์ค๋ฅ ๋ฐ์: {e}", exc_info=True) | |
return jsonify({ | |
"success": False, | |
"error": f"ํ๋ก๊ทธ๋จ ์คํ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}" | |
}), 500 |