Infra/Cloud

[Azure] Backup Center 자동 확인 스크립트

jykim23 2023. 1. 11. 16:41

이 글을 읽을 사람은 없기에 이력 용도로 작성중입니다.

 

고객이 Azure Backup Center 사용하고 있습니다.

매일 백업이 잘되고 있는지 확인을 해야하는데 솔직히 귀찮습니다.

대충 로그인하고 클릭 클릭이면 1분정도면 끝나는 일이지만 자동으로 확인하는 기능이 있으면 좋겠다 하여 만들었습니다.

 

정확히는 백업 화면을 캡처하여 메일로 발송하는 스크립트 입니다.

백업 성공/실패 유무를 확인하여 처리하는 만능에 가까운 것이 아닙니다...

 

python의 selenium을 이용하였습니다. 가능하면 XPATH를 안쓰려했지만 하찮은 코딩 실력으론 못하겠습니다.

여기 저기 떠돌아 다니는 자료 짜깁기한거라 코드가 깨끗하지 못한점 양해 부탁드립니다.

 

윈도우 가상머신 생성하여 스캐쥴 걸어두고 쓰고있습니다.

실사용PC에 적용해보려 했으나 가상머신에 하는게 정신건강에 이롭습니다.

 

결과물

스크린샷만 찍는거라 특이한거 없음

 

runChromeDebug8989.bat 참고 링크

https://iamaman.tistory.com/3928

if not exist "C:\chromeprofileDebug" mkdir "C:\chromeprofileDebug"
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=8989 --user-data-dirs="C:\chromeprofileDebug"

 

메인 파일

# 크롬 설치 필요
# chrome://version -> Chrome	109.0.5414.75 (공식 빌드)
# https://chromedriver.chromium.org/downloads
# 109.0.5414.75 메이저 버전만 동일하게 크롬 드라이버 다운로드 및 아래 위치에 저장
# C:\python\chromedriver.exe


# 파이썬 설치 및 라이브러리 설치
# python 3.10
# pip install selenium
# pip install pyperclip

# 최초 설정 - 크롬으로 수동으로 로그인 필요


# selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
import os
import pyperclip # 클립보드 사용

# 메일
import smtplib
from email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
import datetime
dt_now = datetime.datetime.now()
today = dt_now.date()

# 로그인 세션 유지를 위한 크롬 프로필 저장 위치 생성
os.system("taskkill /IM chrome.exe /F")  # 열려 있는 chrome.exe 모두 종료
portNum = "8989"
os.startfile(f"C:/python/runChromeDebug{portNum}.bat")

# 크롬 설정 및 실행
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", f"localhost:{portNum}") # 로그인 세션 유지를 위한 크롬 프로필 지정
options.add_argument("--start-maximized")
options.add_argument("no-sandbox") 

chrome = webdriver.Chrome("C:\python\chromedriver.exe", options=options)
chrome.get("https://portal.azure.com/#view/Microsoft_Azure_DataProtection/BackupCenterMenuBlade/~/overview") # 백업 페이지 이동

wait = WebDriverWait(chrome, 10) # 최대로 기다리는 시간이 10초
long_wait = WebDriverWait(chrome, 300)
short_wait = WebDriverWait(chrome, 3) # 최대로 기다리는 시간이 3초

# 계정정보
az_passwd = "PASSWORD"
email_server = "mail.test.com"
email_id = "me@test.com"
email_pw = "PASSWORD"
email_to = "me@test.com, me2@test.com"



# OTP 인증은 수동으로 해야함...
def login():
    # 첫 번째 계정 클릭
    wait.until(EC.visibility_of_element_located((By.XPATH, '/html/body/div/form[1]/div/div/div[2]/div[1]/div/div/div/div[2]/div/div[3]/div/div/div/div[2]/div/div/div[1]/div/div[1]/div/div[2]/div'))).click()
    
    # 패스워드 입력
    input_pw = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[name^=passwd")))
    pyperclip.copy(az_passwd)
    input_pw.send_keys(Keys.CONTROL, "v")
    input_pw.send_keys("\n")

    # OTP인증 후 로그인 상태를 유지하시겠습니까?
    long_wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[id=KmsiCheckboxField"))).click()
    short_wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[id=idSIButton9"))).click()

def capture():
    # 백업센터 접속 및 화면 캡처
    chrome.get("https://portal.azure.com/#view/Microsoft_Azure_DataProtection/BackupCenterMenuBlade/~/overview")
    time.sleep(15) # 로딩 대기
    screenshot = ("C:/python/screenshot/"+str(today)+".png")
    chrome.save_screenshot(screenshot)

    # 크롬 종료
    chrome.quit() 

    # 메일 작성
    msg = MIMEMultipart()
    msg['From'] = email_id
    msg['To'] = email_to
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = Header(s=('Azure Backup Check '+ str(today)) , charset='utf-8')
    body = MIMEText('첨부된 파일 1개를 확인해 주세요.', _charset='utf-8')
    msg.attach(body)
    # 첨부파일
    files = list()
    files.append(screenshot)
    for f in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload(open(f, "rb").read())
        encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
        msg.attach(part)
    # 메일 발송
    mailServer = smtplib.SMTP_SSL(email_server)
    mailServer.login(email_id, email_pw)
    mailServer.send_message(msg)
    mailServer.quit()


# 실행
try:
    login()
finally:
    capture()