import os
import subprocess
import time
import logging
from dotenv import load_dotenv
from concurrent.futures import ThreadPoolExecutor

# .env 파일 로드
load_dotenv()

# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 사용자 이름 및 비밀번호 설정
IDRAC_USER = os.getenv("IDRAC_USER")
IDRAC_PASS = os.getenv("IDRAC_PASS")

# IP 파일 유효성 검사 함수
def validate_ip_file(ip_file_path):
    if not os.path.isfile(ip_file_path):
        raise FileNotFoundError(f"IP 파일 '{ip_file_path}' 이(가) 존재하지 않습니다.")
    return ip_file_path

# 정보 저장 디렉터리 설정
OUTPUT_DIR = "idrac_info"
os.makedirs(OUTPUT_DIR, exist_ok=True)

# iDRAC 정보를 가져오는 함수
def fetch_idrac_info(idrac_ip):
    try:
        logger.info(f"{idrac_ip}에 대한 샷시 정보 가져오는 중...")
        getsysinfo_command = [
            "racadm", "-r", idrac_ip,
            "-u", IDRAC_USER,
            "-p", IDRAC_PASS,
            "getsysinfo"
        ]
        getsysinfo_result = subprocess.run(getsysinfo_command, capture_output=True, text=True)
        getsysinfo = getsysinfo_result.stdout

        svc_tag = ""
        for line in getsysinfo.splitlines():
            if "SVC Tag" in line:
                svc_tag = line.split('=')[1].strip()
                break

        if not svc_tag:
            logger.error(f"IP: {idrac_ip}에 대한 SVC Tag 가져오기 실패")
            return

        logger.info(f"{idrac_ip}에 대한 서버 Log 가져오는 중...")
        viewerlog_command = [
            "racadm", "-r", idrac_ip,
            "-u", IDRAC_USER,
            "-p", IDRAC_PASS,
            "getsel"
        ]
        viewerlog_result = subprocess.run(viewerlog_command, capture_output=True, text=True)
        viewerlog = viewerlog_result.stdout

        output_file = os.path.join(OUTPUT_DIR, f"{svc_tag}.txt")
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(f"Dell Server Log Viewer (SVC Tag: {svc_tag})\n\n")
            f.write("------------------------------------------Log Viewer------------------------------------------\n")
            f.write(f"1. SVC Tag : {svc_tag}\n")
            f.write(f"{viewerlog}\n")

        logger.info(f"{idrac_ip}에 대한 로그 정보가 {output_file}에 저장되었습니다.")
    except Exception as e:
        logger.error(f"설정 중 오류 발생: {e}")

# 소요 시간 계산 함수
def calculate_elapsed_time(start_time):
    elapsed_time = time.time() - start_time
    hours, remainder = divmod(elapsed_time, 3600)
    minutes, seconds = divmod(remainder, 60)
    logger.info(f"전체 작업 소요 시간: {int(hours)} 시간, {int(minutes)} 분, {int(seconds)} 초.")

# 메인 함수
if __name__ == "__main__":
    import sys
    
    if len(sys.argv) != 2:
        logger.error(f"Usage: {sys.argv[0]} <ip_file>")
        sys.exit(1)
    
    ip_file_path = validate_ip_file(sys.argv[1])

    with open(ip_file_path, 'r') as ip_file:
        ip_addresses = [line.strip() for line in ip_file if line.strip()]

    start_time = time.time()
    
    # 병렬 처리를 위해 ThreadPoolExecutor 사용
    max_workers = 100  # 병렬 작업 수 설정
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        executor.map(fetch_idrac_info, ip_addresses)
    
    calculate_elapsed_time(start_time)
