from __future__ import annotations import os import sys import shutil import subprocess import logging from pathlib import Path from flask import Blueprint, request, redirect, url_for, flash, jsonify, send_file from flask_login import login_required from config import Config utils_bp = Blueprint("utils", __name__) def register_util_routes(app): app.register_blueprint(utils_bp) @utils_bp.route("/move_mac_files", methods=["POST"]) @login_required def move_mac_files(): src = Path(Config.IDRAC_INFO_FOLDER) dst = Path(Config.MAC_FOLDER) dst.mkdir(parents=True, exist_ok=True) moved = 0 errors = [] try: for file in src.iterdir(): if not file.is_file(): continue try: # 파일이 존재하는지 확인 if not file.exists(): errors.append(f"{file.name}: 파일이 존재하지 않음") continue # 대상 파일이 이미 존재하는 경우 건너뛰기 target = dst / file.name if target.exists(): logging.warning(f"⚠️ 파일이 이미 존재하여 건너뜀: {file.name}") continue shutil.move(str(file), str(target)) moved += 1 except Exception as e: error_msg = f"{file.name}: {str(e)}" errors.append(error_msg) logging.error(f"❌ 파일 이동 실패: {error_msg}") # 결과 로깅 if moved > 0: logging.info(f"✅ MAC 파일 이동 완료 ({moved}개)") if errors: logging.warning(f"⚠️ 일부 파일 이동 실패: {errors}") # 하나라도 성공하면 success: true 반환 return jsonify({ "success": True, "moved": moved, "errors": errors if errors else None }) except Exception as e: logging.error(f"❌ MAC 이동 중 치명적 오류: {e}") return jsonify({"success": False, "error": str(e)}) @utils_bp.route("/move_guid_files", methods=["POST"]) @login_required def move_guid_files(): src = Path(Config.IDRAC_INFO_FOLDER) dst = Path(Config.GUID_FOLDER) dst.mkdir(parents=True, exist_ok=True) moved = 0 errors = [] try: for file in src.iterdir(): if not file.is_file(): continue try: # 파일이 존재하는지 확인 if not file.exists(): errors.append(f"{file.name}: 파일이 존재하지 않음") continue # 대상 파일이 이미 존재하는 경우 건너뛰기 target = dst / file.name if target.exists(): logging.warning(f"⚠️ 파일이 이미 존재하여 건너뜀: {file.name}") continue shutil.move(str(file), str(target)) moved += 1 except Exception as e: error_msg = f"{file.name}: {str(e)}" errors.append(error_msg) logging.error(f"❌ 파일 이동 실패: {error_msg}") # 결과 메시지 if moved > 0: flash(f"GUID 파일이 성공적으로 이동되었습니다. ({moved}개)", "success") logging.info(f"✅ GUID 파일 이동 완료 ({moved}개)") if errors: logging.warning(f"⚠️ 일부 파일 이동 실패: {errors}") flash(f"일부 파일 이동 실패: {len(errors)}개", "warning") except Exception as e: logging.error(f"❌ GUID 이동 오류: {e}") flash(f"오류 발생: {e}", "danger") return redirect(url_for("main.index")) @utils_bp.route("/update_server_list", methods=["POST"]) @login_required def update_server_list(): content = request.form.get("server_list_content") if not content: flash("내용을 입력하세요.", "warning") return redirect(url_for("main.index")) path = Path(Config.SERVER_LIST_FOLDER) / "server_list.txt" try: path.write_text(content, encoding="utf-8") result = subprocess.run( [sys.executable, str(Path(Config.SERVER_LIST_FOLDER) / "excel.py")], capture_output=True, text=True, check=True, cwd=str(Path(Config.SERVER_LIST_FOLDER)), timeout=300, ) logging.info(f"서버 리스트 스크립트 실행 결과: {result.stdout}") flash("서버 리스트가 업데이트되었습니다.", "success") except subprocess.CalledProcessError as e: logging.error(f"서버 리스트 스크립트 오류: {e.stderr}") flash(f"스크립트 실행 실패: {e.stderr}", "danger") except Exception as e: logging.error(f"서버 리스트 처리 오류: {e}") flash(f"서버 리스트 처리 중 오류 발생: {e}", "danger") return redirect(url_for("main.index")) @utils_bp.route("/update_guid_list", methods=["POST"]) @login_required def update_guid_list(): content = request.form.get("server_list_content") if not content: flash("내용을 입력하세요.", "warning") return redirect(url_for("main.index")) path = Path(Config.SERVER_LIST_FOLDER) / "guid_list.txt" try: path.write_text(content, encoding="utf-8") result = subprocess.run( [sys.executable, str(Path(Config.SERVER_LIST_FOLDER) / "GUIDtxtT0Execl.py")], capture_output=True, text=True, check=True, cwd=str(Path(Config.SERVER_LIST_FOLDER)), timeout=300, ) logging.info(f"GUID 리스트 스크립트 실행 결과: {result.stdout}") flash("GUID 리스트가 업데이트되었습니다.", "success") except subprocess.CalledProcessError as e: logging.error(f"GUID 리스트 스크립트 오류: {e.stderr}") flash(f"스크립트 실행 실패: {e.stderr}", "danger") except Exception as e: logging.error(f"GUID 리스트 처리 오류: {e}") flash(f"GUID 리스트 처리 중 오류 발생: {e}", "danger") return redirect(url_for("main.index")) @utils_bp.route("/download_excel") @login_required def download_excel(): path = Path(Config.SERVER_LIST_FOLDER) / "mac_info.xlsx" if not path.is_file(): flash("엑셀 파일을 찾을 수 없습니다.", "danger") return redirect(url_for("main.index")) logging.info(f"엑셀 파일 다운로드: {path}") return send_file(str(path), as_attachment=True, download_name="mac_info.xlsx")