""" 펌웨어 버전 관리 모델 backend/models/firmware_version.py """ from backend.models.user import db from datetime import datetime from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text class FirmwareVersion(db.Model): """펌웨어 최신 버전 정보 모델""" __tablename__ = 'firmware_versions' id = Column(Integer, primary_key=True) # 컴포넌트 정보 component_name = Column(String(100), nullable=False) # BIOS, iDRAC, PERC 등 component_type = Column(String(50)) # Firmware, Driver 등 vendor = Column(String(50)) # Dell, Intel, Broadcom 등 # 서버 모델 (선택적) server_model = Column(String(100)) # PowerEdge R750, R640 등 (비어있으면 모든 모델) # 버전 정보 latest_version = Column(String(50), nullable=False) # 최신 버전 release_date = Column(String(20)) # 릴리즈 날짜 # 다운로드 정보 download_url = Column(String(500)) # DUP 파일 다운로드 URL file_name = Column(String(200)) # DUP 파일명 file_size_mb = Column(Integer) # 파일 크기 (MB) # 메타 정보 notes = Column(Text) # 비고 (버전 변경 사항 등) is_critical = Column(Boolean, default=False) # 중요 업데이트 여부 is_active = Column(Boolean, default=True) # 활성화 여부 created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) def to_dict(self): """딕셔너리로 변환""" return { 'id': self.id, 'component_name': self.component_name, 'component_type': self.component_type, 'vendor': self.vendor, 'server_model': self.server_model, 'latest_version': self.latest_version, 'release_date': self.release_date, 'download_url': self.download_url, 'file_name': self.file_name, 'file_size_mb': self.file_size_mb, 'notes': self.notes, 'is_critical': self.is_critical, 'is_active': self.is_active, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None } def __repr__(self): return f'' class FirmwareComparisonResult: """펌웨어 버전 비교 결과""" def __init__(self, component_name, current_version, latest_version=None): self.component_name = component_name self.current_version = current_version self.latest_version = latest_version self.status = self._compare_versions() self.recommendation = self._get_recommendation() def _compare_versions(self): """버전 비교""" if not self.latest_version: return 'unknown' # 최신 버전 정보 없음 if self.current_version == self.latest_version: return 'latest' # 최신 # 버전 비교 (단순 문자열 비교보다 정교하게) if self._is_older(self.current_version, self.latest_version): return 'outdated' # 업데이트 필요 else: return 'unknown' # 판단 불가 def _is_older(self, current, latest): """ 버전 비교 (간단한 버전 비교) 예: 2.10.0 < 2.15.0 """ try: # 버전 문자열을 숫자 리스트로 변환 current_parts = [int(x) for x in current.replace('-', '.').split('.') if x.isdigit()] latest_parts = [int(x) for x in latest.replace('-', '.').split('.') if x.isdigit()] # 길이 맞추기 max_len = max(len(current_parts), len(latest_parts)) current_parts += [0] * (max_len - len(current_parts)) latest_parts += [0] * (max_len - len(latest_parts)) # 비교 for c, l in zip(current_parts, latest_parts): if c < l: return True elif c > l: return False return False # 같음 except: # 비교 실패 시 문자열 비교 return current < latest def _get_recommendation(self): """권장 사항""" if self.status == 'outdated': return f'업데이트 권장: {self.current_version} → {self.latest_version}' elif self.status == 'latest': return '최신 버전' else: return '버전 정보 확인 필요' def to_dict(self): return { 'component_name': self.component_name, 'current_version': self.current_version, 'latest_version': self.latest_version, 'status': self.status, 'recommendation': self.recommendation }