59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import requests
|
|
from xml.etree import ElementTree as ET
|
|
from backend.models.firmware_version import FirmwareVersion, db
|
|
|
|
def sync_dell_catalog(model="PowerEdge R750"):
|
|
"""
|
|
Dell 공식 Catalog.xml에서 지정된 모델(model)에 해당하는 펌웨어 정보만 추출 후 DB 저장.
|
|
"""
|
|
url = "https://downloads.dell.com/catalog/Catalog.xml"
|
|
print(f"[INFO] Dell Catalog 다운로드 중... ({url})")
|
|
response = requests.get(url, timeout=60)
|
|
response.raise_for_status()
|
|
|
|
root = ET.fromstring(response.content)
|
|
count = 0
|
|
|
|
for pkg in root.findall(".//SoftwareComponent"):
|
|
# 이 컴포넌트가 지정된 모델에 해당하는지 확인
|
|
supported = [
|
|
sys.text.strip()
|
|
for sys in pkg.findall(".//SupportedSystems/Brand/Model/Display")
|
|
if sys.text
|
|
]
|
|
if model not in supported:
|
|
continue
|
|
|
|
name = pkg.findtext("Name")
|
|
version = pkg.findtext("Version")
|
|
release_date = pkg.findtext("ReleaseDate")
|
|
path = pkg.findtext("path")
|
|
vendor = "Dell"
|
|
|
|
if not name or not version:
|
|
continue
|
|
|
|
# 중복 방지
|
|
existing = FirmwareVersion.query.filter_by(
|
|
component_name=name,
|
|
latest_version=version,
|
|
server_model=model
|
|
).first()
|
|
|
|
if not existing:
|
|
db.session.add(
|
|
FirmwareVersion(
|
|
component_name=name,
|
|
latest_version=version,
|
|
release_date=release_date,
|
|
vendor=vendor,
|
|
server_model=model,
|
|
download_url=f"https://downloads.dell.com/{path}",
|
|
)
|
|
)
|
|
count += 1
|
|
|
|
db.session.commit()
|
|
print(f"✓ {model} 관련 펌웨어 {count}개 동기화 완료")
|
|
return count
|