update
This commit is contained in:
BIN
backend/models/__pycache__/firmware_version.cpython-311.pyc
Normal file
BIN
backend/models/__pycache__/firmware_version.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/models/__pycache__/firmware_version.cpython-312.pyc
Normal file
BIN
backend/models/__pycache__/firmware_version.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/models/__pycache__/idrac_server.cpython-311.pyc
Normal file
BIN
backend/models/__pycache__/idrac_server.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/models/__pycache__/idrac_server.cpython-312.pyc
Normal file
BIN
backend/models/__pycache__/idrac_server.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/models/__pycache__/idrac_server.cpython-313.pyc
Normal file
BIN
backend/models/__pycache__/idrac_server.cpython-313.pyc
Normal file
Binary file not shown.
BIN
backend/models/__pycache__/user.cpython-311.pyc
Normal file
BIN
backend/models/__pycache__/user.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/models/__pycache__/user.cpython-312.pyc
Normal file
BIN
backend/models/__pycache__/user.cpython-312.pyc
Normal file
Binary file not shown.
134
backend/models/firmware_version.py
Normal file
134
backend/models/firmware_version.py
Normal file
@@ -0,0 +1,134 @@
|
||||
"""
|
||||
펌웨어 버전 관리 모델
|
||||
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'<FirmwareVersion {self.component_name} {self.latest_version}>'
|
||||
|
||||
|
||||
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
|
||||
}
|
||||
62
backend/models/idrac_server.py
Normal file
62
backend/models/idrac_server.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""
|
||||
Dell iDRAC 서버 관리 모델
|
||||
backend/models/idrac_server.py
|
||||
"""
|
||||
|
||||
from backend.models.user import db
|
||||
from datetime import datetime
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Boolean
|
||||
|
||||
|
||||
class IdracServer(db.Model):
|
||||
"""iDRAC 서버 정보 모델"""
|
||||
__tablename__ = 'idrac_servers'
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
name = Column(String(100), nullable=False) # 서버명
|
||||
ip_address = Column(String(50), nullable=False, unique=True) # iDRAC IP
|
||||
username = Column(String(50), default='root') # iDRAC 사용자명
|
||||
password = Column(String(200), nullable=False) # 비밀번호 (암호화 권장)
|
||||
|
||||
# 분류 정보
|
||||
group_name = Column(String(100)) # 그룹명 (고객사, 프로젝트명)
|
||||
location = Column(String(100)) # 위치
|
||||
model = Column(String(100)) # 서버 모델
|
||||
|
||||
# 상태 정보
|
||||
status = Column(String(20), default='registered') # registered, online, offline, updating
|
||||
last_connected = Column(DateTime) # 마지막 연결 시간
|
||||
last_updated = Column(DateTime) # 마지막 업데이트 시간
|
||||
|
||||
# 펌웨어 정보
|
||||
current_bios = Column(String(50)) # 현재 BIOS 버전
|
||||
target_bios = Column(String(50)) # 목표 BIOS 버전
|
||||
|
||||
# 메타 정보
|
||||
notes = Column(String(500)) # 비고
|
||||
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,
|
||||
'name': self.name,
|
||||
'ip_address': self.ip_address,
|
||||
'username': self.username,
|
||||
'group_name': self.group_name,
|
||||
'location': self.location,
|
||||
'model': self.model,
|
||||
'status': self.status,
|
||||
'last_connected': self.last_connected.isoformat() if self.last_connected else None,
|
||||
'last_updated': self.last_updated.isoformat() if self.last_updated else None,
|
||||
'current_bios': self.current_bios,
|
||||
'target_bios': self.target_bios,
|
||||
'notes': self.notes,
|
||||
'is_active': self.is_active,
|
||||
'created_at': self.created_at.isoformat() if self.created_at else None
|
||||
}
|
||||
|
||||
def __repr__(self):
|
||||
return f'<IdracServer {self.name} ({self.ip_address})>'
|
||||
Reference in New Issue
Block a user