import smtplib
import subprocess
from email.mime.text import MIMEText

# ==========================================
# [설정 구간] 아래 내용을 본인 환경에 맞게 수정하세요
# ==========================================
SERVICE_NAME = "MySQL"     # 메일 제목에 표시될 이름
GMAIL_USER = "qkrltjd@gmail.com"
GMAIL_APP_PW = "krejefikaubjorgr"  # 띄어쓰기 없이 입력
TO_EMAIL = "qkrltjd@gmail.com"

# DB 접속 정보 (Ping 테스트용)
DB_USER = "admin"           # DB 접속 계정 (보통 root)
DB_PASSWORD = "Seigakushakorea0308(!" # 실제 DB 비밀번호
# ==========================================

def is_db_healthy():
    """
    mysqladmin ping 명령어를 사용하여 DB가 실제로 응답하는지 확인
    반환값: True(정상), False(비정상/멈춤)
    """
    try:
        # mysqladmin -u[유저] -p[비번] ping 명령어 실행
        # 로그에 비번이 남지 않도록 주의 (이 스크립트 파일 권한을 600으로 설정 권장)
        command = [
            "mysqladmin",
            f"-u{DB_USER}",
            f"-p{DB_PASSWORD}",
            "ping"
        ]

        # 명령어 실행 (성공하면 0 반환, 실패하면 에러 발생)
        # stdout, stderr는 화면에 출력되지 않게 숨김
        subprocess.check_call(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        return True

    except subprocess.CalledProcessError:
        # Ping 실패 (DB가 꺼졌거나, 비번이 틀렸거나, 응답 불가 상태)
        return False
    except FileNotFoundError:
        print("❌ 에러: mysqladmin 명령어를 찾을 수 없습니다. (MySQL이 설치되어 있나요?)")
        return False
    except Exception as e:
        print(f"❌ 알 수 없는 에러: {e}")
        return False

def send_email():
    """DB 장애 발생 시 메일 발송"""
    subject = f"🚨 [긴급] {SERVICE_NAME} DB 응답 없음!"
    body = f"""
    경고: {SERVICE_NAME} 데이터베이스가 응답하지 않습니다.

    1. 프로세스가 다운되었거나
    2. 접속 과부하(Deadlock) 상태일 수 있습니다.

    서버에 접속하여 즉시 확인해주세요.
    """

    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = GMAIL_USER
    msg['To'] = TO_EMAIL

    try:
        with smtplib.SMTP("smtp.gmail.com", 587) as server:
            server.starttls()
            server.login(GMAIL_USER, GMAIL_APP_PW)
            server.send_message(msg)
        print("📧 경고 메일 전송 완료.")
    except Exception as e:
        print(f"❌ 메일 전송 실패: {e}")

# === 메인 실행 로직 ===
if __name__ == "__main__":
    if is_db_healthy():
        print(f"✅ {SERVICE_NAME} 상태 정상 (Ping 성공)")
    else:
        print(f"🔥 {SERVICE_NAME} 장애 감지! 메일을 발송합니다...")
        send_email()
