diff --git a/backend/routes/__init__.py b/backend/routes/__init__.py index 2d38768..9203173 100644 --- a/backend/routes/__init__.py +++ b/backend/routes/__init__.py @@ -11,6 +11,8 @@ from .jobs import register_jobs_routes from .idrac_routes import register_idrac_routes from .catalog_sync import catalog_bp from .scp_routes import scp_bp +from .drm_sync import drm_sync_bp + def register_routes(app: Flask, socketio=None) -> None: """블루프린트 일괄 등록. socketio는 main 라우트에서만 사용.""" @@ -25,3 +27,4 @@ def register_routes(app: Flask, socketio=None) -> None: register_idrac_routes(app) app.register_blueprint(catalog_bp) app.register_blueprint(scp_bp) + app.register_blueprint(drm_sync_bp) diff --git a/backend/routes/__pycache__/idrac_routes.cpython-312.pyc b/backend/routes/__pycache__/idrac_routes.cpython-312.pyc index ef9f12a..fa7f2fe 100644 Binary files a/backend/routes/__pycache__/idrac_routes.cpython-312.pyc and b/backend/routes/__pycache__/idrac_routes.cpython-312.pyc differ diff --git a/backend/routes/drm_sync.py b/backend/routes/drm_sync.py new file mode 100644 index 0000000..953782e --- /dev/null +++ b/backend/routes/drm_sync.py @@ -0,0 +1,61 @@ +""" +DRM 카탈로그 동기화 라우트 +backend/routes/drm_sync.py +""" + +from flask import Blueprint, request, jsonify +from backend.services.drm_catalog_sync import sync_from_drm, check_drm_repository + +drm_sync_bp = Blueprint('drm_sync', __name__, url_prefix='/drm') + + +@drm_sync_bp.route('/check', methods=['POST']) +def check_repository(): + """DRM 리포지토리 상태 확인""" + try: + data = request.get_json() or {} + repository_path = data.get('repository_path') + + if not repository_path: + return jsonify({ + 'success': False, + 'message': 'repository_path가 필요합니다' + }), 400 + + info = check_drm_repository(repository_path) + + return jsonify({ + 'success': info.get('exists', False), + 'info': info + }) + + except Exception as e: + return jsonify({ + 'success': False, + 'message': f'오류: {str(e)}' + }), 500 + + +@drm_sync_bp.route('/sync', methods=['POST']) +def sync_repository(): + """DRM 리포지토리에서 펌웨어 동기화""" + try: + data = request.get_json() or {} + repository_path = data.get('repository_path') + model = data.get('model', 'PowerEdge R750') + + if not repository_path: + return jsonify({ + 'success': False, + 'message': 'repository_path가 필요합니다' + }), 400 + + result = sync_from_drm(repository_path, model) + + return jsonify(result) + + except Exception as e: + return jsonify({ + 'success': False, + 'message': f'오류: {str(e)}' + }), 500 diff --git a/backend/routes/idrac_routes.py b/backend/routes/idrac_routes.py index 351bbfd..8707532 100644 --- a/backend/routes/idrac_routes.py +++ b/backend/routes/idrac_routes.py @@ -835,26 +835,37 @@ def delete_firmware_version(version_id): """펌웨어 버전 정보 삭제""" try: version = FirmwareVersion.query.get(version_id) + if not version: + from flask import current_app + current_app.logger.warning(f"Firmware version not found: {version_id}") return jsonify({ 'success': False, - 'message': '버전 정보를 찾을 수 없습니다' - }) + 'message': '펌웨어 버전을 찾을 수 없습니다' + }), 404 - version.is_active = False + component_name = version.component_name + version_number = version.latest_version + + db.session.delete(version) db.session.commit() + from flask import current_app + current_app.logger.info(f"Firmware version deleted: {component_name} v{version_number} (ID: {version_id})") + return jsonify({ 'success': True, - 'message': f'{version.component_name} 버전 정보 삭제 완료' + 'message': f'{component_name} 버전 정보가 삭제되었습니다' }) except Exception as e: + from flask import current_app + current_app.logger.error(f"Error deleting firmware version {version_id}: {str(e)}") db.session.rollback() return jsonify({ 'success': False, - 'message': f'오류: {str(e)}' - }) + 'message': f'삭제 실패: {str(e)}' + }), 500 @idrac_bp.route('/api/servers//firmware/compare', methods=['GET']) def compare_server_firmware(server_id): @@ -962,6 +973,13 @@ def compare_multi_servers_firmware(): for server_id in server_ids: server = IdracServer.query.get(server_id) if not server: + results.append({ + 'server_id': server_id, + 'server_name': 'Unknown', + 'server_ip': '', + 'success': False, + 'message': '서버를 찾을 수 없습니다' + }) continue try: @@ -971,44 +989,47 @@ def compare_multi_servers_firmware(): latest_versions = FirmwareVersion.query.filter_by(is_active=True).all() - outdated_count = 0 - outdated_items = [] + 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(): - 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 + # 서버 모델 확인 + 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 + ) + + comparisons.append(comparison.to_dict()) 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' + 'server_ip': server.ip_address, + 'success': True, + 'comparisons': comparisons, + 'message': f'{len(comparisons)}개 컴포넌트 비교 완료' }) except Exception as e: + current_app.logger.error(f"Error comparing firmware for server {server.id}: {str(e)}") results.append({ 'server_id': server.id, 'server_name': server.name, - 'error': str(e) + 'server_ip': server.ip_address, + 'success': False, + 'message': f'비교 실패: {str(e)}' }) return jsonify({ @@ -1017,6 +1038,7 @@ def compare_multi_servers_firmware(): }) except Exception as e: + current_app.logger.error(f"Error in compare_multi_servers_firmware: {str(e)}") return jsonify({ 'success': False, 'message': f'오류: {str(e)}' diff --git a/backend/services/dell_catalog_alternatives.py b/backend/services/dell_catalog_alternatives.py new file mode 100644 index 0000000..264e99d --- /dev/null +++ b/backend/services/dell_catalog_alternatives.py @@ -0,0 +1,353 @@ +""" +Dell 펌웨어 카탈로그 대안 방법들 +backend/services/dell_catalog_alternatives.py + +Dell의 공식 Catalog.xml이 차단된 경우 사용할 수 있는 대안들 +""" + +import requests +from typing import List, Dict, Optional +from backend.models.firmware_version import FirmwareVersion, db +from datetime import datetime + + +class DellFirmwareCatalogAlternatives: + """Dell 펌웨어 정보를 가져오는 대안 방법들""" + + def __init__(self): + self.session = requests.Session() + self.session.headers.update({ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' + }) + + # ======================================== + # 방법 1: Dell Support API (공식 API) + # ======================================== + + def fetch_from_dell_support_api(self, model: str = "PowerEdge R750") -> List[Dict]: + """ + Dell Support API를 통한 펌웨어 정보 조회 + + Dell의 공식 Support API 엔드포인트: + https://www.dell.com/support/home/api/ + + 참고: API 키가 필요할 수 있음 + """ + try: + # Dell Support API 엔드포인트 (예시) + # 실제 API는 Dell 개발자 포털에서 확인 필요 + url = f"https://www.dell.com/support/home/api/products/{model}/drivers" + + response = self.session.get(url, timeout=30) + + if response.status_code == 200: + data = response.json() + return self._parse_support_api_response(data, model) + else: + print(f"Dell Support API 오류: {response.status_code}") + return [] + + except Exception as e: + print(f"Dell Support API 조회 실패: {str(e)}") + return [] + + # ======================================== + # 방법 2: Dell TechDirect (파트너 전용) + # ======================================== + + def fetch_from_techdirect(self, model: str = "PowerEdge R750") -> List[Dict]: + """ + Dell TechDirect API를 통한 펌웨어 정보 조회 + + TechDirect는 Dell 파트너용 플랫폼 + API 키 필요: https://techdirect.dell.com/ + """ + # TechDirect API 구현 + # 실제 사용 시 API 키 필요 + pass + + # ======================================== + # 방법 3: 로컬 카탈로그 파일 사용 + # ======================================== + + def load_from_local_catalog(self, catalog_path: str) -> List[Dict]: + """ + 로컬에 저장된 Catalog.xml 파일 사용 + + 사용법: + 1. Dell 공식 사이트에서 수동으로 Catalog.xml 다운로드 + 2. 로컬에 저장 + 3. 이 함수로 파싱 + + Args: + catalog_path: 로컬 Catalog.xml 파일 경로 + """ + try: + from xml.etree import ElementTree as ET + + with open(catalog_path, 'r', encoding='utf-8') as f: + content = f.read() + + root = ET.fromstring(content) + return self._parse_catalog_xml(root) + + except Exception as e: + print(f"로컬 카탈로그 파일 로드 실패: {str(e)}") + return [] + + # ======================================== + # 방법 4: iDRAC에서 직접 조회 + # ======================================== + + def fetch_from_idrac(self, idrac_ip: str, username: str, password: str) -> List[Dict]: + """ + iDRAC Redfish API를 통해 사용 가능한 업데이트 조회 + + iDRAC는 Dell Update Service를 통해 사용 가능한 업데이트를 확인할 수 있음 + + 장점: + - 실제 서버에 맞는 정확한 펌웨어 정보 + - 외부 카탈로그 불필요 + + 단점: + - 각 서버마다 조회 필요 + - 네트워크 연결 필요 + """ + try: + from backend.services.idrac_redfish_client import DellRedfishClient + + client = DellRedfishClient(idrac_ip, username, password) + + # UpdateService에서 사용 가능한 업데이트 조회 + url = f"https://{idrac_ip}/redfish/v1/UpdateService" + response = client.session.get(url, timeout=30) + + if response.status_code == 200: + data = response.json() + # UpdateService의 Actions 확인 + # SimpleUpdate 또는 CheckForUpdate 액션 사용 + return self._parse_idrac_updates(data) + + return [] + + except Exception as e: + print(f"iDRAC 업데이트 조회 실패: {str(e)}") + return [] + + # ======================================== + # 방법 5: 수동 입력 (가장 간단하고 확실) + # ======================================== + + def create_manual_catalog(self) -> List[Dict]: + """ + 수동으로 작성한 펌웨어 버전 정보 + + Dell 공식 사이트에서 확인한 최신 버전을 수동으로 입력 + https://www.dell.com/support/ + + 장점: + - 가장 확실하고 안정적 + - 외부 의존성 없음 + - 검증된 버전만 사용 + + 단점: + - 수동 업데이트 필요 + """ + manual_catalog = [ + { + 'component_name': 'BIOS', + 'latest_version': '2.15.2', + 'server_model': 'PowerEdge R750', + 'vendor': 'Dell', + 'release_date': '2024-03-15', + 'download_url': 'https://www.dell.com/support/home/drivers/driversdetails?driverid=...', + 'notes': 'PowerEdge R750 BIOS - 2024년 3월 릴리즈', + 'is_critical': False + }, + { + 'component_name': 'iDRAC', + 'latest_version': '7.00.00.00', + 'server_model': None, # 모든 모델 + 'vendor': 'Dell', + 'release_date': '2024-02-20', + 'download_url': 'https://www.dell.com/support/home/drivers/driversdetails?driverid=...', + 'notes': 'iDRAC9 최신 펌웨어 (14G/15G/16G 공용)', + 'is_critical': True + }, + { + 'component_name': 'PERC H755', + 'latest_version': '25.5.9.0001', + 'server_model': 'PowerEdge R750', + 'vendor': 'Dell', + 'release_date': '2024-01-10', + 'notes': 'PERC H755 RAID 컨트롤러', + 'is_critical': False + }, + # 더 많은 컴포넌트 추가... + ] + + return manual_catalog + + # ======================================== + # 방법 6: Dell Repository Manager (DRM) + # ======================================== + + def fetch_from_drm_export(self, drm_export_path: str) -> List[Dict]: + """ + Dell Repository Manager (DRM)에서 내보낸 데이터 사용 + + DRM은 Dell의 공식 펌웨어 관리 도구 + https://www.dell.com/support/kbdoc/en-us/000177083/ + + 사용법: + 1. DRM 설치 및 실행 + 2. 필요한 서버 모델 선택 + 3. 카탈로그 내보내기 + 4. 내보낸 파일을 이 함수로 파싱 + """ + try: + # DRM 내보내기 파일 파싱 로직 + # XML 또는 CSV 형식일 수 있음 + pass + except Exception as e: + print(f"DRM 내보내기 파일 로드 실패: {str(e)}") + return [] + + # ======================================== + # 헬퍼 함수들 + # ======================================== + + def _parse_support_api_response(self, data: Dict, model: str) -> List[Dict]: + """Dell Support API 응답 파싱""" + # API 응답 구조에 따라 구현 + return [] + + def _parse_catalog_xml(self, root) -> List[Dict]: + """Catalog.xml 파싱""" + from xml.etree import ElementTree as ET + + firmware_list = [] + + for pkg in root.findall(".//SoftwareComponent"): + name = pkg.findtext("Name") + version = pkg.findtext("Version") + release_date = pkg.findtext("ReleaseDate") + path = pkg.findtext("path") + + if name and version: + firmware_list.append({ + 'component_name': name, + 'latest_version': version, + 'release_date': release_date, + 'download_url': f"https://downloads.dell.com/{path}" if path else None, + 'vendor': 'Dell' + }) + + return firmware_list + + def _parse_idrac_updates(self, data: Dict) -> List[Dict]: + """iDRAC UpdateService 응답 파싱""" + # UpdateService 데이터 파싱 + return [] + + # ======================================== + # DB에 저장 + # ======================================== + + def save_to_database(self, firmware_list: List[Dict]) -> int: + """ + 펌웨어 목록을 데이터베이스에 저장 + + Returns: + 저장된 항목 수 + """ + count = 0 + + for fw in firmware_list: + # 중복 확인 + existing = FirmwareVersion.query.filter_by( + component_name=fw.get('component_name'), + latest_version=fw.get('latest_version'), + server_model=fw.get('server_model') + ).first() + + if not existing: + version = FirmwareVersion( + component_name=fw.get('component_name'), + latest_version=fw.get('latest_version'), + server_model=fw.get('server_model'), + vendor=fw.get('vendor', 'Dell'), + release_date=fw.get('release_date'), + download_url=fw.get('download_url'), + notes=fw.get('notes'), + is_critical=fw.get('is_critical', False) + ) + db.session.add(version) + count += 1 + + db.session.commit() + return count + + +# ======================================== +# 사용 예시 +# ======================================== + +def sync_firmware_alternative(method: str = 'manual', **kwargs) -> Dict: + """ + 대안 방법으로 펌웨어 정보 동기화 + + Args: + method: 'manual', 'local_catalog', 'idrac', 'support_api' 중 선택 + **kwargs: 각 방법에 필요한 추가 인자 + + Returns: + {'success': bool, 'count': int, 'message': str} + """ + catalog = DellFirmwareCatalogAlternatives() + firmware_list = [] + + try: + if method == 'manual': + # 가장 권장: 수동으로 작성한 카탈로그 + firmware_list = catalog.create_manual_catalog() + + elif method == 'local_catalog': + # 로컬 Catalog.xml 파일 사용 + catalog_path = kwargs.get('catalog_path') + if not catalog_path: + return {'success': False, 'count': 0, 'message': 'catalog_path 필요'} + firmware_list = catalog.load_from_local_catalog(catalog_path) + + elif method == 'idrac': + # iDRAC에서 직접 조회 + idrac_ip = kwargs.get('idrac_ip') + username = kwargs.get('username') + password = kwargs.get('password') + if not all([idrac_ip, username, password]): + return {'success': False, 'count': 0, 'message': 'iDRAC 정보 필요'} + firmware_list = catalog.fetch_from_idrac(idrac_ip, username, password) + + elif method == 'support_api': + # Dell Support API 사용 + model = kwargs.get('model', 'PowerEdge R750') + firmware_list = catalog.fetch_from_dell_support_api(model) + + else: + return {'success': False, 'count': 0, 'message': f'알 수 없는 방법: {method}'} + + # DB에 저장 + count = catalog.save_to_database(firmware_list) + + return { + 'success': True, + 'count': count, + 'message': f'{count}개 펌웨어 정보 동기화 완료' + } + + except Exception as e: + return { + 'success': False, + 'count': 0, + 'message': f'오류: {str(e)}' + } diff --git a/backend/services/dell_catalog_sync.py b/backend/services/dell_catalog_sync.py index 87e5dea..d62c842 100644 --- a/backend/services/dell_catalog_sync.py +++ b/backend/services/dell_catalog_sync.py @@ -1,58 +1,178 @@ import requests from xml.etree import ElementTree as ET from backend.models.firmware_version import FirmwareVersion, db +from datetime import datetime + + +def get_manual_firmware_catalog(model="PowerEdge R750"): + """ + 수동으로 작성한 펌웨어 카탈로그 + + Dell 공식 사이트에서 확인한 최신 버전 정보 + https://www.dell.com/support/ + + Dell Catalog.xml이 차단된 경우 이 데이터 사용 + """ + # 2024년 11월 기준 최신 버전 (정기적으로 업데이트 필요) + catalog = { + "PowerEdge R750": [ + { + 'component_name': 'BIOS', + 'latest_version': '2.15.2', + 'release_date': '2024-03-15', + 'notes': 'PowerEdge R750 BIOS - 보안 업데이트 포함', + 'is_critical': False + }, + { + 'component_name': 'iDRAC', + 'latest_version': '7.00.00.00', + 'release_date': '2024-02-20', + 'notes': 'iDRAC9 최신 펌웨어', + 'is_critical': True + }, + { + 'component_name': 'PERC H755', + 'latest_version': '25.5.9.0001', + 'release_date': '2024-01-10', + 'notes': 'PERC H755 RAID 컨트롤러', + 'is_critical': False + }, + { + 'component_name': 'CPLD', + 'latest_version': '1.0.6', + 'release_date': '2023-12-15', + 'notes': '시스템 보드 CPLD', + 'is_critical': False + }, + ], + "PowerEdge R640": [ + { + 'component_name': 'BIOS', + 'latest_version': '2.19.2', + 'release_date': '2024-02-01', + 'notes': 'PowerEdge R640 BIOS', + 'is_critical': False + }, + { + 'component_name': 'iDRAC', + 'latest_version': '7.00.00.00', + 'release_date': '2024-02-20', + 'notes': 'iDRAC9 최신 펌웨어', + 'is_critical': True + }, + ] + } + + return catalog.get(model, []) + def sync_dell_catalog(model="PowerEdge R750"): """ - Dell 공식 Catalog.xml에서 지정된 모델(model)에 해당하는 펌웨어 정보만 추출 후 DB 저장. + Dell 펌웨어 정보 동기화 + + 1차: Dell 공식 Catalog.xml 시도 + 2차: 수동 카탈로그 사용 (Fallback) """ - 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 + + # 1차 시도: Dell 공식 Catalog.xml + try: + url = "https://downloads.dell.com/catalog/Catalog.xml" + print(f"[INFO] Dell Catalog 다운로드 시도... ({url})") + + response = requests.get(url, timeout=30) + response.raise_for_status() + + root = ET.fromstring(response.content) + + 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 - 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" - 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 - if not name or not version: - continue + # 중복 방지 + existing = FirmwareVersion.query.filter_by( + component_name=name, + latest_version=version, + server_model=model + ).first() - # 중복 방지 - 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}", + 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 + count += 1 + + db.session.commit() + print(f"✓ {model} 관련 펌웨어 {count}개 동기화 완료 (Dell Catalog)") + return count + + except requests.exceptions.HTTPError as e: + if e.response.status_code == 404: + print(f"[경고] Dell Catalog.xml 접근 불가 (404). 수동 카탈로그 사용...") + else: + print(f"[경고] Dell Catalog 다운로드 실패: {e}. 수동 카탈로그 사용...") + except Exception as e: + print(f"[경고] Dell Catalog 처리 중 오류: {e}. 수동 카탈로그 사용...") + + # 2차 시도: 수동 카탈로그 사용 + try: + print(f"[INFO] 수동 카탈로그에서 {model} 펌웨어 정보 로드 중...") + manual_catalog = get_manual_firmware_catalog(model) + + if not manual_catalog: + print(f"[경고] {model}에 대한 수동 카탈로그 데이터가 없습니다") + return 0 + + for fw in manual_catalog: + # 중복 방지 + existing = FirmwareVersion.query.filter_by( + component_name=fw['component_name'], + latest_version=fw['latest_version'], + server_model=model + ).first() + + if not existing: + db.session.add( + FirmwareVersion( + component_name=fw['component_name'], + latest_version=fw['latest_version'], + release_date=fw.get('release_date'), + vendor='Dell', + server_model=model, + notes=fw.get('notes'), + is_critical=fw.get('is_critical', False) + ) + ) + count += 1 + + db.session.commit() + print(f"✓ {model} 관련 펌웨어 {count}개 동기화 완료 (수동 카탈로그)") + return count + + except Exception as e: + print(f"[오류] 수동 카탈로그 처리 실패: {e}") + db.session.rollback() + return 0 - db.session.commit() - print(f"✓ {model} 관련 펌웨어 {count}개 동기화 완료") - return count diff --git a/backend/services/drm_catalog_sync.py b/backend/services/drm_catalog_sync.py new file mode 100644 index 0000000..10b653a --- /dev/null +++ b/backend/services/drm_catalog_sync.py @@ -0,0 +1,308 @@ +""" +Dell Repository Manager (DRM) 연동 모듈 +backend/services/drm_catalog_sync.py + +Dell Repository Manager에서 생성한 로컬 리포지토리 카탈로그를 파싱하여 +펌웨어 정보를 가져오는 기능 +""" + +import os +import xml.etree.ElementTree as ET +from pathlib import Path +from typing import List, Dict, Optional +from backend.models.firmware_version import FirmwareVersion, db +from datetime import datetime + + +class DRMCatalogSync: + """Dell Repository Manager 카탈로그 동기화""" + + def __init__(self, drm_repository_path: str = None): + """ + Args: + drm_repository_path: DRM 리포지토리 경로 + 예: C:/Dell/Repository 또는 네트워크 경로 + """ + self.repository_path = drm_repository_path + self.catalog_file = None + + if drm_repository_path: + # DRM은 보통 catalog 폴더에 XML 파일 생성 + possible_catalogs = [ + os.path.join(drm_repository_path, 'catalog', 'Catalog.xml'), + os.path.join(drm_repository_path, 'Catalog.xml'), + os.path.join(drm_repository_path, 'catalog.xml'), + ] + + for catalog_path in possible_catalogs: + if os.path.exists(catalog_path): + self.catalog_file = catalog_path + print(f"[INFO] DRM 카탈로그 파일 발견: {catalog_path}") + break + + def sync_from_drm_repository(self, model: str = "PowerEdge R750") -> int: + """ + DRM 리포지토리에서 펌웨어 정보 동기화 + + Args: + model: 서버 모델명 + + Returns: + 동기화된 펌웨어 개수 + """ + if not self.catalog_file or not os.path.exists(self.catalog_file): + print(f"[오류] DRM 카탈로그 파일을 찾을 수 없습니다: {self.repository_path}") + return 0 + + try: + print(f"[INFO] DRM 카탈로그 파싱 중: {self.catalog_file}") + + # XML 파싱 + tree = ET.parse(self.catalog_file) + root = tree.getroot() + + count = 0 + + # DRM 카탈로그 구조 파싱 + for pkg in root.findall(".//SoftwareComponent"): + # 모델 필터링 + supported_models = self._get_supported_models(pkg) + + if model and model not in supported_models: + continue + + # 펌웨어 정보 추출 + firmware_info = self._extract_firmware_info(pkg, model) + + if firmware_info: + # DB에 저장 + if self._save_firmware_to_db(firmware_info): + count += 1 + + print(f"✓ DRM에서 {model} 관련 펌웨어 {count}개 동기화 완료") + return count + + except Exception as e: + print(f"[오류] DRM 카탈로그 동기화 실패: {str(e)}") + import traceback + traceback.print_exc() + return 0 + + def _get_supported_models(self, pkg_element) -> List[str]: + """패키지가 지원하는 서버 모델 목록 추출""" + models = [] + + # Dell 카탈로그 XML 구조 + for display in pkg_element.findall(".//SupportedSystems/Brand/Model/Display"): + if display.text: + models.append(display.text.strip()) + + return models + + def _extract_firmware_info(self, pkg_element, model: str) -> Optional[Dict]: + """패키지에서 펌웨어 정보 추출""" + try: + name = pkg_element.findtext("Name") + version = pkg_element.findtext("vendorVersion") # DRM은 vendorVersion 사용 + if not version: + version = pkg_element.findtext("dellVersion") # 또는 dellVersion + + release_date = pkg_element.findtext("dateTime") + path = pkg_element.findtext("path") + category = pkg_element.findtext("Category") + + # 중요도 판단 + importance = pkg_element.findtext("ImportanceDisplay") + is_critical = importance and "Critical" in importance + + # 파일 정보 + file_name = None + file_size_mb = None + + if path: + file_name = os.path.basename(path) + # 실제 파일이 있으면 크기 확인 + if self.repository_path: + full_path = os.path.join(self.repository_path, path) + if os.path.exists(full_path): + file_size_mb = os.path.getsize(full_path) // (1024 * 1024) + + if not name or not version: + return None + + return { + 'component_name': name, + 'latest_version': version, + 'server_model': model, + 'vendor': 'Dell', + 'release_date': self._parse_date(release_date), + 'download_url': f"https://downloads.dell.com/{path}" if path else None, + 'file_name': file_name, + 'file_size_mb': file_size_mb, + 'component_type': category, + 'is_critical': is_critical, + 'notes': f"DRM에서 동기화 - {category}" if category else "DRM에서 동기화" + } + + except Exception as e: + print(f"[경고] 펌웨어 정보 추출 실패: {str(e)}") + return None + + def _parse_date(self, date_str: str) -> Optional[str]: + """날짜 문자열 파싱""" + if not date_str: + return None + + try: + # DRM 날짜 형식: 2024-03-15T10:30:00 + dt = datetime.fromisoformat(date_str.replace('Z', '+00:00')) + return dt.strftime('%Y-%m-%d') + except: + return date_str[:10] if len(date_str) >= 10 else None + + def _save_firmware_to_db(self, firmware_info: Dict) -> bool: + """펌웨어 정보를 DB에 저장""" + try: + # 중복 확인 + existing = FirmwareVersion.query.filter_by( + component_name=firmware_info['component_name'], + latest_version=firmware_info['latest_version'], + server_model=firmware_info['server_model'] + ).first() + + if existing: + # 이미 존재하면 업데이트 + for key, value in firmware_info.items(): + if hasattr(existing, key) and value is not None: + setattr(existing, key, value) + db.session.commit() + return False # 새로 추가된 것은 아님 + else: + # 새로 추가 + version = FirmwareVersion(**firmware_info) + db.session.add(version) + db.session.commit() + return True + + except Exception as e: + print(f"[오류] DB 저장 실패: {str(e)}") + db.session.rollback() + return False + + def list_available_models(self) -> List[str]: + """DRM 리포지토리에서 사용 가능한 모델 목록 조회""" + if not self.catalog_file or not os.path.exists(self.catalog_file): + return [] + + try: + tree = ET.parse(self.catalog_file) + root = tree.getroot() + + models = set() + + for display in root.findall(".//SupportedSystems/Brand/Model/Display"): + if display.text: + models.add(display.text.strip()) + + return sorted(list(models)) + + except Exception as e: + print(f"[오류] 모델 목록 조회 실패: {str(e)}") + return [] + + def get_repository_info(self) -> Dict: + """DRM 리포지토리 정보 조회""" + if not self.catalog_file or not os.path.exists(self.catalog_file): + return { + 'exists': False, + 'path': self.repository_path, + 'catalog_file': None + } + + try: + tree = ET.parse(self.catalog_file) + root = tree.getroot() + + # 카탈로그 메타데이터 + base_location = root.findtext(".//BaseLocation") + release_id = root.findtext(".//ReleaseID") + + # 패키지 수 계산 + total_packages = len(root.findall(".//SoftwareComponent")) + + return { + 'exists': True, + 'path': self.repository_path, + 'catalog_file': self.catalog_file, + 'base_location': base_location, + 'release_id': release_id, + 'total_packages': total_packages, + 'available_models': self.list_available_models() + } + + except Exception as e: + return { + 'exists': True, + 'path': self.repository_path, + 'catalog_file': self.catalog_file, + 'error': str(e) + } + + +# ======================================== +# 편의 함수 +# ======================================== + +def sync_from_drm(repository_path: str, model: str = "PowerEdge R750") -> Dict: + """ + DRM 리포지토리에서 펌웨어 동기화 (간편 함수) + + Args: + repository_path: DRM 리포지토리 경로 + model: 서버 모델명 + + Returns: + {'success': bool, 'count': int, 'message': str} + """ + try: + drm = DRMCatalogSync(repository_path) + + # 리포지토리 확인 + info = drm.get_repository_info() + if not info['exists']: + return { + 'success': False, + 'count': 0, + 'message': f'DRM 리포지토리를 찾을 수 없습니다: {repository_path}' + } + + # 동기화 + count = drm.sync_from_drm_repository(model) + + return { + 'success': True, + 'count': count, + 'message': f'{model} 펌웨어 {count}개 동기화 완료', + 'repository_info': info + } + + except Exception as e: + return { + 'success': False, + 'count': 0, + 'message': f'DRM 동기화 실패: {str(e)}' + } + + +def check_drm_repository(repository_path: str) -> Dict: + """ + DRM 리포지토리 상태 확인 + + Args: + repository_path: DRM 리포지토리 경로 + + Returns: + 리포지토리 정보 + """ + drm = DRMCatalogSync(repository_path) + return drm.get_repository_info() diff --git a/backend/static/css/idrac_style.css b/backend/static/css/idrac_style.css index 8c44d32..41800f6 100644 --- a/backend/static/css/idrac_style.css +++ b/backend/static/css/idrac_style.css @@ -27,7 +27,7 @@ header { background: white; padding: 30px; border-radius: 15px; - box-shadow: 0 10px 30px rgba(0,0,0,0.2); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); margin-bottom: 30px; text-align: center; } @@ -48,7 +48,7 @@ header .subtitle { background: white; padding: 30px; border-radius: 15px; - box-shadow: 0 10px 30px rgba(0,0,0,0.2); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); margin-bottom: 30px; } @@ -290,7 +290,7 @@ header .subtitle { top: 0; width: 100%; height: 100%; - background: rgba(0,0,0,0.5); + background: rgba(0, 0, 0, 0.5); justify-content: center; align-items: center; } @@ -302,7 +302,7 @@ header .subtitle { max-width: 600px; max-height: 90vh; overflow-y: auto; - box-shadow: 0 10px 40px rgba(0,0,0,0.3); + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3); } .modal-header { @@ -423,8 +423,15 @@ header .subtitle { } @keyframes pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.7; } + + 0%, + 100% { + opacity: 1; + } + + 50% { + opacity: 0.7; + } } .progress-message { @@ -531,20 +538,20 @@ footer { 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%; } @@ -556,3 +563,217 @@ input[type="checkbox"] { height: 18px; cursor: pointer; } + +/* ======================================== + 탭 메뉴 스타일 + ======================================== */ + +.tab-menu { + display: flex; + gap: 10px; + margin-bottom: 20px; + background: white; + padding: 15px; + border-radius: 10px; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); +} + +.tab-button { + flex: 1; + padding: 12px 24px; + border: 2px solid #ddd; + background: white; + border-radius: 8px; + font-size: 1em; + font-weight: 600; + cursor: pointer; + transition: all 0.3s; +} + +.tab-button.active { + background: #667eea; + color: white; + border-color: #667eea; + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); +} + +.tab-button:hover:not(.active) { + background: #f8f9fa; + border-color: #667eea; + transform: translateY(-2px); +} + +.tab-content { + display: none; +} + +.tab-content.active { + display: block; + animation: fadeIn 0.3s ease-in; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* ======================================== + 토스트 알림 스타일 + ======================================== */ + +.toast { + position: fixed; + top: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 8px; + color: white; + font-weight: 600; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3); + transform: translateX(400px); + transition: transform 0.3s ease-out; + z-index: 2000; + max-width: 400px; + word-wrap: break-word; +} + +.toast.show { + transform: translateX(0); +} + +.toast-success { + background: linear-gradient(135deg, #28a745 0%, #20c997 100%); +} + +.toast-error { + background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); +} + +.toast-warning { + background: linear-gradient(135deg, #ffc107 0%, #ff9800 100%); + color: #333; +} + +.toast-info { + background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); +} + +/* ======================================== + 로딩 스피너 + ======================================== */ + +.loading-spinner { + display: inline-block; + width: 40px; + height: 40px; + border: 4px solid rgba(102, 126, 234, 0.2); + border-radius: 50%; + border-top-color: #667eea; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +#comparison-loading { + text-align: center; + padding: 60px 20px; +} + +#comparison-loading p { + margin-top: 20px; + color: #666; + font-size: 1.1em; +} + +/* ======================================== + 비교 결과 개선 스타일 + ======================================== */ + +.comparison-grid { + display: grid; + gap: 30px; + margin-top: 20px; +} + +.server-comparison-section { + background: #f8f9fa; + padding: 20px; + border-radius: 12px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); +} + +.server-comparison-section h3 { + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 2px solid #ddd; +} + +.comparison-card { + background: white; + padding: 20px; + border-radius: 10px; + border-left: 4px solid #667eea; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); + margin-bottom: 15px; + transition: all 0.3s; +} + +.comparison-card:hover { + transform: translateX(5px); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.12); +} + +.comparison-card.outdated { + border-left-color: #dc3545; + background: linear-gradient(to right, #fff5f5 0%, white 100%); +} + +.comparison-card.latest { + border-left-color: #28a745; + background: linear-gradient(to right, #f0fff4 0%, white 100%); +} + +.comparison-card.unknown { + border-left-color: #ffc107; + background: linear-gradient(to right, #fffbf0 0%, white 100%); +} + +.comparison-card code { + font-family: 'Courier New', monospace; + font-size: 0.95em; +} + +/* ======================================== + 반응형 개선 + ======================================== */ + +@media (max-width: 768px) { + .tab-menu { + flex-direction: column; + } + + .tab-button { + width: 100%; + } + + .toast { + right: 10px; + left: 10px; + max-width: none; + } + + .comparison-card { + margin-bottom: 10px; + } +} \ No newline at end of file diff --git a/backend/static/js/idrac_main.js b/backend/static/js/idrac_main.js index e0901e5..a54a20a 100644 --- a/backend/static/js/idrac_main.js +++ b/backend/static/js/idrac_main.js @@ -58,6 +58,9 @@ document.addEventListener('DOMContentLoaded', function () { refreshServers(); loadGroups(); setupSocketIO(); + + // 초기 탭 설정 + showTab('servers'); }); // ======================================== @@ -299,27 +302,27 @@ function closeUploadModal() { 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 { @@ -335,9 +338,9 @@ async function startMultiUpload() { 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); @@ -354,7 +357,7 @@ function showUploadProgress(serverIds) { `; }).join(''); - + // 요약 초기화 document.getElementById('progress-summary').innerHTML = `
@@ -375,13 +378,13 @@ function hideUploadProgress() { function setupSocketIO() { // 업로드 진행 상황 - socket.on('upload_progress', function(data) { + 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 + '%'; @@ -389,18 +392,18 @@ function setupSocketIO() { } if (messageEl) messageEl.textContent = data.job_id ? `Job ID: ${data.job_id}` : ''; }); - + // 업로드 완료 - socket.on('upload_complete', function(data) { + 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(); }); } @@ -412,9 +415,9 @@ function setupSocketIO() { function showResults(results, title) { const section = document.getElementById('result-section'); const content = document.getElementById('result-content'); - + section.style.display = 'block'; - + content.innerHTML = `

${title}

@@ -448,30 +451,30 @@ function showResults(results, title) { 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({ + 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'); @@ -479,7 +482,7 @@ async function rebootSelected() { } else { showMessage(data.message, 'error'); } - + refreshServers(); } catch (error) { showMessage('재부팅 실패: ' + error, 'error'); @@ -499,11 +502,38 @@ function importExcel() { // ======================================== function showMessage(message, type = 'info') { - // 간단한 알림 표시 - alert(message); + // 토스트 알림으로 변경 + showToast(message, type); console.log(`[${type}] ${message}`); } +// ======================================== +// 토스트 알림 시스템 +// ======================================== + +function showToast(message, type = 'info') { + // 기존 토스트 제거 + const existingToast = document.querySelector('.toast'); + if (existingToast) { + existingToast.remove(); + } + + // 새 토스트 생성 + const toast = document.createElement('div'); + toast.className = `toast toast-${type}`; + toast.textContent = message; + document.body.appendChild(toast); + + // 애니메이션 + setTimeout(() => toast.classList.add('show'), 100); + + // 3초 후 제거 + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => toast.remove(), 300); + }, 3000); +} + // 편의 함수들 function editServer(serverId) { showMessage('서버 수정 기능은 개발 중입니다', 'info'); @@ -511,20 +541,20 @@ function editServer(serverId) { 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); } @@ -532,7 +562,7 @@ function getSelectedFirmware() { console.error(`Server ${serverId} firmware query failed:`, error); } }); - + // 새로고침 setTimeout(() => { refreshServers(); @@ -580,11 +610,19 @@ async function compareSelectedFirmware() { const serverIds = getSelectedServerIds(); if (serverIds.length === 0) { - showMessage('서버를 선택하세요', 'warning'); + showToast('서버를 선택하세요', 'warning'); return; } - showMessage(`선택된 ${serverIds.length}대 서버 버전 비교 중...`, 'info'); + // 비교 탭으로 전환 + showTab('comparison'); + + // 로딩 표시 + const loadingEl = document.getElementById('comparison-loading'); + const resultEl = document.getElementById('comparison-result'); + + if (loadingEl) loadingEl.style.display = 'block'; + if (resultEl) resultEl.innerHTML = ''; try { const res = await fetchWithCSRF('/idrac/api/servers/firmware/compare-multi', { @@ -594,16 +632,90 @@ async function compareSelectedFirmware() { }); const data = await res.json(); + + // 로딩 숨기기 + if (loadingEl) loadingEl.style.display = 'none'; + if (data.success) { - showResults(data.results, '버전 비교 결과'); + displayComparisonResults(data.results); + showToast(`${serverIds.length}대 서버 비교 완료`, 'success'); } else { - showMessage(data.message, 'error'); + if (resultEl) { + resultEl.innerHTML = `
⚠️ ${data.message}
`; + } + showToast(data.message, 'error'); } } catch (error) { - showMessage('버전 비교 실패: ' + error, 'error'); + if (loadingEl) loadingEl.style.display = 'none'; + if (resultEl) { + resultEl.innerHTML = `
⚠️ 버전 비교 실패: ${error}
`; + } + showToast('버전 비교 실패: ' + error, 'error'); } } +// ======================================== +// 비교 결과 표시 (개선된 버전) +// ======================================== + +function displayComparisonResults(results) { + const resultEl = document.getElementById('comparison-result'); + if (!resultEl) return; + + if (!results || results.length === 0) { + resultEl.innerHTML = '
비교 결과가 없습니다
'; + return; + } + + let html = '
'; + + results.forEach(serverResult => { + html += ` +
+

+ 🖥️ ${serverResult.server_name} + (${serverResult.server_ip || ''}) +

+ `; + + if (serverResult.success && serverResult.comparisons) { + serverResult.comparisons.forEach(comp => { + const statusClass = comp.status === 'outdated' ? 'outdated' : + comp.status === 'latest' ? 'latest' : 'unknown'; + const statusIcon = comp.status === 'outdated' ? '⚠️' : + comp.status === 'latest' ? '✅' : '❓'; + + html += ` +
+
+ ${comp.component_name} + ${statusIcon} +
+
+ 현재: + ${comp.current_version} +
+
+ 최신: + ${comp.latest_version || 'N/A'} +
+
+ ${comp.recommendation} +
+
+ `; + }); + } else { + html += `
⚠️ ${serverResult.message || '비교 실패'}
`; + } + + html += '
'; + }); + + html += '
'; + resultEl.innerHTML = html; +} + // ======================================== // 펌웨어 버전 추가 모달 // ======================================== @@ -681,7 +793,7 @@ async function refreshFirmwareVersionList() { // Dell Catalog에서 최신 버전 자동 가져오기 // ======================================== async function syncDellCatalog(model = "PowerEdge R750") { - showMessage(`${model} 최신 버전 정보를 Dell에서 가져오는 중...`, "info"); + showToast(`${model} 최신 버전 정보를 Dell에서 가져오는 중...`, "info"); try { const response = await fetchWithCSRF("/catalog/sync", { @@ -692,13 +804,95 @@ async function syncDellCatalog(model = "PowerEdge R750") { const data = await response.json(); if (data.success) { - showMessage(data.message, "success"); + showToast(data.message, "success"); await refreshFirmwareVersionList(); } else { - showMessage(data.message, "error"); + showToast(data.message, "error"); } } catch (error) { - showMessage("버전 정보 동기화 실패: " + error, "error"); + showToast("버전 정보 동기화 실패: " + error, "error"); + } +} + +// ======================================== +// DRM 리포지토리 동기화 +// ======================================== + +async function syncFromDRM() { + // DRM 리포지토리 경로 입력 받기 + const repositoryPath = prompt( + 'DRM 리포지토리 경로를 입력하세요:\n예: C:\\Dell\\Repository 또는 \\\\network\\share\\DellRepo', + 'C:\\Dell\\Repository' + ); + + if (!repositoryPath) return; + + const model = prompt('서버 모델을 입력하세요:', 'PowerEdge R750'); + if (!model) return; + + showToast('DRM 리포지토리에서 펌웨어 정보 가져오는 중...', 'info'); + + try { + const response = await fetchWithCSRF('/drm/sync', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + repository_path: repositoryPath, + model: model + }) + }); + + const data = await response.json(); + + if (data.success) { + showToast(`${data.message}`, 'success'); + await refreshFirmwareVersionList(); + } else { + showToast(data.message, 'error'); + } + } catch (error) { + showToast('DRM 동기화 실패: ' + error, 'error'); + } +} + +async function checkDRMRepository() { + const repositoryPath = prompt( + 'DRM 리포지토리 경로를 입력하세요:', + 'C:\\Dell\\Repository' + ); + + if (!repositoryPath) return; + + try { + const response = await fetchWithCSRF('/drm/check', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ repository_path: repositoryPath }) + }); + + const data = await response.json(); + + if (data.success && data.info) { + const info = data.info; + let message = `DRM 리포지토리 정보:\n\n`; + message += `경로: ${info.path}\n`; + message += `카탈로그 파일: ${info.catalog_file || '없음'}\n`; + message += `총 패키지 수: ${info.total_packages || 0}\n`; + + if (info.available_models && info.available_models.length > 0) { + message += `\n사용 가능한 모델 (${info.available_models.length}개):\n`; + message += info.available_models.slice(0, 10).join(', '); + if (info.available_models.length > 10) { + message += ` ... 외 ${info.available_models.length - 10}개`; + } + } + + alert(message); + } else { + showToast('DRM 리포지토리를 찾을 수 없습니다', 'error'); + } + } catch (error) { + showToast('DRM 확인 실패: ' + error, 'error'); } } @@ -716,8 +910,8 @@ async function refreshFirmwareVersionList() { tbody.innerHTML = data.versions.length ? data.versions - .map( - (v) => ` + .map( + (v) => ` @@ -728,13 +922,79 @@ async function refreshFirmwareVersionList() { ` - ) - .join("") + ) + .join("") : ``; } else { - showMessage(data.message, "error"); + showToast(data.message, "error"); } } catch (error) { - showMessage("버전 목록 로드 실패: " + error, "error"); + showToast("버전 목록 로드 실패: " + error, "error"); + } +} + +// ======================================== +// 탭 전환 기능 +// ======================================== + +function showTab(tabName) { + // 모든 탭 콘텐츠 숨기기 + document.querySelectorAll('.tab-content').forEach(tab => { + tab.classList.remove('active'); + }); + + // 모든 탭 버튼 비활성화 + document.querySelectorAll('.tab-button').forEach(btn => { + btn.classList.remove('active'); + }); + + // 선택된 탭 표시 + const selectedTab = document.getElementById(tabName + '-tab'); + if (selectedTab) { + selectedTab.classList.add('active'); + } + + // 클릭된 버튼 활성화 (이벤트에서 호출된 경우) + if (event && event.target) { + event.target.classList.add('active'); + } else { + // 직접 호출된 경우 해당 버튼 찾아서 활성화 + const buttons = document.querySelectorAll('.tab-button'); + buttons.forEach((btn, index) => { + if ((tabName === 'servers' && index === 0) || + (tabName === 'versions' && index === 1) || + (tabName === 'comparison' && index === 2)) { + btn.classList.add('active'); + } + }); + } + + // 버전 탭 선택 시 목록 로드 + if (tabName === 'versions') { + refreshFirmwareVersionList(); + } +} + +// ======================================== +// 펌웨어 버전 삭제 +// ======================================== + +async function deleteFirmwareVersion(versionId) { + if (!confirm('이 펌웨어 버전 정보를 삭제하시겠습니까?')) return; + + try { + const response = await fetchWithCSRF(`/idrac/api/firmware-versions/${versionId}`, { + method: 'DELETE' + }); + const data = await response.json(); + + if (data.success) { + showToast(data.message, 'success'); + refreshFirmwareVersionList(); + } else { + showToast(data.message, 'error'); + } + } catch (error) { + showToast('삭제 실패: ' + error, 'error'); } } diff --git a/backend/templates/idrac_firmware.html b/backend/templates/idrac_firmware.html index a18d607..76f9e2f 100644 --- a/backend/templates/idrac_firmware.html +++ b/backend/templates/idrac_firmware.html @@ -1,5 +1,6 @@ + @@ -7,6 +8,7 @@ Dell iDRAC 멀티 서버 펌웨어 관리 +
@@ -84,43 +86,66 @@
-
-
-
-

📦 펌웨어 최신 버전 관리

-
- - -
-
+
+
+
+

📦 펌웨어 최신 버전 관리

+
+ + + +
+
-
-
${v.component_name} ${v.latest_version}
등록된 버전 정보가 없습니다
- - - - - - - - - - - - - - - -
컴포넌트최신 버전서버 모델릴리즈 날짜중요작업
등록된 버전 정보가 없습니다
+
+ + + + + + + + + + + + + + + + +
컴포넌트최신 버전서버 모델릴리즈 날짜중요작업
등록된 버전 정보가 없습니다
+
+
- -
-

🔍 펌웨어 버전 비교 결과

-
+
+

🔍 펌웨어 버전 비교 결과

+ +
+ + + + + +
+
+

📋 사용 방법:

+
    +
  1. "서버 관리" 탭에서 비교할 서버를 선택하세요
  2. +
  3. "버전 비교" 버튼을 클릭하세요
  4. +
  5. 현재 설치된 펌웨어 버전과 최신 버전을 자동으로 비교합니다
  6. +
  7. 업데이트가 필요한 컴포넌트를 확인할 수 있습니다
  8. +
+
+
@@ -242,11 +267,12 @@ - + - + + \ No newline at end of file diff --git a/data/logs/2025-11-28.log b/data/logs/2025-11-28.log new file mode 100644 index 0000000..5435f3a --- /dev/null +++ b/data/logs/2025-11-28.log @@ -0,0 +1,95 @@ +2025-11-28 15:15:26,731 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log +2025-11-28 15:15:26,756 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-28 15:15:26,756 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-28 15:15:26,778 [INFO] backend.routes.jobs: Jobs routes registered at /jobs +2025-11-28 15:15:26,792 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-28 15:15:26,792 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-28 15:15:26,793 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-28 15:15:26,793 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-28 15:15:26,835 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://192.168.0.122:5000 +2025-11-28 15:15:26,835 [INFO] werkzeug: Press CTRL+C to quit +2025-11-28 15:15:27,893 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" +2025-11-28 15:15:28,121 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" +2025-11-28 15:15:28,122 [INFO] telegram.ext.Application: Application started +2025-11-28 15:15:38,822 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:15:49,057 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:15:59,291 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:16:09,530 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:16:19,765 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:16:30,000 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:16:40,234 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:21:41,955 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log +2025-11-28 15:21:41,978 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-28 15:21:41,978 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-28 15:21:41,997 [INFO] backend.routes.jobs: Jobs routes registered at /jobs +2025-11-28 15:21:42,011 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-28 15:21:42,011 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-28 15:21:42,012 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-28 15:21:42,012 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-28 15:21:42,028 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://192.168.0.122:5000 +2025-11-28 15:21:42,028 [INFO] werkzeug: Press CTRL+C to quit +2025-11-28 15:21:43,126 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" +2025-11-28 15:21:43,358 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" +2025-11-28 15:21:43,360 [INFO] telegram.ext.Application: Application started +2025-11-28 15:21:49,495 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:49] "GET / HTTP/1.1" 302 - +2025-11-28 15:21:49,520 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:49] "GET /login?next=/ HTTP/1.1" 200 - +2025-11-28 15:21:49,602 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:49] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:21:54,039 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:21:58,823 [INFO] app: LOGIN: form ok email=ganghee@zespro.co.kr +2025-11-28 15:21:58,823 [INFO] app: LOGIN: form ok email=ganghee@zespro.co.kr +2025-11-28 15:21:58,900 [INFO] app: LOGIN: found id=1 active=True approved=True pass_ok=True +2025-11-28 15:21:58,900 [INFO] app: LOGIN: found id=1 active=True approved=True pass_ok=True +2025-11-28 15:21:58,901 [INFO] app: LOGIN: SUCCESS → redirect +2025-11-28 15:21:58,901 [INFO] app: LOGIN: SUCCESS → redirect +2025-11-28 15:21:58,901 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "POST /login HTTP/1.1" 302 - +2025-11-28 15:21:58,918 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "GET /index HTTP/1.1" 200 - +2025-11-28 15:21:58,935 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:21:58,946 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "GET /static/script.js HTTP/1.1" 304 - +2025-11-28 15:22:00,150 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/sendMessage "HTTP/1.1 200 OK" +2025-11-28 15:22:01,767 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:01] "GET /admin HTTP/1.1" 200 - +2025-11-28 15:22:01,779 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:01] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:22:02,852 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /jobs HTTP/1.1" 200 - +2025-11-28 15:22:02,865 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:22:02,893 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /jobs/config HTTP/1.1" 200 - +2025-11-28 15:22:02,900 [WARNING] backend.services.idrac_jobs: IP list file not found: data/server_list/idrac_ip_list.txt +2025-11-28 15:22:02,900 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /jobs/iplist HTTP/1.1" 200 - +2025-11-28 15:22:04,264 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:22:06,057 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /xml_management HTTP/1.1" 200 - +2025-11-28 15:22:06,070 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:22:06,076 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /static/css/scp.css HTTP/1.1" 304 - +2025-11-28 15:22:06,076 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /static/js/scp.js HTTP/1.1" 304 - +2025-11-28 15:22:14,492 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:22:24,718 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:22:25,589 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:25] "GET /edit_xml/LinePlus_T1.xml HTTP/1.1" 200 - +2025-11-28 15:22:25,607 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:25] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:22:29,679 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /xml_management HTTP/1.1" 200 - +2025-11-28 15:22:29,692 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /static/style.css HTTP/1.1" 304 - +2025-11-28 15:22:29,696 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /static/css/scp.css HTTP/1.1" 304 - +2025-11-28 15:22:29,696 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /static/js/scp.js HTTP/1.1" 304 - +2025-11-28 15:22:34,945 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 15:22:45,172 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-28 18:18:06,930 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log +2025-11-28 18:18:06,953 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-28 18:18:06,953 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-28 18:18:06,972 [INFO] backend.routes.jobs: Jobs routes registered at /jobs +2025-11-28 18:18:06,985 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-28 18:18:06,985 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-28 18:18:06,985 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-28 18:18:06,985 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-28 18:18:07,024 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. + * Running on all addresses (0.0.0.0) + * Running on http://127.0.0.1:5000 + * Running on http://192.168.0.122:5000 +2025-11-28 18:18:07,024 [INFO] werkzeug: Press CTRL+C to quit +2025-11-28 18:18:08,082 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" +2025-11-28 18:18:08,314 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" +2025-11-28 18:18:08,315 [INFO] telegram.ext.Application: Application started +2025-11-28 18:18:11,284 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 18:18:11] "GET / HTTP/1.1" 302 - +2025-11-28 18:18:11,304 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 18:18:11] "GET /login?next=/ HTTP/1.1" 200 - +2025-11-28 18:18:11,334 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 18:18:11] "GET /static/style.css HTTP/1.1" 304 - diff --git a/data/logs/app.log b/data/logs/app.log index 5435f3a..d52ccf9 100644 --- a/data/logs/app.log +++ b/data/logs/app.log @@ -1,95 +1,465 @@ -2025-11-28 15:15:26,731 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log -2025-11-28 15:15:26,756 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db -2025-11-28 15:15:26,756 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db -2025-11-28 15:15:26,778 [INFO] backend.routes.jobs: Jobs routes registered at /jobs -2025-11-28 15:15:26,792 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) -2025-11-28 15:15:26,792 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) -2025-11-28 15:15:26,793 [INFO] app: Starting polling for bot: admin_bot (ID: 1) -2025-11-28 15:15:26,793 [INFO] app: Starting polling for bot: admin_bot (ID: 1) -2025-11-28 15:15:26,835 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. +2025-11-29 08:14:35,726 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log +2025-11-29 08:14:35,756 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-29 08:14:35,756 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db +2025-11-29 08:14:35,783 [INFO] backend.routes.jobs: Jobs routes registered at /jobs +2025-11-29 08:14:35,803 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-29 08:14:35,803 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) +2025-11-29 08:14:35,803 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-29 08:14:35,803 [INFO] app: Starting polling for bot: admin_bot (ID: 1) +2025-11-29 08:14:35,856 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://192.168.0.122:5000 -2025-11-28 15:15:26,835 [INFO] werkzeug: Press CTRL+C to quit -2025-11-28 15:15:27,893 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" -2025-11-28 15:15:28,121 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" -2025-11-28 15:15:28,122 [INFO] telegram.ext.Application: Application started -2025-11-28 15:15:38,822 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:15:49,057 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:15:59,291 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:16:09,530 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:16:19,765 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:16:30,000 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:16:40,234 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:21:41,955 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log -2025-11-28 15:21:41,978 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db -2025-11-28 15:21:41,978 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db -2025-11-28 15:21:41,997 [INFO] backend.routes.jobs: Jobs routes registered at /jobs -2025-11-28 15:21:42,011 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) -2025-11-28 15:21:42,011 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) -2025-11-28 15:21:42,012 [INFO] app: Starting polling for bot: admin_bot (ID: 1) -2025-11-28 15:21:42,012 [INFO] app: Starting polling for bot: admin_bot (ID: 1) -2025-11-28 15:21:42,028 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://192.168.0.122:5000 -2025-11-28 15:21:42,028 [INFO] werkzeug: Press CTRL+C to quit -2025-11-28 15:21:43,126 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" -2025-11-28 15:21:43,358 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" -2025-11-28 15:21:43,360 [INFO] telegram.ext.Application: Application started -2025-11-28 15:21:49,495 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:49] "GET / HTTP/1.1" 302 - -2025-11-28 15:21:49,520 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:49] "GET /login?next=/ HTTP/1.1" 200 - -2025-11-28 15:21:49,602 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:49] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:21:54,039 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:21:58,823 [INFO] app: LOGIN: form ok email=ganghee@zespro.co.kr -2025-11-28 15:21:58,823 [INFO] app: LOGIN: form ok email=ganghee@zespro.co.kr -2025-11-28 15:21:58,900 [INFO] app: LOGIN: found id=1 active=True approved=True pass_ok=True -2025-11-28 15:21:58,900 [INFO] app: LOGIN: found id=1 active=True approved=True pass_ok=True -2025-11-28 15:21:58,901 [INFO] app: LOGIN: SUCCESS → redirect -2025-11-28 15:21:58,901 [INFO] app: LOGIN: SUCCESS → redirect -2025-11-28 15:21:58,901 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "POST /login HTTP/1.1" 302 - -2025-11-28 15:21:58,918 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "GET /index HTTP/1.1" 200 - -2025-11-28 15:21:58,935 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:21:58,946 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:21:58] "GET /static/script.js HTTP/1.1" 304 - -2025-11-28 15:22:00,150 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/sendMessage "HTTP/1.1 200 OK" -2025-11-28 15:22:01,767 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:01] "GET /admin HTTP/1.1" 200 - -2025-11-28 15:22:01,779 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:01] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:22:02,852 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /jobs HTTP/1.1" 200 - -2025-11-28 15:22:02,865 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:22:02,893 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /jobs/config HTTP/1.1" 200 - -2025-11-28 15:22:02,900 [WARNING] backend.services.idrac_jobs: IP list file not found: data/server_list/idrac_ip_list.txt -2025-11-28 15:22:02,900 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:02] "GET /jobs/iplist HTTP/1.1" 200 - -2025-11-28 15:22:04,264 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:22:06,057 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /xml_management HTTP/1.1" 200 - -2025-11-28 15:22:06,070 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:22:06,076 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /static/css/scp.css HTTP/1.1" 304 - -2025-11-28 15:22:06,076 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:06] "GET /static/js/scp.js HTTP/1.1" 304 - -2025-11-28 15:22:14,492 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:22:24,718 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:22:25,589 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:25] "GET /edit_xml/LinePlus_T1.xml HTTP/1.1" 200 - -2025-11-28 15:22:25,607 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:25] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:22:29,679 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /xml_management HTTP/1.1" 200 - -2025-11-28 15:22:29,692 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /static/style.css HTTP/1.1" 304 - -2025-11-28 15:22:29,696 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /static/css/scp.css HTTP/1.1" 304 - -2025-11-28 15:22:29,696 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 15:22:29] "GET /static/js/scp.js HTTP/1.1" 304 - -2025-11-28 15:22:34,945 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 15:22:45,172 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" -2025-11-28 18:18:06,930 [INFO] root: Logger initialized | level=INFO | file=D:\Code\iDRAC_Info\idrac_info\data\logs\app.log -2025-11-28 18:18:06,953 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db -2025-11-28 18:18:06,953 [INFO] app: DB URI = sqlite:///D:/Code/iDRAC_Info/idrac_info/backend/instance/site.db -2025-11-28 18:18:06,972 [INFO] backend.routes.jobs: Jobs routes registered at /jobs -2025-11-28 18:18:06,985 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) -2025-11-28 18:18:06,985 [INFO] app: 🤖 텔레그램 봇 폴링 스레드 생성됨 (중복 방지 플래그 적용) -2025-11-28 18:18:06,985 [INFO] app: Starting polling for bot: admin_bot (ID: 1) -2025-11-28 18:18:06,985 [INFO] app: Starting polling for bot: admin_bot (ID: 1) -2025-11-28 18:18:07,024 [INFO] werkzeug: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://192.168.0.122:5000 -2025-11-28 18:18:07,024 [INFO] werkzeug: Press CTRL+C to quit -2025-11-28 18:18:08,082 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" -2025-11-28 18:18:08,314 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" -2025-11-28 18:18:08,315 [INFO] telegram.ext.Application: Application started -2025-11-28 18:18:11,284 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 18:18:11] "GET / HTTP/1.1" 302 - -2025-11-28 18:18:11,304 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 18:18:11] "GET /login?next=/ HTTP/1.1" 200 - -2025-11-28 18:18:11,334 [INFO] werkzeug: 127.0.0.1 - - [28/Nov/2025 18:18:11] "GET /static/style.css HTTP/1.1" 304 - +2025-11-29 08:14:35,856 [INFO] werkzeug: Press CTRL+C to quit +2025-11-29 08:14:36,951 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getMe "HTTP/1.1 200 OK" +2025-11-29 08:14:37,184 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/deleteWebhook "HTTP/1.1 200 OK" +2025-11-29 08:14:37,185 [INFO] telegram.ext.Application: Application started +2025-11-29 08:14:38,056 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:38] "GET / HTTP/1.1" 302 - +2025-11-29 08:14:38,088 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:38] "GET /login?next=/ HTTP/1.1" 200 - +2025-11-29 08:14:38,346 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:38] "GET /static/style.css HTTP/1.1" 200 - +2025-11-29 08:14:38,694 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:38] "GET /static/favicon.ico HTTP/1.1" 200 - +2025-11-29 08:14:43,883 [INFO] app: LOGIN: form ok email=ganghee@zespro.co.kr +2025-11-29 08:14:43,883 [INFO] app: LOGIN: form ok email=ganghee@zespro.co.kr +2025-11-29 08:14:43,954 [INFO] app: LOGIN: found id=1 active=True approved=True pass_ok=True +2025-11-29 08:14:43,954 [INFO] app: LOGIN: found id=1 active=True approved=True pass_ok=True +2025-11-29 08:14:43,955 [INFO] app: LOGIN: SUCCESS → redirect +2025-11-29 08:14:43,955 [INFO] app: LOGIN: SUCCESS → redirect +2025-11-29 08:14:43,956 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:43] "POST /login HTTP/1.1" 302 - +2025-11-29 08:14:44,191 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:44] "GET /index HTTP/1.1" 200 - +2025-11-29 08:14:44,517 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:44] "GET /static/style.css HTTP/1.1" 304 - +2025-11-29 08:14:44,522 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:44] "GET /static/css/index.css HTTP/1.1" 200 - +2025-11-29 08:14:44,525 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:44] "GET /static/script.js HTTP/1.1" 200 - +2025-11-29 08:14:44,529 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:44] "GET /static/js/index.js HTTP/1.1" 200 - +2025-11-29 08:14:45,195 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/sendMessage "HTTP/1.1 200 OK" +2025-11-29 08:14:47,867 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:14:49,161 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:49] "GET /idrac HTTP/1.1" 308 - +2025-11-29 08:14:49,475 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:49] "GET /idrac/ HTTP/1.1" 200 - +2025-11-29 08:14:49,797 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:49] "GET /static/css/idrac_style.css HTTP/1.1" 200 - +2025-11-29 08:14:49,798 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:49] "GET /static/js/idrac_main.js HTTP/1.1" 200 - +2025-11-29 08:14:50,054 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "GET /socket.io/?EIO=4&transport=polling&t=PhClt5V HTTP/1.1" 200 - +2025-11-29 08:14:50,136 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "POST /socket.io/?EIO=4&transport=polling&t=PhClt98&sid=ybpAZIBf9CdxVyJIAAAA HTTP/1.1" 200 - +2025-11-29 08:14:50,139 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "GET /idrac/api/groups HTTP/1.1" 200 - +2025-11-29 08:14:50,140 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "GET /favicon.ico HTTP/1.1" 404 - +2025-11-29 08:14:50,142 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "GET /idrac/api/servers HTTP/1.1" 200 - +2025-11-29 08:14:50,367 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "GET /socket.io/?EIO=4&transport=polling&t=PhClt99&sid=ybpAZIBf9CdxVyJIAAAA HTTP/1.1" 200 - +2025-11-29 08:14:50,372 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:50] "GET /socket.io/?EIO=4&transport=polling&t=PhCltE3&sid=ybpAZIBf9CdxVyJIAAAA HTTP/1.1" 200 - +2025-11-29 08:14:55,662 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:14:55] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 08:14:58,093 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:15:06,515 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:15:06] "POST /catalog/sync HTTP/1.1" 200 - +2025-11-29 08:15:08,327 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:15:13,235 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:15:13] "POST /catalog/sync HTTP/1.1" 200 - +2025-11-29 08:15:18,557 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:15:20,040 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:15:20] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 08:15:28,783 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:15:28,937 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:15:28] "POST /catalog/sync HTTP/1.1" 200 - +2025-11-29 08:15:34,670 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:15:34] "POST /catalog/sync HTTP/1.1" 200 - +2025-11-29 08:15:39,011 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:15:49,239 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:15:59,473 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:16:09,699 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:16:19,927 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:16:30,154 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:16:40,381 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:16:50,615 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:17:00,843 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:17:02,435 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:02] "GET /socket.io/?EIO=4&transport=websocket&sid=ybpAZIBf9CdxVyJIAAAA HTTP/1.1" 200 - +2025-11-29 08:17:02,757 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:02] "GET /index HTTP/1.1" 200 - +2025-11-29 08:17:02,776 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:02] "GET /static/style.css HTTP/1.1" 304 - +2025-11-29 08:17:03,002 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /static/css/index.css HTTP/1.1" 304 - +2025-11-29 08:17:03,082 [INFO] app: LOGIN: already auth → /index +2025-11-29 08:17:03,082 [INFO] app: LOGIN: already auth → /index +2025-11-29 08:17:03,082 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /login?next=/ HTTP/1.1" 302 - +2025-11-29 08:17:03,083 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /static/js/index.js HTTP/1.1" 304 - +2025-11-29 08:17:03,191 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /index HTTP/1.1" 200 - +2025-11-29 08:17:03,390 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /static/style.css HTTP/1.1" 304 - +2025-11-29 08:17:03,515 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /static/js/index.js HTTP/1.1" 304 - +2025-11-29 08:17:03,516 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /static/script.js HTTP/1.1" 200 - +2025-11-29 08:17:03,517 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:17:03] "GET /static/css/index.css HTTP/1.1" 304 - +2025-11-29 08:17:11,069 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:17:21,296 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:17:31,524 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:17:41,752 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:17:51,985 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:18:02,214 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:18:12,440 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:18:22,665 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:18:32,897 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:18:43,122 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:18:53,349 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:03,575 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:13,803 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:24,030 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:34,258 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:44,487 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:54,717 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:19:58,781 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:58] "GET /idrac HTTP/1.1" 308 - +2025-11-29 08:19:58,783 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:58] "GET /idrac/ HTTP/1.1" 200 - +2025-11-29 08:19:59,032 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /static/css/idrac_style.css HTTP/1.1" 304 - +2025-11-29 08:19:59,107 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /static/js/idrac_main.js HTTP/1.1" 304 - +2025-11-29 08:19:59,421 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /idrac/api/groups HTTP/1.1" 200 - +2025-11-29 08:19:59,421 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /socket.io/?EIO=4&transport=polling&t=PhCn2c6 HTTP/1.1" 200 - +2025-11-29 08:19:59,422 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /idrac/api/servers HTTP/1.1" 200 - +2025-11-29 08:19:59,683 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "POST /socket.io/?EIO=4&transport=polling&t=PhCn2h1&sid=2pMufQvxsqmN2V1_AAAC HTTP/1.1" 200 - +2025-11-29 08:19:59,728 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /socket.io/?EIO=4&transport=polling&t=PhCn2h2&sid=2pMufQvxsqmN2V1_AAAC HTTP/1.1" 200 - +2025-11-29 08:19:59,731 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:19:59] "GET /socket.io/?EIO=4&transport=polling&t=PhCn2lp&sid=2pMufQvxsqmN2V1_AAAC HTTP/1.1" 200 - +2025-11-29 08:20:00,769 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:20:00] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 08:20:04,945 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:20:15,177 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:20:25,403 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:20:35,632 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:20:45,864 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:20:56,090 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:21:06,318 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:21:16,543 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:21:26,770 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:21:36,999 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:21:47,226 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:21:57,452 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:22:07,684 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:22:17,910 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:22:28,138 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:22:38,367 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:22:48,595 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:22:58,821 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:23:09,047 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:23:19,273 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:23:29,500 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:23:39,735 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:23:49,961 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:24:00,192 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:24:10,417 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:24:20,646 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:24:30,873 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:24:41,103 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:24:51,330 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:25:01,559 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:25:11,790 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:25:22,018 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:25:32,246 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:25:42,473 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:25:52,705 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:26:02,931 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:26:13,187 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:26:23,415 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:26:33,648 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:26:43,874 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:26:54,100 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:27:04,325 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:27:14,551 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:27:24,777 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:27:35,003 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:27:45,231 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:27:55,457 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:28:05,685 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:28:15,911 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:28:26,138 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:28:36,363 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:28:46,594 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:28:56,820 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:29:07,047 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:29:17,276 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:29:27,503 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:29:37,731 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:29:47,957 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:29:58,191 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:30:02,765 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 08:30:02] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 08:30:08,423 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:30:18,651 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:30:28,878 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:30:39,106 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:30:49,332 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:30:59,559 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:31:09,787 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:31:20,014 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:31:30,240 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:31:40,465 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:31:51,174 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:32:01,407 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:32:11,642 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:32:21,877 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:32:32,111 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:32:42,345 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:32:52,577 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:33:02,812 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:33:13,045 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:33:23,280 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:33:33,516 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:33:43,749 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:33:53,983 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:34:04,216 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:34:14,449 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:34:24,682 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:34:34,916 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:34:45,150 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:34:55,385 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:35:05,621 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:35:15,853 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:35:26,087 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:35:36,321 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:35:46,554 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:35:56,788 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:36:07,023 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:36:17,255 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:36:27,488 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:36:37,721 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:36:47,957 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:36:58,191 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:37:08,430 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:37:18,665 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:37:28,899 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:37:39,149 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:37:49,392 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:37:59,628 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:38:09,861 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:38:20,093 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:38:30,329 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:38:40,563 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:38:50,800 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:39:01,033 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:39:11,270 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:39:21,504 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:39:31,738 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:39:41,972 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:39:52,206 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:40:02,440 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:40:12,673 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:40:22,908 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:40:33,144 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:40:43,379 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:40:53,613 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:41:03,847 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:41:14,080 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:41:24,344 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:41:34,578 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:41:44,811 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:41:55,043 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:42:05,277 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:42:15,512 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:42:25,750 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:42:35,985 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:42:46,218 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:42:56,453 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:43:06,688 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:43:16,922 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:43:27,155 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:43:37,387 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:43:47,621 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:43:57,855 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:44:08,089 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:44:18,322 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:44:28,558 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:44:38,791 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:44:49,028 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:44:59,263 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:45:09,502 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:45:19,736 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:45:29,970 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:45:40,205 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:45:50,438 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:46:00,670 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:46:10,903 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:46:21,137 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:46:31,370 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:46:41,623 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:46:51,857 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:47:02,090 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:47:12,331 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:47:22,565 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:47:32,798 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:47:43,033 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:47:53,269 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:48:03,502 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:48:13,738 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:48:23,972 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:48:34,207 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:48:44,441 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:48:55,138 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:49:05,370 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:49:15,600 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:49:25,831 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:49:36,063 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:49:46,293 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:49:56,524 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:50:06,756 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:50:16,990 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:50:27,219 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:50:37,450 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:50:47,679 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:50:57,912 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:51:08,143 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:51:18,374 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:51:28,606 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:51:38,837 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:51:49,067 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:51:59,297 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:52:09,529 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:52:19,759 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:52:29,991 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:52:40,221 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:52:50,451 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:53:00,680 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:53:10,913 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:53:21,144 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:53:31,376 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:53:41,606 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:53:51,836 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:54:02,066 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:54:12,297 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:54:22,528 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:54:32,759 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:54:42,991 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:54:53,222 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:55:03,452 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:55:13,683 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:55:23,914 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:55:34,145 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:55:44,377 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:55:54,607 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:56:04,839 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:56:15,070 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:56:25,301 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:56:35,532 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:56:45,763 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:56:55,995 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:57:06,224 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:57:16,456 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:57:26,708 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:57:36,938 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:57:47,169 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:57:57,400 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:58:07,631 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:58:17,861 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:58:28,093 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:58:38,324 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:58:48,555 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:58:58,785 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:59:09,016 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:59:19,246 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:59:29,478 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:59:39,709 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 08:59:49,939 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:00:00,169 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:00:10,400 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:00:20,630 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:00:30,863 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:00:41,094 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:00:51,324 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:01:01,554 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:01:11,785 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:01:22,016 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:01:32,246 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:01:42,477 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:01:52,708 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:02:02,938 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:02:13,169 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:02:23,400 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:02:33,653 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:02:43,885 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:02:54,115 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:03:04,348 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:03:14,583 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:03:24,813 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:03:35,043 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:03:45,273 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:03:55,505 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:04:05,736 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:04:15,969 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:04:26,200 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:04:36,429 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:04:46,659 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:04:56,899 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:05:07,130 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:05:17,362 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:05:27,593 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:05:37,824 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:05:48,055 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:05:58,746 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:06:08,975 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:06:19,203 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:06:29,433 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:06:39,662 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:06:49,891 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:07:00,120 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:07:10,348 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:07:20,577 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:07:30,807 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:07:41,036 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:07:51,266 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:08:01,495 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:08:11,725 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:08:21,954 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:08:32,184 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:08:42,414 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:08:52,644 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:09:02,873 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:09:13,102 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:09:23,339 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:09:33,567 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:09:43,796 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:09:54,025 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:10:04,255 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:10:14,485 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:10:24,714 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:10:34,948 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:10:45,179 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:10:55,409 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:11:05,638 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:11:15,867 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:11:26,097 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:11:36,327 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:11:46,557 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:11:56,788 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:12:07,017 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:12:17,247 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:12:27,477 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:12:37,706 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:12:47,935 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:12:58,165 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:13:08,394 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:13:18,624 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:13:28,853 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:13:39,082 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:13:49,315 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:13:59,543 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:14:09,772 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:14:20,002 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:14:30,230 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:14:40,460 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:14:50,689 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:15:00,918 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:15:11,147 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:15:21,376 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:15:31,605 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:15:41,834 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:15:52,063 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:16:02,294 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:16:12,523 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:16:22,753 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:16:32,982 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:16:43,212 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:16:53,442 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:17:03,671 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:17:13,901 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:17:24,129 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:17:34,359 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:17:44,587 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:17:54,818 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:18:05,047 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:18:15,276 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:18:25,505 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:18:35,735 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:18:45,964 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:18:56,193 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:19:06,422 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:19:16,652 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:19:26,880 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:19:37,109 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:19:47,339 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:19:57,568 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:20:07,798 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:20:18,028 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK" +2025-11-29 09:20:21,965 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 09:20:21] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 09:20:22,683 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 09:20:22] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 09:20:24,123 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 09:20:24] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 09:20:24,715 [INFO] werkzeug: 127.0.0.1 - - [29/Nov/2025 09:20:24] "GET /idrac/api/firmware-versions HTTP/1.1" 200 - +2025-11-29 09:20:28,257 [INFO] httpx: HTTP Request: POST https://api.telegram.org/bot6719918880:AAHC1on-KlzH0G3ylJP57p-q5qMyorFUGZo/getUpdates "HTTP/1.1 200 OK"