""" RAG 검색 챗봇 웹 애플리케이션 - 장치 관리 API 라우트 정의 """ import os import logging import requests import json from flask import request, jsonify # 로거 가져오기 logger = logging.getLogger(__name__) def register_device_routes(app, login_required, DEVICE_SERVER_URL): """Flask 애플리케이션에 장치 관리 관련 라우트 등록""" @app.route('/api/device/settings', methods=['GET']) @login_required def get_device_settings(): """장치 관리 서버 설정 API - 프론트엔드에서 사용""" logger.info("장치 관리 서버 설정 요청") return jsonify({ "server_url": DEVICE_SERVER_URL }) @app.route('/api/device/status', methods=['GET']) @login_required def device_status(): """장치 관리 서버 상태 확인 API""" logger.info("장치 관리 서버 상태 확인 요청") # 직접 접속 모드를 사용하는 경우 프록시 처리 if not DEVICE_SERVER_URL: logger.info("직접 접속 모드 사용 중 - 프론트엔드에서 처리") return jsonify({ "info": "직접 접속 모드 사용 중. 프론트엔드에서 장치 서버에 직접 연결합니다." }) try: # 장치 관리 서버 상태 확인 response = requests.get(f"{DEVICE_SERVER_URL}/api/status", timeout=5) if response.status_code == 200: data = response.json() logger.info(f"장치 관리 서버 상태: {data.get('status', 'unknown')}") return jsonify({ "success": True, "server_status": data.get("status", "unknown") }) else: logger.warning(f"장치 관리 서버 응답 코드: {response.status_code}") return jsonify({ "success": False, "error": f"장치 관리 서버가 비정상 응답 코드를 반환했습니다: {response.status_code}" }), 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}") return jsonify({ "success": False, "error": f"장치 관리 서버 상태 확인 중 오류 발생: {str(e)}" }), 500 @app.route('/api/device/list', methods=['GET']) @login_required def device_list(): """장치 목록 조회 API""" logger.info("장치 목록 조회 요청") try: # 장치 목록 조회 response = requests.get(f"{DEVICE_SERVER_URL}/api/devices", timeout=5) if response.status_code == 200: data = response.json() devices = data.get("devices", []) logger.info(f"장치 목록 조회 성공: {len(devices)}개 장치") return jsonify({ "success": True, "devices": devices }) else: logger.warning(f"장치 목록 조회 실패: {response.status_code}") return jsonify({ "success": False, "error": f"장치 목록 조회 실패: {response.status_code}" }), 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}") return jsonify({ "success": False, "error": f"장치 목록 조회 중 오류 발생: {str(e)}" }), 500 @app.route('/api/device/programs', methods=['GET']) @login_required def device_programs(): """실행 가능한 프로그램 목록 조회 API""" logger.info("프로그램 목록 조회 요청") try: # 프로그램 목록 조회 response = requests.get(f"{DEVICE_SERVER_URL}/api/programs", timeout=5) if response.status_code == 200: data = response.json() programs = data.get("programs", []) logger.info(f"프로그램 목록 조회 성공: {len(programs)}개 프로그램") return jsonify({ "success": True, "programs": programs }) else: logger.warning(f"프로그램 목록 조회 실패: {response.status_code}") return jsonify({ "success": False, "error": f"프로그램 목록 조회 실패: {response.status_code}" }), 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}") return jsonify({ "success": False, "error": f"프로그램 목록 조회 중 오류 발생: {str(e)}" }), 500 @app.route('/api/device/programs//execute', methods=['POST']) @login_required def execute_program(program_id): """프로그램 실행 API""" logger.info(f"프로그램 실행 요청: {program_id}") try: # 프로그램 실행 response = requests.post( f"{DEVICE_SERVER_URL}/api/programs/{program_id}/execute", json={}, timeout=10 # 프로그램 실행에는 더 긴 시간 부여 ) if response.status_code == 200: data = response.json() success = data.get("success", False) message = data.get("message", "") logger.info(f"프로그램 실행 응답: {success}, {message}") return jsonify(data) else: logger.warning(f"프로그램 실행 실패: {response.status_code}") return jsonify({ "success": False, "error": f"프로그램 실행 요청 실패: {response.status_code}" }), 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}") return jsonify({ "success": False, "error": f"프로그램 실행 중 오류 발생: {str(e)}" }), 500