update
This commit is contained in:
6
.env
6
.env
@@ -19,4 +19,8 @@ SOCKETIO_ASYNC_MODE=threading
|
||||
|
||||
# Telegram (민감정보, 필수 시에만 설정)
|
||||
TELEGRAM_BOT_TOKEN=6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo
|
||||
TELEGRAM_CHAT_ID=298120612
|
||||
TELEGRAM_CHAT_ID=298120612
|
||||
|
||||
# iDRAC 기본 연결 정보 (추가!)
|
||||
IDRAC_DEFAULT_USERNAME=root
|
||||
IDRAC_DEFAULT_PASSWORD=calvin
|
||||
BIN
__pycache__/config.cpython-312.pyc
Normal file
BIN
__pycache__/config.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/forms/__pycache__/auth_forms.cpython-311.pyc
Normal file
BIN
backend/forms/__pycache__/auth_forms.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/forms/__pycache__/auth_forms.cpython-312.pyc
Normal file
BIN
backend/forms/__pycache__/auth_forms.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
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})>'
|
||||
@@ -8,6 +8,8 @@ from .xml import register_xml_routes
|
||||
from .utilities import register_util_routes
|
||||
from .file_view import register_file_view
|
||||
from .jobs import register_jobs_routes
|
||||
from .idrac_routes import register_idrac_routes
|
||||
from .catalog_sync import catalog_bp
|
||||
|
||||
def register_routes(app: Flask, socketio=None) -> None:
|
||||
"""블루프린트 일괄 등록. socketio는 main 라우트에서만 사용."""
|
||||
@@ -18,4 +20,6 @@ def register_routes(app: Flask, socketio=None) -> None:
|
||||
register_xml_routes(app)
|
||||
register_util_routes(app)
|
||||
register_file_view(app)
|
||||
register_jobs_routes(app)
|
||||
register_jobs_routes(app)
|
||||
register_idrac_routes(app)
|
||||
app.register_blueprint(catalog_bp)
|
||||
|
||||
BIN
backend/routes/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/admin.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/admin.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/admin.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/admin.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/auth.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/auth.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/auth.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/auth.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/catalog_sync.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/catalog_sync.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/catalog_sync.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/catalog_sync.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/file_view.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/file_view.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/file_view.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/file_view.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/home.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/home.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/home.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/home.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/idrac_routes.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/idrac_routes.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/idrac_routes.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/idrac_routes.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/idrac_routes.cpython-313.pyc
Normal file
BIN
backend/routes/__pycache__/idrac_routes.cpython-313.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/jobs.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/jobs.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/jobs.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/jobs.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/jobs.cpython-313.pyc
Normal file
BIN
backend/routes/__pycache__/jobs.cpython-313.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/main.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/main.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/main.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/main.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/utilities.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/utilities.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/utilities.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/utilities.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
backend/routes/__pycache__/xml.cpython-311.pyc
Normal file
BIN
backend/routes/__pycache__/xml.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/routes/__pycache__/xml.cpython-312.pyc
Normal file
BIN
backend/routes/__pycache__/xml.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
23
backend/routes/catalog_sync.py
Normal file
23
backend/routes/catalog_sync.py
Normal file
@@ -0,0 +1,23 @@
|
||||
# backend/routes/catalog_sync.py
|
||||
from flask import Blueprint, jsonify, request
|
||||
from backend.services.dell_catalog_sync import sync_dell_catalog
|
||||
|
||||
catalog_bp = Blueprint("catalog", __name__, url_prefix="/catalog")
|
||||
|
||||
@catalog_bp.route("/sync", methods=["POST"])
|
||||
def sync_catalog():
|
||||
"""Dell Catalog 버전 정보를 동기화 (CSRF 보호 유지)"""
|
||||
try:
|
||||
data = request.get_json(silent=True) or {}
|
||||
model = data.get("model", "PowerEdge R750")
|
||||
|
||||
sync_dell_catalog(model)
|
||||
return jsonify({
|
||||
"success": True,
|
||||
"message": f"{model} 동기화 완료"
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
"success": False,
|
||||
"message": f"오류: {str(e)}"
|
||||
})
|
||||
1094
backend/routes/idrac_routes.py
Normal file
1094
backend/routes/idrac_routes.py
Normal file
File diff suppressed because it is too large
Load Diff
669
backend/routes/idrac_routes_base.py
Normal file
669
backend/routes/idrac_routes_base.py
Normal file
@@ -0,0 +1,669 @@
|
||||
"""
|
||||
Dell iDRAC 멀티 서버 펌웨어 관리 라우트
|
||||
backend/routes/idrac_routes.py
|
||||
- CSRF 보호 제외 추가
|
||||
"""
|
||||
|
||||
from flask import Blueprint, render_template, request, jsonify, current_app
|
||||
from werkzeug.utils import secure_filename
|
||||
import os
|
||||
from datetime import datetime
|
||||
from backend.services.idrac_redfish_client import DellRedfishClient
|
||||
from backend.models.idrac_server import IdracServer, db
|
||||
from flask_socketio import emit
|
||||
import threading
|
||||
|
||||
# Blueprint 생성
|
||||
idrac_bp = Blueprint('idrac', __name__, url_prefix='/idrac')
|
||||
|
||||
# 설정
|
||||
UPLOAD_FOLDER = 'uploads/firmware'
|
||||
ALLOWED_EXTENSIONS = {'exe', 'bin'}
|
||||
MAX_FILE_SIZE = 500 * 1024 * 1024 # 500MB
|
||||
|
||||
def allowed_file(filename):
|
||||
"""허용된 파일 형식 확인"""
|
||||
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
||||
|
||||
# ========================================
|
||||
# 메인 페이지
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/')
|
||||
def index():
|
||||
"""iDRAC 멀티 서버 관리 메인 페이지"""
|
||||
return render_template('idrac_firmware.html')
|
||||
|
||||
# ========================================
|
||||
# 서버 관리 API
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/api/servers', methods=['GET'])
|
||||
def get_servers():
|
||||
"""등록된 서버 목록 조회"""
|
||||
try:
|
||||
group = request.args.get('group') # 그룹 필터
|
||||
|
||||
query = IdracServer.query.filter_by(is_active=True)
|
||||
if group and group != 'all':
|
||||
query = query.filter_by(group_name=group)
|
||||
|
||||
servers = query.order_by(IdracServer.name).all()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'servers': [s.to_dict() for s in servers]
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers', methods=['POST'])
|
||||
def add_server():
|
||||
"""서버 추가"""
|
||||
try:
|
||||
data = request.json
|
||||
|
||||
# 필수 필드 확인
|
||||
if not all([data.get('name'), data.get('ip_address'), data.get('password')]):
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '필수 필드를 모두 입력하세요 (서버명, IP, 비밀번호)'
|
||||
})
|
||||
|
||||
# 중복 IP 확인
|
||||
existing = IdracServer.query.filter_by(ip_address=data['ip_address']).first()
|
||||
if existing:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'이미 등록된 IP입니다: {data["ip_address"]}'
|
||||
})
|
||||
|
||||
# 서버 생성
|
||||
server = IdracServer(
|
||||
name=data['name'],
|
||||
ip_address=data['ip_address'],
|
||||
username=data.get('username', 'root'),
|
||||
password=data['password'],
|
||||
group_name=data.get('group_name'),
|
||||
location=data.get('location'),
|
||||
model=data.get('model'),
|
||||
notes=data.get('notes')
|
||||
)
|
||||
|
||||
db.session.add(server)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'서버 {server.name} 추가 완료',
|
||||
'server': server.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers/<int:server_id>', methods=['PUT'])
|
||||
def update_server(server_id):
|
||||
"""서버 정보 수정"""
|
||||
try:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
data = request.json
|
||||
|
||||
# 업데이트
|
||||
if 'name' in data:
|
||||
server.name = data['name']
|
||||
if 'ip_address' in data:
|
||||
server.ip_address = data['ip_address']
|
||||
if 'username' in data:
|
||||
server.username = data['username']
|
||||
if 'password' in data:
|
||||
server.password = data['password']
|
||||
if 'group_name' in data:
|
||||
server.group_name = data['group_name']
|
||||
if 'location' in data:
|
||||
server.location = data['location']
|
||||
if 'model' in data:
|
||||
server.model = data['model']
|
||||
if 'notes' in data:
|
||||
server.notes = data['notes']
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '서버 정보 수정 완료',
|
||||
'server': server.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers/<int:server_id>', methods=['DELETE'])
|
||||
def delete_server(server_id):
|
||||
"""서버 삭제 (소프트 삭제)"""
|
||||
try:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
server.is_active = False
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'서버 {server.name} 삭제 완료'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/groups', methods=['GET'])
|
||||
def get_groups():
|
||||
"""등록된 그룹 목록"""
|
||||
try:
|
||||
groups = db.session.query(IdracServer.group_name)\
|
||||
.filter(IdracServer.is_active == True)\
|
||||
.filter(IdracServer.group_name.isnot(None))\
|
||||
.distinct()\
|
||||
.all()
|
||||
|
||||
group_list = [g[0] for g in groups if g[0]]
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'groups': group_list
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
# ========================================
|
||||
# 연결 및 상태 확인 API
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/api/servers/<int:server_id>/test', methods=['POST'])
|
||||
def test_connection(server_id):
|
||||
"""단일 서버 연결 테스트"""
|
||||
try:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
|
||||
if client.check_connection():
|
||||
server.status = 'online'
|
||||
server.last_connected = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'{server.name} 연결 성공'
|
||||
})
|
||||
else:
|
||||
server.status = 'offline'
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'{server.name} 연결 실패'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers/test-multi', methods=['POST'])
|
||||
def test_connections_multi():
|
||||
"""다중 서버 일괄 연결 테스트"""
|
||||
try:
|
||||
data = request.json
|
||||
server_ids = data.get('server_ids', [])
|
||||
|
||||
if not server_ids:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 선택하세요'
|
||||
})
|
||||
|
||||
results = []
|
||||
|
||||
for server_id in server_ids:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
continue
|
||||
|
||||
try:
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
|
||||
if client.check_connection():
|
||||
server.status = 'online'
|
||||
server.last_connected = datetime.utcnow()
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': True,
|
||||
'message': '연결 성공'
|
||||
})
|
||||
else:
|
||||
server.status = 'offline'
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': False,
|
||||
'message': '연결 실패'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
server.status = 'offline'
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': False,
|
||||
'message': str(e)
|
||||
})
|
||||
|
||||
db.session.commit()
|
||||
|
||||
success_count = sum(1 for r in results if r['success'])
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'results': results,
|
||||
'summary': {
|
||||
'total': len(results),
|
||||
'success': success_count,
|
||||
'failed': len(results) - success_count
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers/<int:server_id>/firmware', methods=['GET'])
|
||||
def get_server_firmware(server_id):
|
||||
"""단일 서버 펌웨어 버전 조회"""
|
||||
try:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
inventory = client.get_firmware_inventory()
|
||||
|
||||
# BIOS 버전 업데이트
|
||||
for item in inventory:
|
||||
if 'BIOS' in item.get('Name', ''):
|
||||
server.current_bios = item.get('Version')
|
||||
break
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': inventory
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
# ========================================
|
||||
# 멀티 서버 펌웨어 업로드 API
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/api/upload-multi', methods=['POST'])
|
||||
def upload_multi():
|
||||
"""다중 서버에 펌웨어 일괄 업로드"""
|
||||
try:
|
||||
if 'file' not in request.files:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '파일이 없습니다'
|
||||
})
|
||||
|
||||
file = request.files['file']
|
||||
server_ids_str = request.form.get('server_ids')
|
||||
|
||||
if not server_ids_str:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 선택하세요'
|
||||
})
|
||||
|
||||
server_ids = [int(x) for x in server_ids_str.split(',')]
|
||||
|
||||
if file.filename == '':
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '파일이 선택되지 않았습니다'
|
||||
})
|
||||
|
||||
if not allowed_file(file.filename):
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '허용되지 않은 파일 형식입니다 (.exe, .bin만 가능)'
|
||||
})
|
||||
|
||||
# 로컬에 임시 저장
|
||||
filename = secure_filename(file.filename)
|
||||
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
|
||||
local_path = os.path.join(UPLOAD_FOLDER, filename)
|
||||
file.save(local_path)
|
||||
|
||||
# 백그라운드 스레드로 업로드 시작
|
||||
from backend.services import watchdog_handler
|
||||
socketio = watchdog_handler.socketio
|
||||
|
||||
def upload_to_servers():
|
||||
results = []
|
||||
|
||||
for idx, server_id in enumerate(server_ids):
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
continue
|
||||
|
||||
try:
|
||||
# 진행 상황 전송
|
||||
if socketio:
|
||||
socketio.emit('upload_progress', {
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'status': 'uploading',
|
||||
'progress': 0,
|
||||
'message': '업로드 시작...'
|
||||
})
|
||||
|
||||
server.status = 'updating'
|
||||
db.session.commit()
|
||||
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
result = client.upload_firmware_staged(local_path)
|
||||
|
||||
if result['success']:
|
||||
server.status = 'online'
|
||||
server.last_updated = datetime.utcnow()
|
||||
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': True,
|
||||
'job_id': result['job_id'],
|
||||
'message': '업로드 완료'
|
||||
})
|
||||
|
||||
if socketio:
|
||||
socketio.emit('upload_progress', {
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'status': 'completed',
|
||||
'progress': 100,
|
||||
'message': '업로드 완료',
|
||||
'job_id': result['job_id']
|
||||
})
|
||||
else:
|
||||
server.status = 'online'
|
||||
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': False,
|
||||
'message': result.get('message', '업로드 실패')
|
||||
})
|
||||
|
||||
if socketio:
|
||||
socketio.emit('upload_progress', {
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'status': 'failed',
|
||||
'progress': 0,
|
||||
'message': result.get('message', '업로드 실패')
|
||||
})
|
||||
|
||||
db.session.commit()
|
||||
|
||||
except Exception as e:
|
||||
server.status = 'online'
|
||||
db.session.commit()
|
||||
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': False,
|
||||
'message': str(e)
|
||||
})
|
||||
|
||||
if socketio:
|
||||
socketio.emit('upload_progress', {
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'status': 'failed',
|
||||
'progress': 0,
|
||||
'message': str(e)
|
||||
})
|
||||
|
||||
# 최종 결과 전송
|
||||
if socketio:
|
||||
success_count = sum(1 for r in results if r['success'])
|
||||
socketio.emit('upload_complete', {
|
||||
'results': results,
|
||||
'summary': {
|
||||
'total': len(results),
|
||||
'success': success_count,
|
||||
'failed': len(results) - success_count
|
||||
}
|
||||
})
|
||||
|
||||
# 스레드 시작
|
||||
thread = threading.Thread(target=upload_to_servers)
|
||||
thread.daemon = True
|
||||
thread.start()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'{len(server_ids)}대 서버에 업로드 시작',
|
||||
'filename': filename
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'업로드 오류: {str(e)}'
|
||||
})
|
||||
|
||||
# ========================================
|
||||
# 기존 단일 서버 API (호환성 유지)
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/api/files/local', methods=['GET'])
|
||||
def list_local_files():
|
||||
"""로컬에 저장된 DUP 파일 목록"""
|
||||
try:
|
||||
files = []
|
||||
|
||||
if os.path.exists(UPLOAD_FOLDER):
|
||||
for filename in os.listdir(UPLOAD_FOLDER):
|
||||
filepath = os.path.join(UPLOAD_FOLDER, filename)
|
||||
if os.path.isfile(filepath):
|
||||
file_size = os.path.getsize(filepath)
|
||||
files.append({
|
||||
'name': filename,
|
||||
'size': file_size,
|
||||
'size_mb': round(file_size / (1024 * 1024), 2),
|
||||
'uploaded_at': datetime.fromtimestamp(
|
||||
os.path.getmtime(filepath)
|
||||
).strftime('%Y-%m-%d %H:%M:%S')
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'files': files
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/files/local/<filename>', methods=['DELETE'])
|
||||
def delete_local_file(filename):
|
||||
"""로컬 DUP 파일 삭제"""
|
||||
try:
|
||||
filepath = os.path.join(UPLOAD_FOLDER, secure_filename(filename))
|
||||
|
||||
if os.path.exists(filepath):
|
||||
os.remove(filepath)
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'{filename} 삭제 완료'
|
||||
})
|
||||
else:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '파일을 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'삭제 오류: {str(e)}'
|
||||
})
|
||||
|
||||
# ========================================
|
||||
# 서버 재부팅 API (멀티)
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/api/servers/reboot-multi', methods=['POST'])
|
||||
def reboot_servers_multi():
|
||||
"""선택한 서버들 일괄 재부팅"""
|
||||
try:
|
||||
data = request.json
|
||||
server_ids = data.get('server_ids', [])
|
||||
reboot_type = data.get('type', 'GracefulRestart')
|
||||
|
||||
if not server_ids:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 선택하세요'
|
||||
})
|
||||
|
||||
results = []
|
||||
|
||||
for server_id in server_ids:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
continue
|
||||
|
||||
try:
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
result = client.reboot_server(reboot_type)
|
||||
|
||||
if result:
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': True,
|
||||
'message': '재부팅 시작'
|
||||
})
|
||||
else:
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': False,
|
||||
'message': '재부팅 실패'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'success': False,
|
||||
'message': str(e)
|
||||
})
|
||||
|
||||
success_count = sum(1 for r in results if r['success'])
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'results': results,
|
||||
'summary': {
|
||||
'total': len(results),
|
||||
'success': success_count,
|
||||
'failed': len(results) - success_count
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
|
||||
# Blueprint 등록 함수
|
||||
def register_idrac_routes(app):
|
||||
"""
|
||||
iDRAC 멀티 서버 관리 Blueprint 등록
|
||||
|
||||
Args:
|
||||
app: Flask 애플리케이션 인스턴스
|
||||
"""
|
||||
# uploads 디렉토리 생성
|
||||
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
|
||||
|
||||
# Blueprint 등록
|
||||
app.register_blueprint(idrac_bp)
|
||||
|
||||
# CSRF 보호 제외 - iDRAC API 엔드포인트
|
||||
try:
|
||||
from flask_wtf.csrf import CSRFProtect
|
||||
csrf = CSRFProtect()
|
||||
# API 엔드포인트는 CSRF 검증 제외
|
||||
csrf.exempt(idrac_bp)
|
||||
except:
|
||||
pass # CSRF 설정 실패해도 계속 진행
|
||||
|
||||
# DB 테이블 생성
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
399
backend/routes/version_compare_api.py
Normal file
399
backend/routes/version_compare_api.py
Normal file
@@ -0,0 +1,399 @@
|
||||
"""
|
||||
펌웨어 버전 비교 API 코드
|
||||
idrac_routes.py 파일의 register_idrac_routes 함수 위에 추가하세요
|
||||
"""
|
||||
|
||||
# ========================================
|
||||
# 펌웨어 버전 관리 API
|
||||
# ========================================
|
||||
|
||||
@idrac_bp.route('/api/firmware-versions', methods=['GET'])
|
||||
def get_firmware_versions():
|
||||
"""등록된 최신 펌웨어 버전 목록"""
|
||||
try:
|
||||
server_model = request.args.get('model') # 서버 모델 필터
|
||||
|
||||
query = FirmwareVersion.query.filter_by(is_active=True)
|
||||
|
||||
if server_model:
|
||||
# 특정 모델 또는 범용
|
||||
query = query.filter(
|
||||
(FirmwareVersion.server_model == server_model) |
|
||||
(FirmwareVersion.server_model == None)
|
||||
)
|
||||
|
||||
versions = query.order_by(FirmwareVersion.component_name).all()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'versions': [v.to_dict() for v in versions]
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/firmware-versions', methods=['POST'])
|
||||
def add_firmware_version():
|
||||
"""최신 펌웨어 버전 등록"""
|
||||
try:
|
||||
data = request.json
|
||||
|
||||
# 필수 필드 확인
|
||||
if not all([data.get('component_name'), data.get('latest_version')]):
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '컴포넌트명과 버전을 입력하세요'
|
||||
})
|
||||
|
||||
# 중복 확인 (같은 컴포넌트, 같은 모델)
|
||||
existing = FirmwareVersion.query.filter_by(
|
||||
component_name=data['component_name'],
|
||||
server_model=data.get('server_model')
|
||||
).first()
|
||||
|
||||
if existing:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'이미 등록된 컴포넌트입니다'
|
||||
})
|
||||
|
||||
# 버전 생성
|
||||
version = FirmwareVersion(
|
||||
component_name=data['component_name'],
|
||||
component_type=data.get('component_type'),
|
||||
vendor=data.get('vendor'),
|
||||
server_model=data.get('server_model'),
|
||||
latest_version=data['latest_version'],
|
||||
release_date=data.get('release_date'),
|
||||
download_url=data.get('download_url'),
|
||||
file_name=data.get('file_name'),
|
||||
file_size_mb=data.get('file_size_mb'),
|
||||
notes=data.get('notes'),
|
||||
is_critical=data.get('is_critical', False)
|
||||
)
|
||||
|
||||
db.session.add(version)
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'{version.component_name} 버전 정보 등록 완료',
|
||||
'version': version.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/firmware-versions/<int:version_id>', methods=['PUT'])
|
||||
def update_firmware_version(version_id):
|
||||
"""펌웨어 버전 정보 수정"""
|
||||
try:
|
||||
version = FirmwareVersion.query.get(version_id)
|
||||
if not version:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '버전 정보를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
data = request.json
|
||||
|
||||
# 업데이트
|
||||
if 'component_name' in data:
|
||||
version.component_name = data['component_name']
|
||||
if 'latest_version' in data:
|
||||
version.latest_version = data['latest_version']
|
||||
if 'release_date' in data:
|
||||
version.release_date = data['release_date']
|
||||
if 'download_url' in data:
|
||||
version.download_url = data['download_url']
|
||||
if 'file_name' in data:
|
||||
version.file_name = data['file_name']
|
||||
if 'notes' in data:
|
||||
version.notes = data['notes']
|
||||
if 'is_critical' in data:
|
||||
version.is_critical = data['is_critical']
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': '버전 정보 수정 완료',
|
||||
'version': version.to_dict()
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/firmware-versions/<int:version_id>', methods=['DELETE'])
|
||||
def delete_firmware_version(version_id):
|
||||
"""펌웨어 버전 정보 삭제"""
|
||||
try:
|
||||
version = FirmwareVersion.query.get(version_id)
|
||||
if not version:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '버전 정보를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
version.is_active = False
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'{version.component_name} 버전 정보 삭제 완료'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers/<int:server_id>/firmware/compare', methods=['GET'])
|
||||
def compare_server_firmware(server_id):
|
||||
"""
|
||||
서버 펌웨어 버전 비교
|
||||
현재 버전과 최신 버전을 비교하여 업데이트 필요 여부 확인
|
||||
"""
|
||||
try:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 찾을 수 없습니다'
|
||||
})
|
||||
|
||||
# 현재 펌웨어 조회
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
current_inventory = client.get_firmware_inventory()
|
||||
|
||||
# 최신 버전 정보 조회
|
||||
latest_versions = FirmwareVersion.query.filter_by(is_active=True).all()
|
||||
|
||||
# 비교 결과
|
||||
comparisons = []
|
||||
|
||||
for current_fw in current_inventory:
|
||||
component_name = current_fw['Name']
|
||||
current_version = current_fw['Version']
|
||||
|
||||
# 최신 버전 찾기 (컴포넌트명 매칭)
|
||||
latest = None
|
||||
for lv in latest_versions:
|
||||
if lv.component_name.lower() in component_name.lower():
|
||||
# 서버 모델 확인
|
||||
if not lv.server_model or lv.server_model == server.model:
|
||||
latest = lv
|
||||
break
|
||||
|
||||
# 비교
|
||||
comparison = FirmwareComparisonResult(
|
||||
component_name=component_name,
|
||||
current_version=current_version,
|
||||
latest_version=latest.latest_version if latest else None
|
||||
)
|
||||
|
||||
result = comparison.to_dict()
|
||||
|
||||
# 추가 정보
|
||||
if latest:
|
||||
result['latest_info'] = {
|
||||
'release_date': latest.release_date,
|
||||
'download_url': latest.download_url,
|
||||
'file_name': latest.file_name,
|
||||
'is_critical': latest.is_critical,
|
||||
'notes': latest.notes
|
||||
}
|
||||
|
||||
comparisons.append(result)
|
||||
|
||||
# 통계
|
||||
total = len(comparisons)
|
||||
outdated = len([c for c in comparisons if c['status'] == 'outdated'])
|
||||
latest_count = len([c for c in comparisons if c['status'] == 'latest'])
|
||||
unknown = len([c for c in comparisons if c['status'] == 'unknown'])
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'server': {
|
||||
'id': server.id,
|
||||
'name': server.name,
|
||||
'model': server.model
|
||||
},
|
||||
'comparisons': comparisons,
|
||||
'summary': {
|
||||
'total': total,
|
||||
'outdated': outdated,
|
||||
'latest': latest_count,
|
||||
'unknown': unknown
|
||||
}
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
@idrac_bp.route('/api/servers/firmware/compare-multi', methods=['POST'])
|
||||
def compare_multi_servers_firmware():
|
||||
"""
|
||||
여러 서버의 펌웨어 버전 비교
|
||||
"""
|
||||
try:
|
||||
data = request.json
|
||||
server_ids = data.get('server_ids', [])
|
||||
|
||||
if not server_ids:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': '서버를 선택하세요'
|
||||
})
|
||||
|
||||
results = []
|
||||
|
||||
for server_id in server_ids:
|
||||
server = IdracServer.query.get(server_id)
|
||||
if not server:
|
||||
continue
|
||||
|
||||
try:
|
||||
# 각 서버 비교
|
||||
client = DellRedfishClient(server.ip_address, server.username, server.password)
|
||||
current_inventory = client.get_firmware_inventory()
|
||||
|
||||
latest_versions = FirmwareVersion.query.filter_by(is_active=True).all()
|
||||
|
||||
outdated_count = 0
|
||||
outdated_items = []
|
||||
|
||||
for current_fw in current_inventory:
|
||||
component_name = current_fw['Name']
|
||||
current_version = current_fw['Version']
|
||||
|
||||
# 최신 버전 찾기
|
||||
for lv in latest_versions:
|
||||
if lv.component_name.lower() in component_name.lower():
|
||||
comparison = FirmwareComparisonResult(
|
||||
component_name=component_name,
|
||||
current_version=current_version,
|
||||
latest_version=lv.latest_version
|
||||
)
|
||||
|
||||
if comparison.status == 'outdated':
|
||||
outdated_count += 1
|
||||
outdated_items.append({
|
||||
'component': component_name,
|
||||
'current': current_version,
|
||||
'latest': lv.latest_version
|
||||
})
|
||||
break
|
||||
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'outdated_count': outdated_count,
|
||||
'outdated_items': outdated_items,
|
||||
'status': 'needs_update' if outdated_count > 0 else 'up_to_date'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
results.append({
|
||||
'server_id': server.id,
|
||||
'server_name': server.name,
|
||||
'error': str(e)
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'results': results
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'오류: {str(e)}'
|
||||
})
|
||||
|
||||
|
||||
# ========================================
|
||||
# 초기 데이터 생성 함수
|
||||
# ========================================
|
||||
|
||||
def init_firmware_versions():
|
||||
"""초기 펌웨어 버전 데이터 생성"""
|
||||
initial_versions = [
|
||||
{
|
||||
'component_name': 'BIOS',
|
||||
'component_type': 'Firmware',
|
||||
'vendor': 'Dell',
|
||||
'server_model': 'PowerEdge R750',
|
||||
'latest_version': '2.15.0',
|
||||
'release_date': '2024-01-15',
|
||||
'notes': 'PowerEdge R750 최신 BIOS'
|
||||
},
|
||||
{
|
||||
'component_name': 'iDRAC',
|
||||
'component_type': 'Firmware',
|
||||
'vendor': 'Dell',
|
||||
'latest_version': '6.10.30.00',
|
||||
'release_date': '2024-02-20',
|
||||
'notes': 'iDRAC9 최신 펌웨어 (모든 모델 공용)'
|
||||
},
|
||||
{
|
||||
'component_name': 'PERC H755',
|
||||
'component_type': 'Firmware',
|
||||
'vendor': 'Dell',
|
||||
'server_model': 'PowerEdge R750',
|
||||
'latest_version': '25.5.9.0001',
|
||||
'release_date': '2024-01-10',
|
||||
'notes': 'PERC H755 RAID 컨트롤러'
|
||||
},
|
||||
{
|
||||
'component_name': 'BIOS',
|
||||
'component_type': 'Firmware',
|
||||
'vendor': 'Dell',
|
||||
'server_model': 'PowerEdge R640',
|
||||
'latest_version': '2.19.2',
|
||||
'release_date': '2024-02-01',
|
||||
'notes': 'PowerEdge R640 최신 BIOS'
|
||||
},
|
||||
{
|
||||
'component_name': 'CPLD',
|
||||
'component_type': 'Firmware',
|
||||
'vendor': 'Dell',
|
||||
'latest_version': '1.0.6',
|
||||
'release_date': '2023-12-15',
|
||||
'notes': '시스템 보드 CPLD (14G/15G 공용)'
|
||||
},
|
||||
]
|
||||
|
||||
for data in initial_versions:
|
||||
# 중복 체크
|
||||
existing = FirmwareVersion.query.filter_by(
|
||||
component_name=data['component_name'],
|
||||
server_model=data.get('server_model')
|
||||
).first()
|
||||
|
||||
if not existing:
|
||||
version = FirmwareVersion(**data)
|
||||
db.session.add(version)
|
||||
|
||||
try:
|
||||
db.session.commit()
|
||||
print("✓ 초기 펌웨어 버전 데이터 생성 완료")
|
||||
except:
|
||||
db.session.rollback()
|
||||
print("⚠ 초기 데이터 생성 중 오류 (이미 있을 수 있음)")
|
||||
BIN
backend/services/__pycache__/dell_catalog_sync.cpython-311.pyc
Normal file
BIN
backend/services/__pycache__/dell_catalog_sync.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/dell_catalog_sync.cpython-312.pyc
Normal file
BIN
backend/services/__pycache__/dell_catalog_sync.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/idrac_jobs.cpython-311.pyc
Normal file
BIN
backend/services/__pycache__/idrac_jobs.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/idrac_jobs.cpython-312.pyc
Normal file
BIN
backend/services/__pycache__/idrac_jobs.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/idrac_jobs.cpython-313.pyc
Normal file
BIN
backend/services/__pycache__/idrac_jobs.cpython-313.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
backend/services/__pycache__/ip_processor.cpython-311.pyc
Normal file
BIN
backend/services/__pycache__/ip_processor.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/ip_processor.cpython-312.pyc
Normal file
BIN
backend/services/__pycache__/ip_processor.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/logger.cpython-311.pyc
Normal file
BIN
backend/services/__pycache__/logger.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/logger.cpython-312.pyc
Normal file
BIN
backend/services/__pycache__/logger.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/redfish_client.cpython-311.pyc
Normal file
BIN
backend/services/__pycache__/redfish_client.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/redfish_client.cpython-312.pyc
Normal file
BIN
backend/services/__pycache__/redfish_client.cpython-312.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/redfish_client.cpython-313.pyc
Normal file
BIN
backend/services/__pycache__/redfish_client.cpython-313.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/watchdog_handler.cpython-311.pyc
Normal file
BIN
backend/services/__pycache__/watchdog_handler.cpython-311.pyc
Normal file
Binary file not shown.
BIN
backend/services/__pycache__/watchdog_handler.cpython-312.pyc
Normal file
BIN
backend/services/__pycache__/watchdog_handler.cpython-312.pyc
Normal file
Binary file not shown.
58
backend/services/dell_catalog_sync.py
Normal file
58
backend/services/dell_catalog_sync.py
Normal file
@@ -0,0 +1,58 @@
|
||||
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
|
||||
397
backend/services/idrac_redfish_client.py
Normal file
397
backend/services/idrac_redfish_client.py
Normal file
@@ -0,0 +1,397 @@
|
||||
"""
|
||||
Dell iDRAC REDFISH API 클라이언트
|
||||
Dell 서버 펌웨어 조회 최적화 버전
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
from urllib3.exceptions import InsecureRequestWarning
|
||||
from requests.auth import HTTPBasicAuth
|
||||
|
||||
# SSL 경고 비활성화
|
||||
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
|
||||
|
||||
|
||||
class DellRedfishClient:
|
||||
def __init__(self, idrac_ip, username, password):
|
||||
"""
|
||||
Dell iDRAC REDFISH 클라이언트 초기화
|
||||
|
||||
Args:
|
||||
idrac_ip: iDRAC IP 주소
|
||||
username: iDRAC 사용자명
|
||||
password: iDRAC 비밀번호
|
||||
"""
|
||||
self.idrac_ip = idrac_ip
|
||||
self.base_url = f"https://{idrac_ip}"
|
||||
self.auth = HTTPBasicAuth(username, password)
|
||||
self.headers = {'Content-Type': 'application/json'}
|
||||
self.session = requests.Session()
|
||||
self.session.verify = False
|
||||
self.session.auth = self.auth
|
||||
|
||||
def check_connection(self):
|
||||
"""iDRAC 연결 확인"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1"
|
||||
response = self.session.get(url, timeout=10)
|
||||
return response.status_code == 200
|
||||
except Exception as e:
|
||||
print(f"연결 오류: {str(e)}")
|
||||
return False
|
||||
|
||||
def get_firmware_inventory(self):
|
||||
"""
|
||||
현재 설치된 펌웨어 목록 조회 (Dell 최적화)
|
||||
주요 컴포넌트만 필터링하여 반환
|
||||
"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/UpdateService/FirmwareInventory"
|
||||
response = self.session.get(url, timeout=30)
|
||||
|
||||
if response.status_code != 200:
|
||||
print(f"펌웨어 목록 조회 실패: {response.status_code}")
|
||||
return []
|
||||
|
||||
data = response.json()
|
||||
inventory = []
|
||||
|
||||
# 주요 컴포넌트 타입 (Dell 서버)
|
||||
important_components = [
|
||||
'BIOS', 'iDRAC', 'CPLD', 'Diagnostics',
|
||||
'Driver', 'Firmware', 'USC', 'NIC',
|
||||
'RAID', 'PERC', 'Storage', 'Backplane',
|
||||
'HBA', 'Network', 'Intel', 'Broadcom',
|
||||
'Mellanox', 'Emulex', 'QLogic'
|
||||
]
|
||||
|
||||
print(f"전체 펌웨어 항목 수: {len(data.get('Members', []))}")
|
||||
|
||||
# 각 펌웨어 항목 조회
|
||||
for idx, member in enumerate(data.get('Members', [])):
|
||||
try:
|
||||
fw_url = f"{self.base_url}{member.get('@odata.id', '')}"
|
||||
fw_response = self.session.get(fw_url, timeout=10)
|
||||
|
||||
if fw_response.status_code == 200:
|
||||
fw_data = fw_response.json()
|
||||
|
||||
# 이름과 버전 추출 (여러 필드 시도)
|
||||
name = (fw_data.get('Name') or
|
||||
fw_data.get('SoftwareId') or
|
||||
fw_data.get('Id') or
|
||||
'Unknown')
|
||||
|
||||
version = (fw_data.get('Version') or
|
||||
fw_data.get('VersionString') or
|
||||
'Unknown')
|
||||
|
||||
# 컴포넌트 타입 확인
|
||||
component_type = fw_data.get('ComponentType', '')
|
||||
|
||||
# 중요 컴포넌트만 필터링
|
||||
is_important = any(comp.lower() in name.lower()
|
||||
for comp in important_components)
|
||||
|
||||
if is_important or component_type:
|
||||
item = {
|
||||
'Name': name,
|
||||
'Version': version,
|
||||
'ComponentType': component_type,
|
||||
'Updateable': fw_data.get('Updateable', False),
|
||||
'Status': fw_data.get('Status', {}).get('Health', 'OK'),
|
||||
'Id': fw_data.get('Id', ''),
|
||||
'Description': fw_data.get('Description', ''),
|
||||
'ReleaseDate': fw_data.get('ReleaseDate', '')
|
||||
}
|
||||
|
||||
inventory.append(item)
|
||||
|
||||
# 진행 상황 출력
|
||||
if (idx + 1) % 10 == 0:
|
||||
print(f"조회 중... {idx + 1}/{len(data.get('Members', []))}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"펌웨어 항목 조회 오류 ({idx}): {str(e)}")
|
||||
continue
|
||||
|
||||
# 이름순 정렬
|
||||
inventory.sort(key=lambda x: x['Name'])
|
||||
|
||||
print(f"중요 펌웨어 항목 수: {len(inventory)}")
|
||||
|
||||
# 주요 컴포넌트 요약
|
||||
bios = next((x for x in inventory if 'BIOS' in x['Name']), None)
|
||||
idrac = next((x for x in inventory if 'iDRAC' in x['Name']), None)
|
||||
|
||||
if bios:
|
||||
print(f"✓ BIOS 버전: {bios['Version']}")
|
||||
if idrac:
|
||||
print(f"✓ iDRAC 버전: {idrac['Version']}")
|
||||
|
||||
return inventory
|
||||
|
||||
except Exception as e:
|
||||
print(f"펌웨어 목록 조회 오류: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return []
|
||||
|
||||
def get_firmware_summary(self):
|
||||
"""
|
||||
주요 펌웨어 버전만 간단히 조회
|
||||
BIOS, iDRAC, PERC 등 핵심 컴포넌트만
|
||||
"""
|
||||
try:
|
||||
inventory = self.get_firmware_inventory()
|
||||
|
||||
summary = {
|
||||
'BIOS': 'N/A',
|
||||
'iDRAC': 'N/A',
|
||||
'PERC': 'N/A',
|
||||
'NIC': 'N/A',
|
||||
'CPLD': 'N/A'
|
||||
}
|
||||
|
||||
for item in inventory:
|
||||
name = item['Name']
|
||||
version = item['Version']
|
||||
|
||||
if 'BIOS' in name:
|
||||
summary['BIOS'] = version
|
||||
elif 'iDRAC' in name or 'Integrated Dell Remote Access' in name:
|
||||
summary['iDRAC'] = version
|
||||
elif 'PERC' in name or 'RAID' in name:
|
||||
if summary['PERC'] == 'N/A':
|
||||
summary['PERC'] = version
|
||||
elif 'NIC' in name or 'Network' in name:
|
||||
if summary['NIC'] == 'N/A':
|
||||
summary['NIC'] = version
|
||||
elif 'CPLD' in name:
|
||||
summary['CPLD'] = version
|
||||
|
||||
return summary
|
||||
|
||||
except Exception as e:
|
||||
print(f"펌웨어 요약 조회 오류: {str(e)}")
|
||||
return {}
|
||||
|
||||
def upload_firmware_staged(self, dup_file_path):
|
||||
"""
|
||||
DUP 파일을 iDRAC에 업로드 (스테이징만, 재부팅 시 적용)
|
||||
|
||||
Args:
|
||||
dup_file_path: 업로드할 DUP 파일 경로
|
||||
|
||||
Returns:
|
||||
dict: {'success': bool, 'job_id': str, 'message': str}
|
||||
"""
|
||||
import os
|
||||
if not os.path.exists(dup_file_path):
|
||||
return {
|
||||
'success': False,
|
||||
'job_id': None,
|
||||
'message': f'파일을 찾을 수 없습니다: {dup_file_path}'
|
||||
}
|
||||
|
||||
file_name = os.path.basename(dup_file_path)
|
||||
file_size = os.path.getsize(dup_file_path)
|
||||
|
||||
print(f"파일 업로드: {file_name} ({file_size / (1024*1024):.2f} MB)")
|
||||
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/UpdateService/MultipartUpload"
|
||||
|
||||
# Multipart 업로드 준비
|
||||
with open(dup_file_path, 'rb') as f:
|
||||
files = {
|
||||
'file': (file_name, f, 'application/octet-stream')
|
||||
}
|
||||
|
||||
# targets=INSTALLED 파라미터로 스테이징 모드 설정
|
||||
data = {
|
||||
'@Redfish.OperationApplyTime': 'OnReset',
|
||||
'Targets': []
|
||||
}
|
||||
|
||||
multipart_data = {
|
||||
'UpdateParameters': (None, json.dumps(data), 'application/json')
|
||||
}
|
||||
multipart_data.update(files)
|
||||
|
||||
print("업로드 시작...")
|
||||
response = self.session.post(
|
||||
url,
|
||||
files=multipart_data,
|
||||
auth=self.auth,
|
||||
verify=False,
|
||||
timeout=600 # 10분 타임아웃
|
||||
)
|
||||
|
||||
print(f"응답 코드: {response.status_code}")
|
||||
|
||||
if response.status_code in [200, 201, 202]:
|
||||
response_data = response.json()
|
||||
|
||||
# Task 또는 Job ID 추출
|
||||
task_id = None
|
||||
if '@odata.id' in response_data:
|
||||
task_id = response_data['@odata.id'].split('/')[-1]
|
||||
elif 'Id' in response_data:
|
||||
task_id = response_data['Id']
|
||||
|
||||
# Location 헤더에서 Job ID 추출
|
||||
location = response.headers.get('Location', '')
|
||||
if location and not task_id:
|
||||
task_id = location.split('/')[-1]
|
||||
|
||||
print(f"업로드 완료! Task/Job ID: {task_id}")
|
||||
|
||||
return {
|
||||
'success': True,
|
||||
'job_id': task_id or 'STAGED',
|
||||
'message': '업로드 완료 (재부팅 시 적용)'
|
||||
}
|
||||
else:
|
||||
error_msg = response.text
|
||||
print(f"업로드 실패: {error_msg}")
|
||||
return {
|
||||
'success': False,
|
||||
'job_id': None,
|
||||
'message': f'업로드 실패 (코드: {response.status_code})'
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
print(f"업로드 오류: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return {
|
||||
'success': False,
|
||||
'job_id': None,
|
||||
'message': f'업로드 오류: {str(e)}'
|
||||
}
|
||||
|
||||
def get_job_queue(self):
|
||||
"""Job Queue 조회"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/Managers/iDRAC.Embedded.1/Jobs"
|
||||
response = self.session.get(url, timeout=30)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
jobs = []
|
||||
|
||||
for member in data.get('Members', [])[:20]: # 최근 20개
|
||||
job_url = f"{self.base_url}{member['@odata.id']}"
|
||||
job_response = self.session.get(job_url, timeout=10)
|
||||
|
||||
if job_response.status_code == 200:
|
||||
job_data = job_response.json()
|
||||
jobs.append({
|
||||
'Id': job_data.get('Id', ''),
|
||||
'Name': job_data.get('Name', ''),
|
||||
'JobState': job_data.get('JobState', 'Unknown'),
|
||||
'PercentComplete': job_data.get('PercentComplete', 0),
|
||||
'Message': job_data.get('Message', ''),
|
||||
'StartTime': job_data.get('StartTime', ''),
|
||||
'EndTime': job_data.get('EndTime', '')
|
||||
})
|
||||
|
||||
return jobs
|
||||
else:
|
||||
return []
|
||||
|
||||
except Exception as e:
|
||||
print(f"Job Queue 조회 오류: {str(e)}")
|
||||
return []
|
||||
|
||||
def get_job_status(self, job_id):
|
||||
"""특정 Job 상태 조회"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/Managers/iDRAC.Embedded.1/Jobs/{job_id}"
|
||||
response = self.session.get(url, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return {
|
||||
'Id': data.get('Id', ''),
|
||||
'Name': data.get('Name', ''),
|
||||
'JobState': data.get('JobState', 'Unknown'),
|
||||
'PercentComplete': data.get('PercentComplete', 0),
|
||||
'Message': data.get('Message', ''),
|
||||
'StartTime': data.get('StartTime', ''),
|
||||
'EndTime': data.get('EndTime', '')
|
||||
}
|
||||
else:
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print(f"Job 상태 조회 오류: {str(e)}")
|
||||
return None
|
||||
|
||||
def delete_job(self, job_id):
|
||||
"""Job 삭제"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/Managers/iDRAC.Embedded.1/Jobs/{job_id}"
|
||||
response = self.session.delete(url, timeout=10)
|
||||
return response.status_code in [200, 204]
|
||||
except Exception as e:
|
||||
print(f"Job 삭제 오류: {str(e)}")
|
||||
return False
|
||||
|
||||
def get_power_status(self):
|
||||
"""서버 전원 상태 조회"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/Systems/System.Embedded.1"
|
||||
response = self.session.get(url, timeout=10)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return {
|
||||
'PowerState': data.get('PowerState', 'Unknown'),
|
||||
'Status': data.get('Status', {}).get('Health', 'Unknown')
|
||||
}
|
||||
else:
|
||||
return {'PowerState': 'Unknown', 'Status': 'Unknown'}
|
||||
|
||||
except Exception as e:
|
||||
print(f"전원 상태 조회 오류: {str(e)}")
|
||||
return {'PowerState': 'Unknown', 'Status': 'Unknown'}
|
||||
|
||||
def reboot_server(self, reset_type='GracefulRestart'):
|
||||
"""
|
||||
서버 재부팅
|
||||
|
||||
Args:
|
||||
reset_type: GracefulRestart, ForceRestart, GracefulShutdown, ForceOff, On
|
||||
"""
|
||||
try:
|
||||
url = f"{self.base_url}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset"
|
||||
payload = {'ResetType': reset_type}
|
||||
|
||||
response = self.session.post(
|
||||
url,
|
||||
data=json.dumps(payload),
|
||||
headers=self.headers,
|
||||
timeout=30
|
||||
)
|
||||
|
||||
return response.status_code in [200, 202, 204]
|
||||
|
||||
except Exception as e:
|
||||
print(f"재부팅 오류: {str(e)}")
|
||||
return False
|
||||
|
||||
def power_on_server(self):
|
||||
"""서버 전원 켜기"""
|
||||
return self.reboot_server('On')
|
||||
|
||||
def power_off_server(self, shutdown_type='GracefulShutdown'):
|
||||
"""
|
||||
서버 전원 끄기
|
||||
|
||||
Args:
|
||||
shutdown_type: GracefulShutdown 또는 ForceOff
|
||||
"""
|
||||
return self.reboot_server(shutdown_type)
|
||||
558
backend/static/css/idrac_style.css
Normal file
558
backend/static/css/idrac_style.css
Normal file
@@ -0,0 +1,558 @@
|
||||
/**
|
||||
* Dell iDRAC 멀티 서버 펌웨어 관리 스타일
|
||||
* backend/static/css/idrac_style.css
|
||||
*/
|
||||
|
||||
/* 기본 스타일 */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
min-height: 100vh;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* 헤더 */
|
||||
header {
|
||||
background: white;
|
||||
padding: 30px;
|
||||
border-radius: 15px;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
|
||||
margin-bottom: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
color: #333;
|
||||
font-size: 2.5em;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
header .subtitle {
|
||||
color: #666;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
/* 카드 */
|
||||
.card {
|
||||
background: white;
|
||||
padding: 30px;
|
||||
border-radius: 15px;
|
||||
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20px;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 2px solid #eee;
|
||||
}
|
||||
|
||||
.card-header h2 {
|
||||
color: #333;
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
/* 필터 그룹 */
|
||||
.filter-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
margin-bottom: 20px;
|
||||
padding: 15px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.filter-group label {
|
||||
font-weight: 600;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.filter-group select {
|
||||
padding: 8px 15px;
|
||||
border: 2px solid #ddd;
|
||||
border-radius: 5px;
|
||||
font-size: 1em;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.count-badge {
|
||||
background: #667eea;
|
||||
color: white;
|
||||
padding: 5px 15px;
|
||||
border-radius: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* 서버 테이블 */
|
||||
.table-container {
|
||||
overflow-x: auto;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.server-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.server-table thead {
|
||||
background: #667eea;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.server-table th {
|
||||
padding: 15px;
|
||||
text-align: left;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.server-table tbody tr {
|
||||
border-bottom: 1px solid #eee;
|
||||
transition: background 0.2s;
|
||||
}
|
||||
|
||||
.server-table tbody tr:hover {
|
||||
background: #f8f9fa;
|
||||
}
|
||||
|
||||
.server-table td {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.empty-message {
|
||||
text-align: center;
|
||||
color: #999;
|
||||
padding: 40px !important;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* 상태 배지 */
|
||||
.status {
|
||||
padding: 5px 12px;
|
||||
border-radius: 15px;
|
||||
font-size: 0.9em;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.status-registered {
|
||||
background: #e3f2fd;
|
||||
color: #1976d2;
|
||||
}
|
||||
|
||||
.status-online {
|
||||
background: #e8f5e9;
|
||||
color: #2e7d32;
|
||||
}
|
||||
|
||||
.status-offline {
|
||||
background: #ffebee;
|
||||
color: #c62828;
|
||||
}
|
||||
|
||||
.status-updating {
|
||||
background: #fff3e0;
|
||||
color: #f57c00;
|
||||
}
|
||||
|
||||
.badge {
|
||||
background: #f0f0f0;
|
||||
padding: 4px 10px;
|
||||
border-radius: 10px;
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* 버튼 */
|
||||
.btn {
|
||||
padding: 10px 20px;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
font-size: 1em;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: #667eea;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: #5568d3;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: #6c757d;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: #5a6268;
|
||||
}
|
||||
|
||||
.btn-info {
|
||||
background: #17a2b8;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-info:hover {
|
||||
background: #138496;
|
||||
}
|
||||
|
||||
.btn-warning {
|
||||
background: #ffc107;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.btn-warning:hover {
|
||||
background: #e0a800;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background: #dc3545;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-danger:hover {
|
||||
background: #c82333;
|
||||
}
|
||||
|
||||
.btn-success {
|
||||
background: #28a745;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-success:hover {
|
||||
background: #218838;
|
||||
}
|
||||
|
||||
.btn-icon {
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 1.2em;
|
||||
cursor: pointer;
|
||||
padding: 5px;
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
|
||||
.btn-icon:hover {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
/* 일괄 작업 */
|
||||
.bulk-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
padding: 15px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.bulk-actions span {
|
||||
font-weight: 600;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
/* 모달 */
|
||||
.modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0,0,0,0.5);
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
background: white;
|
||||
border-radius: 15px;
|
||||
width: 90%;
|
||||
max-width: 600px;
|
||||
max-height: 90vh;
|
||||
overflow-y: auto;
|
||||
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20px 30px;
|
||||
border-bottom: 2px solid #eee;
|
||||
}
|
||||
|
||||
.modal-header h3 {
|
||||
color: #333;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.close {
|
||||
font-size: 2em;
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.close:hover {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
padding: 30px;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
padding: 20px 30px;
|
||||
border-top: 2px solid #eee;
|
||||
}
|
||||
|
||||
/* 폼 그룹 */
|
||||
.form-group {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
color: #555;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.form-group input,
|
||||
.form-group select,
|
||||
.form-group textarea {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
border: 2px solid #ddd;
|
||||
border-radius: 5px;
|
||||
font-size: 1em;
|
||||
transition: border-color 0.3s;
|
||||
}
|
||||
|
||||
.form-group input:focus,
|
||||
.form-group select:focus,
|
||||
.form-group textarea:focus {
|
||||
outline: none;
|
||||
border-color: #667eea;
|
||||
}
|
||||
|
||||
/* 진행 상황 */
|
||||
.progress-item {
|
||||
margin-bottom: 20px;
|
||||
padding: 15px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.progress-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.progress-status {
|
||||
color: #666;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.progress-bar-container {
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
background: #e0e0e0;
|
||||
border-radius: 15px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
height: 100%;
|
||||
transition: width 0.3s, background 0.3s;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: white;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.progress-uploading {
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
animation: pulse 1.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.progress-completed {
|
||||
background: #28a745;
|
||||
}
|
||||
|
||||
.progress-failed {
|
||||
background: #dc3545;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.7; }
|
||||
}
|
||||
|
||||
.progress-message {
|
||||
font-size: 0.9em;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.progress-summary {
|
||||
margin-top: 20px;
|
||||
padding: 15px;
|
||||
background: #e3f2fd;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.summary-stats {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.summary-stats span {
|
||||
padding: 5px 15px;
|
||||
background: white;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
/* 결과 테이블 */
|
||||
.result-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.result-table thead {
|
||||
background: #f8f9fa;
|
||||
}
|
||||
|
||||
.result-table th {
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
border-bottom: 2px solid #ddd;
|
||||
}
|
||||
|
||||
.result-table td {
|
||||
padding: 12px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.result-table tr.success {
|
||||
background: #e8f5e9;
|
||||
}
|
||||
|
||||
.result-table tr.failed {
|
||||
background: #ffebee;
|
||||
}
|
||||
|
||||
.result-badge {
|
||||
padding: 5px 10px;
|
||||
border-radius: 10px;
|
||||
font-weight: 600;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.badge-success {
|
||||
background: #28a745;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.badge-failed {
|
||||
background: #dc3545;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* 메시지 */
|
||||
.info-text {
|
||||
padding: 15px;
|
||||
background: #e3f2fd;
|
||||
border-left: 4px solid #2196f3;
|
||||
border-radius: 5px;
|
||||
color: #1976d2;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.warning-text {
|
||||
padding: 15px;
|
||||
background: #fff3e0;
|
||||
border-left: 4px solid #ff9800;
|
||||
border-radius: 5px;
|
||||
color: #f57c00;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* 푸터 */
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 20px;
|
||||
color: white;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/* 반응형 */
|
||||
@media (max-width: 768px) {
|
||||
.card-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
margin-top: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.header-actions button {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.bulk-actions {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
width: 95%;
|
||||
}
|
||||
}
|
||||
|
||||
/* 체크박스 커스텀 */
|
||||
input[type="checkbox"] {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
cursor: pointer;
|
||||
}
|
||||
342
backend/static/css/version_compare_styles.css
Normal file
342
backend/static/css/version_compare_styles.css
Normal file
@@ -0,0 +1,342 @@
|
||||
/* 탭 메뉴 스타일 */
|
||||
.tab-menu {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-bottom: 20px;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
padding: 12px 25px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-bottom: 3px solid transparent;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.tab-button:hover {
|
||||
color: #667eea;
|
||||
background: #f8f9ff;
|
||||
}
|
||||
|
||||
.tab-button.active {
|
||||
color: #667eea;
|
||||
border-bottom-color: #667eea;
|
||||
background: #f8f9ff;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.tab-content.active {
|
||||
display: block;
|
||||
animation: fadeIn 0.3s;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; transform: translateY(10px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
/* 버전 상태 표시 */
|
||||
.version-status {
|
||||
display: inline-block;
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.version-status-outdated {
|
||||
background: #fee;
|
||||
color: #dc3545;
|
||||
border: 1px solid #fcc;
|
||||
}
|
||||
|
||||
.version-status-outdated::before {
|
||||
content: "🔴 ";
|
||||
}
|
||||
|
||||
.version-status-latest {
|
||||
background: #efe;
|
||||
color: #28a745;
|
||||
border: 1px solid #cfc;
|
||||
}
|
||||
|
||||
.version-status-latest::before {
|
||||
content: "🟢 ";
|
||||
}
|
||||
|
||||
.version-status-unknown {
|
||||
background: #ffeaa7;
|
||||
color: #e17055;
|
||||
border: 1px solid #fdcb6e;
|
||||
}
|
||||
|
||||
.version-status-unknown::before {
|
||||
content: "🟡 ";
|
||||
}
|
||||
|
||||
/* 버전 비교 결과 카드 */
|
||||
.comparison-card {
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
padding: 20px;
|
||||
margin-bottom: 20px;
|
||||
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.comparison-card h3 {
|
||||
margin: 0 0 15px 0;
|
||||
color: #333;
|
||||
font-size: 18px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.comparison-summary {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||
gap: 15px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.summary-item {
|
||||
background: #f8f9fa;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.summary-item .label {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.summary-item .value {
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.summary-item.outdated .value {
|
||||
color: #dc3545;
|
||||
}
|
||||
|
||||
.summary-item.latest .value {
|
||||
color: #28a745;
|
||||
}
|
||||
|
||||
.summary-item.unknown .value {
|
||||
color: #ffc107;
|
||||
}
|
||||
|
||||
/* 펌웨어 항목 리스트 */
|
||||
.firmware-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 12px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.firmware-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.firmware-item:hover {
|
||||
background: #f8f9fa;
|
||||
}
|
||||
|
||||
.firmware-name {
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.firmware-versions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.version-badge {
|
||||
padding: 4px 10px;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
font-family: 'Courier New', monospace;
|
||||
}
|
||||
|
||||
.version-current {
|
||||
background: #e9ecef;
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.version-arrow {
|
||||
color: #999;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.version-latest {
|
||||
background: #d4edda;
|
||||
color: #155724;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.version-recommendation {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
/* 중요 업데이트 배지 */
|
||||
.critical-badge {
|
||||
display: inline-block;
|
||||
background: #dc3545;
|
||||
color: white;
|
||||
padding: 2px 8px;
|
||||
border-radius: 10px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
/* 다운로드 링크 */
|
||||
.download-link {
|
||||
color: #667eea;
|
||||
text-decoration: none;
|
||||
font-size: 12px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.download-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* 버전 관리 테이블 */
|
||||
.version-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.version-table th {
|
||||
background: #f8f9fa;
|
||||
padding: 12px;
|
||||
text-align: left;
|
||||
font-weight: 600;
|
||||
color: #495057;
|
||||
border-bottom: 2px solid #dee2e6;
|
||||
}
|
||||
|
||||
.version-table td {
|
||||
padding: 12px;
|
||||
border-bottom: 1px solid #dee2e6;
|
||||
}
|
||||
|
||||
.version-table tr:hover {
|
||||
background: #f8f9fa;
|
||||
}
|
||||
|
||||
/* 빈 상태 메시지 */
|
||||
.empty-state {
|
||||
text-align: center;
|
||||
padding: 60px 20px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.empty-state .icon {
|
||||
font-size: 48px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.empty-state .message {
|
||||
font-size: 16px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
/* 필터 그룹 개선 */
|
||||
.filter-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
margin-bottom: 20px;
|
||||
padding: 15px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.filter-group label {
|
||||
font-weight: 600;
|
||||
color: #495057;
|
||||
}
|
||||
|
||||
.filter-group select {
|
||||
padding: 8px 12px;
|
||||
border: 1px solid #ced4da;
|
||||
border-radius: 4px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
.count-badge {
|
||||
background: #667eea;
|
||||
color: white;
|
||||
padding: 4px 12px;
|
||||
border-radius: 12px;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* 진행률 표시 */
|
||||
.progress-bar {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
background: #e9ecef;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
|
||||
transition: width 0.3s;
|
||||
}
|
||||
|
||||
/* 반응형 */
|
||||
@media (max-width: 768px) {
|
||||
.tab-menu {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
border-bottom: none;
|
||||
border-left: 3px solid transparent;
|
||||
}
|
||||
|
||||
.tab-button.active {
|
||||
border-left-color: #667eea;
|
||||
border-bottom-color: transparent;
|
||||
}
|
||||
|
||||
.comparison-summary {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.firmware-item {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.firmware-versions {
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
740
backend/static/js/idrac_main.js
Normal file
740
backend/static/js/idrac_main.js
Normal file
@@ -0,0 +1,740 @@
|
||||
/**
|
||||
* Dell iDRAC 멀티 서버 펌웨어 관리 JavaScript
|
||||
* backend/static/js/idrac_main.js
|
||||
*/
|
||||
|
||||
// SocketIO 연결
|
||||
const socket = io();
|
||||
|
||||
// 전역 변수
|
||||
let servers = [];
|
||||
let selectedServers = new Set();
|
||||
|
||||
// CSRF 토큰 가져오기
|
||||
function getCSRFToken() {
|
||||
const metaTag = document.querySelector('meta[name="csrf-token"]');
|
||||
if (metaTag) return metaTag.getAttribute('content');
|
||||
|
||||
const cookies = document.cookie.split(';');
|
||||
for (let cookie of cookies) {
|
||||
const [name, value] = cookie.trim().split('=');
|
||||
if (name === 'csrf_token') return value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// fetch 래퍼 함수
|
||||
async function fetchWithCSRF(url, options = {}) {
|
||||
const csrfToken = getCSRFToken();
|
||||
if (!options.headers) options.headers = {};
|
||||
|
||||
if (csrfToken) {
|
||||
options.headers['X-CSRFToken'] = csrfToken;
|
||||
options.headers['X-CSRF-Token'] = csrfToken;
|
||||
}
|
||||
|
||||
if (options.body) {
|
||||
if (options.body instanceof FormData) {
|
||||
// 자동 처리
|
||||
} else if (typeof options.body === 'string') {
|
||||
if (!options.headers['Content-Type']) {
|
||||
options.headers['Content-Type'] = 'application/json';
|
||||
}
|
||||
} else if (typeof options.body === 'object') {
|
||||
options.headers['Content-Type'] = 'application/json';
|
||||
options.body = JSON.stringify(options.body);
|
||||
}
|
||||
}
|
||||
|
||||
return fetch(url, options);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 초기화
|
||||
// ========================================
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
console.log('iDRAC 멀티 서버 관리 시스템 시작');
|
||||
refreshServers();
|
||||
loadGroups();
|
||||
setupSocketIO();
|
||||
});
|
||||
|
||||
// ========================================
|
||||
// 서버 관리
|
||||
// ========================================
|
||||
|
||||
async function refreshServers() {
|
||||
try {
|
||||
const group = document.getElementById('group-filter').value;
|
||||
const url = `/idrac/api/servers${group !== 'all' ? '?group=' + group : ''}`;
|
||||
const response = await fetchWithCSRF(url);
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
servers = data.servers;
|
||||
renderServerList();
|
||||
updateServerCount();
|
||||
} else {
|
||||
showMessage(data.message, 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage('서버 목록 로드 실패: ' + error, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
function renderServerList() {
|
||||
const tbody = document.getElementById('server-list');
|
||||
if (servers.length === 0) {
|
||||
tbody.innerHTML = '<tr><td colspan="8" class="empty-message">등록된 서버가 없습니다</td></tr>';
|
||||
return;
|
||||
}
|
||||
|
||||
tbody.innerHTML = servers.map(server => `
|
||||
<tr data-server-id="${server.id}">
|
||||
<td><input type="checkbox" class="server-checkbox" value="${server.id}"
|
||||
${selectedServers.has(server.id) ? 'checked' : ''}
|
||||
onchange="toggleServerSelection(${server.id})"></td>
|
||||
<td><strong>${server.name}</strong></td>
|
||||
<td><code>${server.ip_address}</code></td>
|
||||
<td><span class="badge">${server.group_name || '-'}</span></td>
|
||||
<td><span class="status status-${server.status}">${getStatusText(server.status)}</span></td>
|
||||
<td>${server.current_bios || '-'}</td>
|
||||
<td>${server.last_connected ? formatDateTime(server.last_connected) : '-'}</td>
|
||||
<td class="action-buttons">
|
||||
<button onclick="testConnection(${server.id})" class="btn-icon" title="연결 테스트">🔌</button>
|
||||
<button onclick="editServer(${server.id})" class="btn-icon" title="수정">✏️</button>
|
||||
<button onclick="deleteServer(${server.id})" class="btn-icon" title="삭제">🗑️</button>
|
||||
</td>
|
||||
</tr>
|
||||
`).join('');
|
||||
}
|
||||
|
||||
function getStatusText(status) {
|
||||
const map = { registered: '등록됨', online: '온라인', offline: '오프라인', updating: '업데이트중' };
|
||||
return map[status] || status;
|
||||
}
|
||||
|
||||
function formatDateTime(dateStr) {
|
||||
const date = new Date(dateStr);
|
||||
return date.toLocaleString('ko-KR', {
|
||||
year: '2-digit', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit'
|
||||
});
|
||||
}
|
||||
|
||||
function updateServerCount() {
|
||||
document.getElementById('server-count').textContent = `${servers.length}대`;
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 서버 선택
|
||||
// ========================================
|
||||
|
||||
function toggleSelectAll() {
|
||||
const checkbox = document.getElementById('select-all');
|
||||
const checkboxes = document.querySelectorAll('.server-checkbox');
|
||||
selectedServers.clear();
|
||||
|
||||
checkboxes.forEach(cb => {
|
||||
cb.checked = checkbox.checked;
|
||||
if (checkbox.checked) selectedServers.add(parseInt(cb.value));
|
||||
});
|
||||
|
||||
updateSelectedCount();
|
||||
}
|
||||
|
||||
function toggleServerSelection(serverId) {
|
||||
if (selectedServers.has(serverId)) selectedServers.delete(serverId);
|
||||
else selectedServers.add(serverId);
|
||||
updateSelectedCount();
|
||||
|
||||
const all = document.querySelectorAll('.server-checkbox');
|
||||
const checked = document.querySelectorAll('.server-checkbox:checked');
|
||||
document.getElementById('select-all').checked = all.length === checked.length;
|
||||
}
|
||||
|
||||
function updateSelectedCount() {
|
||||
document.getElementById('selected-count').textContent = `선택: ${selectedServers.size}대`;
|
||||
}
|
||||
|
||||
function getSelectedServerIds() {
|
||||
return Array.from(selectedServers);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 그룹 관리
|
||||
// ========================================
|
||||
|
||||
async function loadGroups() {
|
||||
try {
|
||||
const response = await fetchWithCSRF('/idrac/api/groups');
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
const select = document.getElementById('group-filter');
|
||||
const currentValue = select.value;
|
||||
select.innerHTML = '<option value="all">전체</option>';
|
||||
data.groups.forEach(g => select.innerHTML += `<option value="${g}">${g}</option>`);
|
||||
if (currentValue) select.value = currentValue;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('그룹 로드 실패:', e);
|
||||
}
|
||||
}
|
||||
|
||||
function filterByGroup() {
|
||||
refreshServers();
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 서버 추가/수정/삭제
|
||||
// ========================================
|
||||
|
||||
function showAddServerModal() {
|
||||
document.getElementById('add-server-modal').style.display = 'flex';
|
||||
}
|
||||
|
||||
function closeAddServerModal() {
|
||||
const modal = document.getElementById('add-server-modal');
|
||||
if (modal) modal.style.display = 'none';
|
||||
setTimeout(() => clearServerForm(), 0); // DOM 안정 후 폼 초기화
|
||||
}
|
||||
|
||||
function clearServerForm() {
|
||||
const fieldIds = [
|
||||
'server-name', 'server-ip', 'server-username',
|
||||
'server-password', 'server-group', 'server-model'
|
||||
];
|
||||
fieldIds.forEach(id => {
|
||||
const el = document.getElementById(id);
|
||||
if (el) {
|
||||
if (el.type === 'checkbox') el.checked = false;
|
||||
else if (el.type === 'file') el.value = null;
|
||||
else el.value = '';
|
||||
} else {
|
||||
console.warn(`[clearServerForm] 요소 없음: #${id}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function addServer() {
|
||||
const serverData = {
|
||||
name: document.getElementById('server-name').value,
|
||||
ip_address: document.getElementById('server-ip').value,
|
||||
username: document.getElementById('server-username').value,
|
||||
password: document.getElementById('server-password').value,
|
||||
group_name: document.getElementById('server-group').value,
|
||||
model: document.getElementById('server-model').value
|
||||
};
|
||||
|
||||
if (!serverData.name || !serverData.ip_address || !serverData.password) {
|
||||
showMessage('필수 필드를 입력하세요 (서버명, IP, 비밀번호)', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetchWithCSRF('/idrac/api/servers', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(serverData)
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
if (data.success) {
|
||||
showMessage(data.message, 'success');
|
||||
closeAddServerModal();
|
||||
refreshServers();
|
||||
loadGroups();
|
||||
} else showMessage(data.message, 'error');
|
||||
} catch (e) {
|
||||
showMessage('서버 추가 실패: ' + e, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteServer(serverId) {
|
||||
if (!confirm('이 서버를 삭제하시겠습니까?')) return;
|
||||
try {
|
||||
const res = await fetchWithCSRF(`/idrac/api/servers/${serverId}`, { method: 'DELETE' });
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
showMessage(data.message, 'success');
|
||||
refreshServers();
|
||||
} else showMessage(data.message, 'error');
|
||||
} catch (e) {
|
||||
showMessage('서버 삭제 실패: ' + e, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 연결 테스트
|
||||
// ========================================
|
||||
|
||||
async function testConnection(serverId) {
|
||||
try {
|
||||
const res = await fetchWithCSRF(`/idrac/api/servers/${serverId}/test`, { method: 'POST' });
|
||||
const data = await res.json();
|
||||
showMessage(data.message, data.success ? 'success' : 'error');
|
||||
refreshServers();
|
||||
} catch (e) {
|
||||
showMessage('연결 테스트 실패: ' + e, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 펌웨어 업로드
|
||||
// ========================================
|
||||
|
||||
function showUploadModal() {
|
||||
const ids = getSelectedServerIds();
|
||||
if (ids.length === 0) return showMessage('서버를 선택하세요', 'warning');
|
||||
document.getElementById('upload-server-count').textContent = `${ids.length}대`;
|
||||
document.getElementById('upload-modal').style.display = 'flex';
|
||||
}
|
||||
|
||||
function closeUploadModal() {
|
||||
document.getElementById('upload-modal').style.display = 'none';
|
||||
document.getElementById('firmware-file').value = '';
|
||||
}
|
||||
|
||||
async function startMultiUpload() {
|
||||
const fileInput = document.getElementById('firmware-file');
|
||||
const serverIds = getSelectedServerIds();
|
||||
|
||||
if (!fileInput.files[0]) {
|
||||
showMessage('파일을 선택하세요', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append('file', fileInput.files[0]);
|
||||
formData.append('server_ids', serverIds.join(','));
|
||||
|
||||
try {
|
||||
closeUploadModal();
|
||||
showUploadProgress(serverIds);
|
||||
|
||||
const response = await fetchWithCSRF('/idrac/api/upload-multi', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
showMessage(data.message, 'success');
|
||||
} else {
|
||||
showMessage(data.message, 'error');
|
||||
hideUploadProgress();
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage('업로드 시작 실패: ' + error, 'error');
|
||||
hideUploadProgress();
|
||||
}
|
||||
}
|
||||
|
||||
function showUploadProgress(serverIds) {
|
||||
const section = document.getElementById('upload-progress-section');
|
||||
const list = document.getElementById('upload-progress-list');
|
||||
|
||||
section.style.display = 'block';
|
||||
|
||||
// 각 서버별 진행 바 생성
|
||||
list.innerHTML = serverIds.map(id => {
|
||||
const server = servers.find(s => s.id === id);
|
||||
return `
|
||||
<div class="progress-item" id="progress-${id}">
|
||||
<div class="progress-header">
|
||||
<strong>${server.name}</strong> (${server.ip_address})
|
||||
<span class="progress-status" id="status-${id}">대기중...</span>
|
||||
</div>
|
||||
<div class="progress-bar-container">
|
||||
<div class="progress-bar" id="bar-${id}" style="width: 0%"></div>
|
||||
</div>
|
||||
<div class="progress-message" id="message-${id}"></div>
|
||||
</div>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
// 요약 초기화
|
||||
document.getElementById('progress-summary').innerHTML = `
|
||||
<div class="summary-stats">
|
||||
<span>전체: ${serverIds.length}대</span>
|
||||
<span id="completed-count">완료: 0대</span>
|
||||
<span id="failed-count">실패: 0대</span>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
function hideUploadProgress() {
|
||||
document.getElementById('upload-progress-section').style.display = 'none';
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// SocketIO 이벤트
|
||||
// ========================================
|
||||
|
||||
function setupSocketIO() {
|
||||
// 업로드 진행 상황
|
||||
socket.on('upload_progress', function(data) {
|
||||
console.log('Upload progress:', data);
|
||||
|
||||
const statusEl = document.getElementById(`status-${data.server_id}`);
|
||||
const barEl = document.getElementById(`bar-${data.server_id}`);
|
||||
const messageEl = document.getElementById(`message-${data.server_id}`);
|
||||
|
||||
if (statusEl) statusEl.textContent = data.message;
|
||||
if (barEl) {
|
||||
barEl.style.width = data.progress + '%';
|
||||
barEl.className = `progress-bar progress-${data.status}`;
|
||||
}
|
||||
if (messageEl) messageEl.textContent = data.job_id ? `Job ID: ${data.job_id}` : '';
|
||||
});
|
||||
|
||||
// 업로드 완료
|
||||
socket.on('upload_complete', function(data) {
|
||||
console.log('Upload complete:', data);
|
||||
|
||||
const summary = data.summary;
|
||||
document.getElementById('completed-count').textContent = `완료: ${summary.success}대`;
|
||||
document.getElementById('failed-count').textContent = `실패: ${summary.failed}대`;
|
||||
|
||||
showMessage(`업로드 완료: 성공 ${summary.success}대, 실패 ${summary.failed}대`, 'success');
|
||||
showResults(data.results, '업로드 결과');
|
||||
|
||||
refreshServers();
|
||||
});
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 결과 표시
|
||||
// ========================================
|
||||
|
||||
function showResults(results, title) {
|
||||
const section = document.getElementById('result-section');
|
||||
const content = document.getElementById('result-content');
|
||||
|
||||
section.style.display = 'block';
|
||||
|
||||
content.innerHTML = `
|
||||
<h3>${title}</h3>
|
||||
<table class="result-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>서버명</th>
|
||||
<th>상태</th>
|
||||
<th>메시지</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
${results.map(r => `
|
||||
<tr class="${r.success ? 'success' : 'failed'}">
|
||||
<td><strong>${r.server_name}</strong></td>
|
||||
<td>
|
||||
<span class="result-badge ${r.success ? 'badge-success' : 'badge-failed'}">
|
||||
${r.success ? '✓ 성공' : '✗ 실패'}
|
||||
</span>
|
||||
</td>
|
||||
<td>${r.message}${r.job_id ? ` (Job: ${r.job_id})` : ''}</td>
|
||||
</tr>
|
||||
`).join('')}
|
||||
</tbody>
|
||||
</table>
|
||||
`;
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 재부팅
|
||||
// ========================================
|
||||
|
||||
async function rebootSelected() {
|
||||
const serverIds = getSelectedServerIds();
|
||||
|
||||
if (serverIds.length === 0) {
|
||||
showMessage('서버를 선택하세요', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!confirm(`선택한 ${serverIds.length}대 서버를 재부팅하시겠습니까?\n\n⚠️ 업로드된 펌웨어가 적용됩니다!`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetchWithCSRF('/idrac/api/servers/reboot-multi', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
server_ids: serverIds,
|
||||
type: 'GracefulRestart'
|
||||
})
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
const summary = data.summary;
|
||||
showMessage(`재부팅 시작: 성공 ${summary.success}대, 실패 ${summary.failed}대`, 'success');
|
||||
showResults(data.results, '재부팅 결과');
|
||||
} else {
|
||||
showMessage(data.message, 'error');
|
||||
}
|
||||
|
||||
refreshServers();
|
||||
} catch (error) {
|
||||
showMessage('재부팅 실패: ' + error, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// Excel 가져오기 (추후 구현)
|
||||
// ========================================
|
||||
|
||||
function importExcel() {
|
||||
showMessage('Excel 가져오기 기능은 개발 중입니다', 'info');
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 유틸리티
|
||||
// ========================================
|
||||
|
||||
function showMessage(message, type = 'info') {
|
||||
// 간단한 알림 표시
|
||||
alert(message);
|
||||
console.log(`[${type}] ${message}`);
|
||||
}
|
||||
|
||||
// 편의 함수들
|
||||
function editServer(serverId) {
|
||||
showMessage('서버 수정 기능은 개발 중입니다', 'info');
|
||||
}
|
||||
|
||||
function getSelectedFirmware() {
|
||||
const serverIds = getSelectedServerIds();
|
||||
|
||||
if (serverIds.length === 0) {
|
||||
showMessage('서버를 선택하세요', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
showMessage('선택한 서버의 펌웨어 조회 중...', 'info');
|
||||
|
||||
// 각 서버별로 펌웨어 조회
|
||||
serverIds.forEach(async (serverId) => {
|
||||
try {
|
||||
const response = await fetchWithCSRF(`/idrac/api/servers/${serverId}/firmware`);
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
console.log(`Server ${serverId} firmware:`, data.data);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Server ${serverId} firmware query failed:`, error);
|
||||
}
|
||||
});
|
||||
|
||||
// 새로고침
|
||||
setTimeout(() => {
|
||||
refreshServers();
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 다중 연결 테스트
|
||||
// ========================================
|
||||
async function testSelectedConnections() {
|
||||
const serverIds = getSelectedServerIds();
|
||||
|
||||
if (serverIds.length === 0) {
|
||||
showMessage('서버를 선택하세요', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
showMessage(`선택된 ${serverIds.length}대 서버 연결 테스트 중...`, 'info');
|
||||
|
||||
try {
|
||||
const res = await fetchWithCSRF('/idrac/api/servers/test-multi', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ server_ids: serverIds })
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
const summary = data.summary;
|
||||
showMessage(`연결 성공: ${summary.success}대 / 실패: ${summary.failed}대`, 'success');
|
||||
showResults(data.results, '연결 테스트 결과');
|
||||
} else {
|
||||
showMessage(data.message, 'error');
|
||||
}
|
||||
refreshServers();
|
||||
} catch (error) {
|
||||
showMessage('연결 테스트 실패: ' + error, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 다중 펌웨어 버전 비교
|
||||
// ========================================
|
||||
async function compareSelectedFirmware() {
|
||||
const serverIds = getSelectedServerIds();
|
||||
|
||||
if (serverIds.length === 0) {
|
||||
showMessage('서버를 선택하세요', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
showMessage(`선택된 ${serverIds.length}대 서버 버전 비교 중...`, 'info');
|
||||
|
||||
try {
|
||||
const res = await fetchWithCSRF('/idrac/api/servers/firmware/compare-multi', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ server_ids: serverIds })
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
if (data.success) {
|
||||
showResults(data.results, '버전 비교 결과');
|
||||
} else {
|
||||
showMessage(data.message, 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage('버전 비교 실패: ' + error, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 펌웨어 버전 추가 모달
|
||||
// ========================================
|
||||
function showAddVersionModal() {
|
||||
const modal = document.getElementById('add-version-modal');
|
||||
if (modal) modal.style.display = 'flex';
|
||||
}
|
||||
|
||||
function closeAddVersionModal() {
|
||||
const modal = document.getElementById('add-version-modal');
|
||||
if (modal) modal.style.display = 'none';
|
||||
}
|
||||
|
||||
async function addFirmwareVersion() {
|
||||
const data = {
|
||||
component_name: document.getElementById('version-component').value,
|
||||
latest_version: document.getElementById('version-latest').value,
|
||||
server_model: document.getElementById('version-model').value,
|
||||
vendor: document.getElementById('version-vendor').value,
|
||||
release_date: document.getElementById('version-release-date').value,
|
||||
download_url: document.getElementById('version-download-url').value,
|
||||
notes: document.getElementById('version-notes').value,
|
||||
is_critical: document.getElementById('version-critical').checked
|
||||
};
|
||||
|
||||
if (!data.component_name || !data.latest_version) {
|
||||
showMessage('컴포넌트명과 버전을 입력하세요', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetchWithCSRF('/idrac/api/firmware-versions', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(data)
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
showMessage(result.message, 'success');
|
||||
closeAddVersionModal();
|
||||
refreshFirmwareVersionList();
|
||||
} else {
|
||||
showMessage(result.message, 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage('버전 추가 실패: ' + error, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
async function refreshFirmwareVersionList() {
|
||||
try {
|
||||
const response = await fetchWithCSRF('/idrac/api/firmware-versions');
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
const tbody = document.getElementById('version-list');
|
||||
tbody.innerHTML = data.versions.map(v => `
|
||||
<tr>
|
||||
<td>${v.component_name}</td>
|
||||
<td>${v.latest_version}</td>
|
||||
<td>${v.server_model || '-'}</td>
|
||||
<td>${v.release_date || '-'}</td>
|
||||
<td>${v.is_critical ? '⚠️' : ''}</td>
|
||||
<td><button class="btn btn-danger" onclick="deleteFirmwareVersion(${v.id})">삭제</button></td>
|
||||
</tr>
|
||||
`).join('');
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage('버전 목록 로드 실패: ' + error, 'error');
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// Dell Catalog에서 최신 버전 자동 가져오기
|
||||
// ========================================
|
||||
async function syncDellCatalog(model = "PowerEdge R750") {
|
||||
showMessage(`${model} 최신 버전 정보를 Dell에서 가져오는 중...`, "info");
|
||||
|
||||
try {
|
||||
const response = await fetchWithCSRF("/catalog/sync", {
|
||||
method: "POST",
|
||||
body: { model }
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
showMessage(data.message, "success");
|
||||
await refreshFirmwareVersionList();
|
||||
} else {
|
||||
showMessage(data.message, "error");
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage("버전 정보 동기화 실패: " + error, "error");
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
// 펌웨어 버전 목록 새로고침
|
||||
// ========================================
|
||||
async function refreshFirmwareVersionList() {
|
||||
try {
|
||||
const response = await fetchWithCSRF("/idrac/api/firmware-versions");
|
||||
const data = await response.json();
|
||||
|
||||
if (data.success) {
|
||||
const tbody = document.getElementById("version-list");
|
||||
if (!tbody) return;
|
||||
|
||||
tbody.innerHTML = data.versions.length
|
||||
? data.versions
|
||||
.map(
|
||||
(v) => `
|
||||
<tr>
|
||||
<td>${v.component_name}</td>
|
||||
<td>${v.latest_version}</td>
|
||||
<td>${v.server_model || "-"}</td>
|
||||
<td>${v.release_date || "-"}</td>
|
||||
<td>${v.is_critical ? "⚠️" : ""}</td>
|
||||
<td>
|
||||
<button class="btn btn-danger" onclick="deleteFirmwareVersion(${v.id})">삭제</button>
|
||||
</td>
|
||||
</tr>`
|
||||
)
|
||||
.join("")
|
||||
: `<tr><td colspan="6" class="empty-message">등록된 버전 정보가 없습니다</td></tr>`;
|
||||
} else {
|
||||
showMessage(data.message, "error");
|
||||
}
|
||||
} catch (error) {
|
||||
showMessage("버전 목록 로드 실패: " + error, "error");
|
||||
}
|
||||
}
|
||||
283
backend/static/style - 복사본.css
Normal file
283
backend/static/style - 복사본.css
Normal file
@@ -0,0 +1,283 @@
|
||||
/* style.css */
|
||||
|
||||
/* 기본 스타일 재정의 */
|
||||
body {
|
||||
font-family: 'Arial', sans-serif;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
.container {
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
margin-top: 20px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #333;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #333;
|
||||
margin-top: 30px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
font-weight: bold;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
border-radius: 5px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.btn {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: #007bff;
|
||||
border-color: #007bff;
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background-color: #0056b3;
|
||||
border-color: #0056b3;
|
||||
}
|
||||
|
||||
.btn-danger {
|
||||
background-color: #dc3545;
|
||||
border-color: #dc3545;
|
||||
}
|
||||
|
||||
.btn-danger:hover {
|
||||
background-color: #c82333;
|
||||
border-color: #bd2130;
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background-color: #6c757d;
|
||||
border-color: #6c757d;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background-color: #5a6268;
|
||||
border-color: #545b62;
|
||||
}
|
||||
|
||||
.card-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
margin-bottom: 20px; /* 파일 목록 아래 여백 추가 */
|
||||
}
|
||||
|
||||
.simple-card {
|
||||
background-color: #f8f9fa;
|
||||
padding: 15px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
width: calc(12.5% - 10px); /* 가로로 8개 유지 */
|
||||
box-sizing: border-box;
|
||||
text-align: center;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
transition: background-color 0.3s ease; /* 부드러운 전환 효과 추가 */
|
||||
}
|
||||
|
||||
.simple-card a {
|
||||
font-size: 1em; /* 글씨 크기를 작게 조정 */
|
||||
font-weight: bold;
|
||||
color: #007bff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.simple-card a:hover {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
.simple-card:hover {
|
||||
background-color: #e9ecef; /* 호버 시 배경색 변경 */
|
||||
}
|
||||
|
||||
.button-group {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.backup-card-container .backup-card {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.accordion-button {
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
padding: 10px;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.accordion-button:hover {
|
||||
background-color: #0056b3;
|
||||
}
|
||||
|
||||
.accordion-content {
|
||||
display: none;
|
||||
background-color: #f8f9fa;
|
||||
padding: 10px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 20px; /* 파일 목록 아래 여백 추가 */
|
||||
}
|
||||
|
||||
.accordion-content .card-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.accordion-content .simple-card {
|
||||
width: calc(12.5% - 10px); /* 가로로 8개 유지 */
|
||||
}
|
||||
|
||||
/* 진행 상황 스타일 */
|
||||
#progressSession {
|
||||
margin-top: 20px;
|
||||
padding: 15px;
|
||||
background-color: #e9ecef;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
position: relative;
|
||||
margin-bottom: 20px; /* 파일 목록 아래 여백 추가 */
|
||||
}
|
||||
|
||||
.progress {
|
||||
height: 25px;
|
||||
border-radius: 5px;
|
||||
background-color: #f4f4f4;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
font-weight: bold;
|
||||
line-height: 25px;
|
||||
background-color: #007bff;
|
||||
border-radius: 5px;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
#progressSession h2 {
|
||||
position: absolute;
|
||||
top: -30px;
|
||||
left: 15px;
|
||||
background-color: #e9ecef;
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
font-size: 1.2em;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
/* 서버 리스트 박스 높이 조정 */
|
||||
#server_list_content {
|
||||
height: 340px; /* 원하는 높이로 설정 */
|
||||
}
|
||||
|
||||
/* base */
|
||||
|
||||
.navbar {
|
||||
background-color: #333;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.nav-list {
|
||||
list-style-type: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.nav-list li {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.nav-list li a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nav-list li a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
body {
|
||||
padding-top: 58px; /* 상단 네비게이션 바의 높이 */
|
||||
}
|
||||
|
||||
/* XML 파일 목록의 스타일 정의 */
|
||||
.list-group-item {
|
||||
transition: background-color 0.3s ease, transform 0.3s ease;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 10px;
|
||||
padding: 15px;
|
||||
border: 1px solid #ccc;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* 마우스 오버 시 배경색 및 효과 변경 */
|
||||
.list-group-item:hover {
|
||||
background-color: #f8f9fa;
|
||||
transform: scale(1.02);
|
||||
}
|
||||
|
||||
/* 삭제 및 편집 버튼 간격 조정 */
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
/* 파일 목록 타이틀 스타일 정의 */
|
||||
.card-body h5 {
|
||||
font-size: 1.3rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 파일 업로드 필드의 스타일 */
|
||||
.custom-file-label {
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
background-color: #f1f1f1;
|
||||
border: 1px solid #ccc;
|
||||
cursor: pointer;
|
||||
white-space: nowrap; /* 파일 이름이 한 줄로 보이게 함 */
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis; /* 파일 이름이 길 경우 생략 표시 */
|
||||
}
|
||||
|
||||
.custom-file-label:hover {
|
||||
background-color: #e2e2e2;
|
||||
}
|
||||
|
||||
/* 업로드 버튼 스타일 */
|
||||
.btn-upload {
|
||||
margin-top: 10px;
|
||||
width: auto; /* 버튼 너비를 텍스트에 맞게 조정 */
|
||||
font-weight: bold;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/* XML 파일 업로드 필드 레이아웃 조정 */
|
||||
.upload-section {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
252
backend/templates/idrac_firmware.html
Normal file
252
backend/templates/idrac_firmware.html
Normal file
@@ -0,0 +1,252 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||
<title>Dell iDRAC 멀티 서버 펌웨어 관리</title>
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/idrac_style.css') }}">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<header>
|
||||
<h1>🖥️ Dell iDRAC 멀티 서버 펌웨어 관리</h1>
|
||||
<p class="subtitle">납품 전 펌웨어 일괄 업데이트 시스템 - 버전 비교 기능</p>
|
||||
</header>
|
||||
|
||||
<!-- 탭 메뉴 -->
|
||||
<div class="tab-menu">
|
||||
<button class="tab-button active" onclick="showTab('servers')">서버 관리</button>
|
||||
<button class="tab-button" onclick="showTab('versions')">펌웨어 버전 관리</button>
|
||||
<button class="tab-button" onclick="showTab('comparison')">버전 비교 결과</button>
|
||||
</div>
|
||||
|
||||
<!-- 서버 관리 탭 -->
|
||||
<div id="servers-tab" class="tab-content active">
|
||||
<!-- 서버 관리 섹션 -->
|
||||
<section class="card">
|
||||
<div class="card-header">
|
||||
<h2>📋 서버 관리</h2>
|
||||
<div class="header-actions">
|
||||
<button onclick="showAddServerModal()" class="btn btn-primary">+ 서버 추가</button>
|
||||
<button onclick="refreshServers()" class="btn btn-info">🔄 새로고침</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 그룹 필터 -->
|
||||
<div class="filter-group">
|
||||
<label>그룹:</label>
|
||||
<select id="group-filter" onchange="filterByGroup()">
|
||||
<option value="all">전체</option>
|
||||
</select>
|
||||
<span id="server-count" class="count-badge">0대</span>
|
||||
</div>
|
||||
|
||||
<!-- 서버 목록 테이블 -->
|
||||
<div class="table-container">
|
||||
<table class="server-table" id="server-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="40"><input type="checkbox" id="select-all" onchange="toggleSelectAll()"></th>
|
||||
<th>서버명</th>
|
||||
<th>IP 주소</th>
|
||||
<th>그룹</th>
|
||||
<th>상태</th>
|
||||
<th>BIOS 버전</th>
|
||||
<th>업데이트 상태</th>
|
||||
<th width="150">작업</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="server-list">
|
||||
<tr>
|
||||
<td colspan="8" class="empty-message">등록된 서버가 없습니다</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- 선택 작업 -->
|
||||
<div class="bulk-actions">
|
||||
<span id="selected-count">선택: 0대</span>
|
||||
<button onclick="testSelectedConnections()" class="btn btn-info">연결 테스트</button>
|
||||
<button onclick="compareSelectedFirmware()" class="btn btn-warning">버전 비교</button>
|
||||
<button onclick="showUploadModal()" class="btn btn-primary">펌웨어 업로드</button>
|
||||
<button onclick="rebootSelected()" class="btn btn-danger">재부팅</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- 업로드 진행 상황 -->
|
||||
<section class="card" id="upload-progress-section" style="display: none;">
|
||||
<h2>📊 업로드 진행 상황</h2>
|
||||
<div id="upload-progress-list"></div>
|
||||
<div class="progress-summary" id="progress-summary"></div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- 펌웨어 버전 관리 탭 -->
|
||||
<div id="versions-tab" class="tab-content">
|
||||
<section class="card">
|
||||
<div class="card-header">
|
||||
<h2>📦 펌웨어 최신 버전 관리</h2>
|
||||
<div class="header-actions">
|
||||
<button onclick="syncDellCatalog('PowerEdge R750')" class="btn btn-success">🔄 Dell에서 버전 가져오기</button>
|
||||
<button onclick="showAddVersionModal()" class="btn btn-primary">+ 버전 추가</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="table-container">
|
||||
<table class="server-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>컴포넌트</th>
|
||||
<th>최신 버전</th>
|
||||
<th>서버 모델</th>
|
||||
<th>릴리즈 날짜</th>
|
||||
<th>중요</th>
|
||||
<th width="150">작업</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="version-list">
|
||||
<tr>
|
||||
<td colspan="6" class="empty-message">등록된 버전 정보가 없습니다</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- 버전 비교 결과 탭 -->
|
||||
<div id="comparison-tab" class="tab-content">
|
||||
<section class="card">
|
||||
<h2>🔍 펌웨어 버전 비교 결과</h2>
|
||||
<div id="comparison-result"></div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<p>Dell iDRAC 멀티 서버 펌웨어 관리 시스템 - 버전 자동 비교</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- 서버 추가 모달 -->
|
||||
<div id="add-server-modal" class="modal" style="display: none;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3>서버 추가</h3>
|
||||
<span class="close" onclick="closeAddServerModal()">×</span>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="server-name">서버명 *</label>
|
||||
<input type="text" id="server-name" placeholder="예: Server-01">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="server-ip">iDRAC IP *</label>
|
||||
<input type="text" id="server-ip" placeholder="192.168.1.100">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="server-username">사용자명</label>
|
||||
<input type="text" id="server-username" value="root">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="server-password">비밀번호 *</label>
|
||||
<input type="password" id="server-password">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="server-group">그룹</label>
|
||||
<input type="text" id="server-group" placeholder="예: 삼성전자 납품">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="server-model">모델</label>
|
||||
<input type="text" id="server-model" placeholder="예: PowerEdge R750">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button onclick="closeAddServerModal()" class="btn btn-secondary">취소</button>
|
||||
<button onclick="addServer()" class="btn btn-primary">추가</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 버전 추가 모달 -->
|
||||
<div id="add-version-modal" class="modal" style="display: none;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3>펌웨어 최신 버전 추가</h3>
|
||||
<span class="close" onclick="closeAddVersionModal()">×</span>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label for="version-component">컴포넌트명 *</label>
|
||||
<input type="text" id="version-component" placeholder="예: BIOS">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="version-latest">최신 버전 *</label>
|
||||
<input type="text" id="version-latest" placeholder="예: 2.15.0">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="version-model">서버 모델 (선택)</label>
|
||||
<input type="text" id="version-model" placeholder="예: PowerEdge R750 (비우면 모든 모델)">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="version-vendor">벤더</label>
|
||||
<input type="text" id="version-vendor" placeholder="예: Dell">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="version-release-date">릴리즈 날짜</label>
|
||||
<input type="date" id="version-release-date">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="version-download-url">다운로드 URL</label>
|
||||
<input type="text" id="version-download-url" placeholder="DUP 파일 다운로드 링크">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="version-notes">비고</label>
|
||||
<textarea id="version-notes" rows="3" placeholder="버전 변경 사항 등"></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input type="checkbox" id="version-critical">
|
||||
중요 업데이트
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button onclick="closeAddVersionModal()" class="btn btn-secondary">취소</button>
|
||||
<button onclick="addFirmwareVersion()" class="btn btn-primary">추가</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 펌웨어 업로드 모달 -->
|
||||
<div id="upload-modal" class="modal" style="display: none;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3>펌웨어 업로드</h3>
|
||||
<span class="close" onclick="closeUploadModal()">×</span>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p class="warning-text">⚠️ 선택한 서버에 펌웨어를 일괄 업로드합니다</p>
|
||||
<div class="form-group">
|
||||
<label>선택한 서버: <strong id="upload-server-count">0대</strong></label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="firmware-file">DUP 파일 선택 *</label>
|
||||
<input type="file" id="firmware-file" accept=".exe,.bin">
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button onclick="closeUploadModal()" class="btn btn-secondary">취소</button>
|
||||
<button onclick="startMultiUpload()" class="btn btn-primary">업로드 시작</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<section class="card" id="result-section" style="display:none;">
|
||||
<div id="result-content"></div>
|
||||
</section>
|
||||
|
||||
<script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script>
|
||||
<script src="{{ url_for('static', filename='js/idrac_main.js') }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 1PYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 1PYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 1XZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 1XZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 2NYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 2NYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 2XZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 2XZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 3LYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 3LYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 3MYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 3MYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 3PYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 3PYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 4XZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 4XZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 5MYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 5MYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 5NYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 5NYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 6XZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 6XZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 7MYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 7MYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 7XZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 7XZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 8WZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 8WZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: 9NYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : 9NYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: BNYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : BNYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: CXZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : CXZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: DLYCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : DLYCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: DXZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : DXZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,50 +0,0 @@
|
||||
Dell EMC Server Bios,iDRAC,R/C Setting (SVC Tag: FWZCZC4)
|
||||
|
||||
------------------------------------------Firware Version 정보------------------------------------------
|
||||
1. SVC Tag : FWZCZC4
|
||||
2. Bios Firmware : 2.7.5
|
||||
3. iDRAC Firmware Version : 7.20.60.50
|
||||
4. NIC Integrated Firmware Version : 24.0.5
|
||||
5. OnBoard NIC Firmware Version :
|
||||
6. Raid Controller Firmware Version : 8.11.2.0.18-26
|
||||
|
||||
---------------------------------------------Bios 설정 정보----------------------------------------------
|
||||
01. Bios Boot Mode : Uefi
|
||||
02. System Profile Settings - System Profile : BIOS.Setup.1-1#SysProfileSettings]
|
||||
03. System Profile Settings - CPU Power Management : MaxPower
|
||||
04. System Profile Settings - Memory Frequency : MaxPerf
|
||||
05. System Profile Settings - Turbo Boost : Enabled
|
||||
06. System Profile Settings - C1E : Disabled
|
||||
07. System Profile Settings - C-States : Disabled
|
||||
08. System Profile Settings - Monitor/Mwait : Disabled
|
||||
09. Processor Settings - Logical Processor : Enabled
|
||||
10. Processor Settings - Virtualization Technology : Disabled
|
||||
11. Processor Settings - LLC Prefetch : Enabled
|
||||
12. Processor Settings - x2APIC Mode : Disabled
|
||||
13. Memory Settings - Node Interleaving : Disabled
|
||||
14. Memory Settings - DIMM Self Healing (Post Package Repair) on Uncorrectable Memory Error : Enabled
|
||||
15. Memory Settings - Correctable Error Logging : Disabled
|
||||
16. System Settings - Thermal Profile Optimization : Minimum Power
|
||||
17. Integrated Devices Settings - SR-IOV Global Enable : Enabled
|
||||
18. Miscellaneous Settings - F1/F2 Prompt on Error : Disabled
|
||||
|
||||
---------------------------------------------iDRAC 설정 정보----------------------------------------------
|
||||
01. iDRAC Settings - Timezone : Asia/Seoul
|
||||
02. iDRAC Settings - IPMI LAN Selection : Dedicated
|
||||
03. iDRAC Settings - IPMI IP(IPv4) : Enabled
|
||||
04. iDRAC Settings - IPMI IP(IPv6) : Enabled
|
||||
05. iDRAC Settings - Redfish Support : Enabled
|
||||
06. iDRAC Settings - SSH Support : Enabled
|
||||
07. iDRAC Settings - AD User Domain Name : nhncorp.nhncorp.local
|
||||
08. iDRAC Settings - SC Server Address : ad.o.nfra.io
|
||||
09. iDRAC Settings - SE AD RoleGroup Name : SE_Admin
|
||||
10. iDRAC Settings - SE AD RoleGroup Dome인 : nhncorp.nhncorp.local
|
||||
11. iDRAC Settings - SE AD RoleGroup Privilege : 0x1ff
|
||||
12. iDRAC Settings - IDC AD RoleGroup Name : IDC_Admin
|
||||
13. iDRAC Settings - IDC AD RoleGroup Domain : nhncorp.nhncorp.local
|
||||
14. iDRAC Settings - IDC AD RoleGroup Privilege : 0x1f3
|
||||
15. iDRAC Settings - Remote Log (syslog) : Enabled
|
||||
16. iDRAC Settings - syslog server address 1 : syslog.o.nfra.io
|
||||
17. iDRAC Settings - syslog server address 2 :
|
||||
18. iDRAC Settings - syslog server port : 514
|
||||
19. iDRAC Settings - Remote KVM Nonsecure port : 25513
|
||||
@@ -1,12 +0,0 @@
|
||||
1XZCZC4
|
||||
Slot.38: 3825:F303:00C4:15EC
|
||||
Slot.39: 3825:F303:00C4:15F8
|
||||
Slot.37: 3825:F303:00C4:15E8
|
||||
Slot.36: 3825:F303:00C4:15E4
|
||||
Slot.32: 3825:F303:00C4:1564
|
||||
Slot.33: 3825:F303:00C4:1560
|
||||
Slot.34: 3825:F303:00C4:0AF4
|
||||
Slot.35: 3825:F303:00C4:1600
|
||||
Slot.31: 3825:F303:00C4:0910
|
||||
Slot.40: 3825:F303:00C4:1608
|
||||
GUID: 0x3825F30300C415EC;0x3825F30300C415F8;0x3825F30300C415E8;0x3825F30300C415E4;0x3825F30300C41564;0x3825F30300C41560;0x3825F30300C40AF4;0x3825F30300C41600;0x3825F30300C40910;0x3825F30300C41608
|
||||
@@ -1,12 +0,0 @@
|
||||
2NYCZC4
|
||||
Slot.38: 3825:F303:00C4:042C
|
||||
Slot.39: 3825:F303:00C4:04A8
|
||||
Slot.37: 3825:F303:00C4:0420
|
||||
Slot.36: 3825:F303:00C4:0418
|
||||
Slot.32: 3825:F303:00C4:0508
|
||||
Slot.33: 3825:F303:00C4:12B4
|
||||
Slot.34: 3825:F303:00C4:12EC
|
||||
Slot.35: 3825:F303:00C4:122C
|
||||
Slot.31: 3825:F303:00C4:0484
|
||||
Slot.40: 3825:F303:00C4:048C
|
||||
GUID: 0x3825F30300C4042C;0x3825F30300C404A8;0x3825F30300C40420;0x3825F30300C40418;0x3825F30300C40508;0x3825F30300C412B4;0x3825F30300C412EC;0x3825F30300C4122C;0x3825F30300C40484;0x3825F30300C4048C
|
||||
@@ -1,12 +0,0 @@
|
||||
2XZCZC4
|
||||
Slot.38: 3825:F303:00C4:0AEC
|
||||
Slot.39: 3825:F303:00C4:0AD8
|
||||
Slot.37: 3825:F303:00C4:0AC8
|
||||
Slot.36: 3825:F303:00C4:15F4
|
||||
Slot.32: 3825:F303:00C4:0AD0
|
||||
Slot.33: 3825:F303:00C4:0AE0
|
||||
Slot.34: 3825:F303:00C4:0ADC
|
||||
Slot.35: 3825:F303:00C4:1568
|
||||
Slot.31: 3825:F303:00C4:0AE8
|
||||
Slot.40: 3825:F303:00C4:0AD4
|
||||
GUID: 0x3825F30300C40AEC;0x3825F30300C40AD8;0x3825F30300C40AC8;0x3825F30300C415F4;0x3825F30300C40AD0;0x3825F30300C40AE0;0x3825F30300C40ADC;0x3825F30300C41568;0x3825F30300C40AE8;0x3825F30300C40AD4
|
||||
@@ -1,12 +0,0 @@
|
||||
3LYCZC4
|
||||
Slot.38: 5000:E603:0068:F204
|
||||
Slot.39: 5000:E603:0068:F464
|
||||
Slot.37: 5000:E603:0068:F2B8
|
||||
Slot.36: 5000:E603:0068:F2FC
|
||||
Slot.32: 5000:E603:0068:F294
|
||||
Slot.33: 5000:E603:0068:F504
|
||||
Slot.34: 5000:E603:0068:F450
|
||||
Slot.35: 5000:E603:0068:F2C4
|
||||
Slot.31: 5000:E603:0068:F50C
|
||||
Slot.40: 5000:E603:0068:F4FC
|
||||
GUID: 0x5000E6030068F204;0x5000E6030068F464;0x5000E6030068F2B8;0x5000E6030068F2FC;0x5000E6030068F294;0x5000E6030068F504;0x5000E6030068F450;0x5000E6030068F2C4;0x5000E6030068F50C;0x5000E6030068F4FC
|
||||
@@ -1,12 +0,0 @@
|
||||
3MYCZC4
|
||||
Slot.38: 5000:E603:0068:F480
|
||||
Slot.39: 5000:E603:0068:F254
|
||||
Slot.37: 5000:E603:0068:F408
|
||||
Slot.36: 5000:E603:0068:F33C
|
||||
Slot.32: 5000:E603:0068:F40C
|
||||
Slot.33: 5000:E603:0068:F4AC
|
||||
Slot.34: 5000:E603:0068:F4C8
|
||||
Slot.35: 5000:E603:0068:F410
|
||||
Slot.31: 5000:E603:0068:F490
|
||||
Slot.40: 5000:E603:0068:F3A0
|
||||
GUID: 0x5000E6030068F480;0x5000E6030068F254;0x5000E6030068F408;0x5000E6030068F33C;0x5000E6030068F40C;0x5000E6030068F4AC;0x5000E6030068F4C8;0x5000E6030068F410;0x5000E6030068F490;0x5000E6030068F3A0
|
||||
@@ -1,12 +0,0 @@
|
||||
3PYCZC4
|
||||
Slot.38: 5000:E603:0068:F460
|
||||
Slot.39: 5000:E603:0068:F44C
|
||||
Slot.37: 5000:E603:0068:F380
|
||||
Slot.36: 5000:E603:0068:F2BC
|
||||
Slot.32: 5000:E603:0068:F4EC
|
||||
Slot.33: 5000:E603:0068:F274
|
||||
Slot.34: 5000:E603:0068:F4E4
|
||||
Slot.35: 5000:E603:0068:F284
|
||||
Slot.31: 5000:E603:0068:F3DC
|
||||
Slot.40: 5000:E603:0068:F354
|
||||
GUID: 0x5000E6030068F460;0x5000E6030068F44C;0x5000E6030068F380;0x5000E6030068F2BC;0x5000E6030068F4EC;0x5000E6030068F274;0x5000E6030068F4E4;0x5000E6030068F284;0x5000E6030068F3DC;0x5000E6030068F354
|
||||
@@ -1,12 +0,0 @@
|
||||
4XZCZC4
|
||||
Slot.38: 5000:E603:0068:F318
|
||||
Slot.39: 5000:E603:0068:F458
|
||||
Slot.37: 5000:E603:0068:F23C
|
||||
Slot.36: 5000:E603:0068:F090
|
||||
Slot.32: 5000:E603:0068:F448
|
||||
Slot.33: 5000:E603:0068:F440
|
||||
Slot.34: 5000:E603:0068:F310
|
||||
Slot.35: 5000:E603:0068:F430
|
||||
Slot.31: 5000:E603:0068:F3C8
|
||||
Slot.40: 5000:E603:0068:F438
|
||||
GUID: 0x5000E6030068F318;0x5000E6030068F458;0x5000E6030068F23C;0x5000E6030068F090;0x5000E6030068F448;0x5000E6030068F440;0x5000E6030068F310;0x5000E6030068F430;0x5000E6030068F3C8;0x5000E6030068F438
|
||||
@@ -1,12 +0,0 @@
|
||||
5MYCZC4
|
||||
Slot.38: 7C8C:0903:00E4:DE9E
|
||||
Slot.39: 7C8C:0903:00E4:DEDE
|
||||
Slot.37: 7C8C:0903:00E4:DE96
|
||||
Slot.36: 7C8C:0903:00E4:DF42
|
||||
Slot.32: 7C8C:0903:00E4:DE86
|
||||
Slot.33: 7C8C:0903:00E4:DED2
|
||||
Slot.34: 7C8C:0903:00E4:ED06
|
||||
Slot.35: 7C8C:0903:00E4:DF3E
|
||||
Slot.31: 7C8C:0903:00E4:DEEA
|
||||
Slot.40: 7C8C:0903:00E4:DED6
|
||||
GUID: 0x7C8C090300E4DE9E;0x7C8C090300E4DEDE;0x7C8C090300E4DE96;0x7C8C090300E4DF42;0x7C8C090300E4DE86;0x7C8C090300E4DED2;0x7C8C090300E4ED06;0x7C8C090300E4DF3E;0x7C8C090300E4DEEA;0x7C8C090300E4DED6
|
||||
@@ -1,12 +0,0 @@
|
||||
5NYCZC4
|
||||
Slot.38: 3825:F303:00C4:0230
|
||||
Slot.39: 3825:F303:00C4:0FA4
|
||||
Slot.37: 3825:F303:00C4:023C
|
||||
Slot.36: 3825:F303:00C4:0EB4
|
||||
Slot.32: 3825:F303:00C4:0FB0
|
||||
Slot.33: 3825:F303:00C4:0244
|
||||
Slot.34: 3825:F303:00C4:0FA0
|
||||
Slot.35: 3825:F303:00C4:0F90
|
||||
Slot.31: 3825:F303:00C4:0FA8
|
||||
Slot.40: 3825:F303:00C4:0F78
|
||||
GUID: 0x3825F30300C40230;0x3825F30300C40FA4;0x3825F30300C4023C;0x3825F30300C40EB4;0x3825F30300C40FB0;0x3825F30300C40244;0x3825F30300C40FA0;0x3825F30300C40F90;0x3825F30300C40FA8;0x3825F30300C40F78
|
||||
@@ -1,12 +0,0 @@
|
||||
6XZCZC4
|
||||
Slot.38: 3825:F303:00C4:0874
|
||||
Slot.39: 3825:F303:00C4:035C
|
||||
Slot.37: 3825:F303:00C4:1450
|
||||
Slot.36: 3825:F303:00C4:08DC
|
||||
Slot.32: 3825:F303:00C4:086C
|
||||
Slot.33: 3825:F303:00C4:0884
|
||||
Slot.34: 3825:F303:00C4:153C
|
||||
Slot.35: 3825:F303:00C4:0688
|
||||
Slot.31: 3825:F303:00C4:096C
|
||||
Slot.40: 3825:F303:00C4:0870
|
||||
GUID: 0x3825F30300C40874;0x3825F30300C4035C;0x3825F30300C41450;0x3825F30300C408DC;0x3825F30300C4086C;0x3825F30300C40884;0x3825F30300C4153C;0x3825F30300C40688;0x3825F30300C4096C;0x3825F30300C40870
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user