/
HookDev-Arch
/
ServerMonitor
Обзор
Документация
Войти
/
HookDev-Arch
/
ServerMonitor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
2
CI/CD
Аналитика
Безопасность
master
core/version_check.py
185 строк
10 KB
HookDev-Arch
upload files
09 окт 2025, 02:25
09 окт 2025, 02:25
8bd6873
Код
Авторство
О чём код?
import requests import json from datetime import datetime from typing import Optional, Dict, Any # ВНИМАНИЕ: Модуль проверки версий временно отключен # Причина: GitVerse API недоступен, веб-скрапинг дает ложные результаты # Для включения: раскомментируйте вызов print_version_check() в monitor_v3_base.py class VersionChecker: """Класс для проверки актуальности версии проекта""" def __init__(self, current_version: str, repo_url: str = "https://gitverse.ru/HookDev-Arch/ServerMonitor"): self.current_version = current_version self.repo_url = repo_url self.api_base = "https://gitverse.ru/api/v1" def get_latest_commit_info(self) -> Optional[Dict[str, Any]]: """Получает информацию о последнем коммите из репозитория""" try: # Попытка получить информацию через GitVerse API # Формат: https://gitverse.ru/api/v1/repos/{owner}/{repo}/commits repo_parts = self.repo_url.replace("https://gitverse.ru/", "").split("/") if len(repo_parts) >= 2: owner, repo = repo_parts[0], repo_parts[1] # Пробуем разные варианты API endpoints api_urls = [ f"{self.api_base}/repos/{owner}/{repo}/commits", f"https://gitverse.ru/{owner}/{repo}/commits", f"https://gitverse.ru/api/v1/repos/{owner}/{repo}/commits" ] for api_url in api_urls: try: print(f"[API] Попытка подключения к: {api_url}") response = requests.get(api_url, timeout=10, headers={ 'User-Agent': 'HookDev-Arch-Dashboard/3.1.2' }) if response.status_code == 200: commits = response.json() if commits and len(commits) > 0: print(f"[OK] Успешно получена информация о коммитах") return commits[0] # Последний коммит else: print(f"[ERROR] HTTP {response.status_code}: {response.text[:100]}") except requests.exceptions.RequestException as e: print(f"[ERROR] Ошибка запроса к {api_url}: {e}") continue except Exception as e: print(f"[ERROR] Общая ошибка при получении информации о коммитах: {e}") return None def get_latest_commit_from_web(self) -> Optional[Dict[str, Any]]: """Альтернативный способ получения информации о коммитах через веб-скрапинг""" try: print("[WEB] Попытка получения информации через веб-страницу...") response = requests.get(self.repo_url, timeout=10, headers={ 'User-Agent': 'HookDev-Arch-Dashboard/3.1.2' }) if response.status_code == 200: # Ищем информацию о последнем коммите в HTML content = response.text # Ищем паттерны коммитов в HTML import re # Паттерн для поиска хеша коммита commit_pattern = r'([a-f0-9]{7,8})' commits = re.findall(commit_pattern, content) if commits: latest_hash = commits[0] # Первый найденный хеш print(f"[OK] Найден хеш коммита: {latest_hash}") return { "sha": latest_hash, "commit": { "message": "Последний коммит", "author": {"name": "Unknown", "date": ""} } } except Exception as e: print(f"[ERROR] Ошибка веб-скрапинга: {e}") return None def get_commit_hash_from_version(self) -> Optional[str]: """Пытается получить хеш коммита из версии (если версия содержит хеш)""" # Если версия содержит хеш коммита (например, "3.2.5-1f705c8") if "-" in self.current_version: return self.current_version.split("-")[-1] return None def compare_versions(self) -> Dict[str, Any]: """Сравнивает текущую версию с последним коммитом""" result = { "current_version": self.current_version, "is_up_to_date": True, "latest_commit": None, "update_available": False, "message": "Версия актуальна" } try: # Сначала пробуем API latest_commit = self.get_latest_commit_info() # Если API не сработал, пробуем веб-скрапинг if not latest_commit: latest_commit = self.get_latest_commit_from_web() if latest_commit: result["latest_commit"] = { "hash": latest_commit.get("sha", "")[:8], # Короткий хеш "message": latest_commit.get("commit", {}).get("message", ""), "date": latest_commit.get("commit", {}).get("author", {}).get("date", ""), "author": latest_commit.get("commit", {}).get("author", {}).get("name", "") } # Проверяем, есть ли обновления current_hash = self.get_commit_hash_from_version() latest_hash = latest_commit.get("sha", "")[:8] if current_hash and latest_hash and current_hash != latest_hash: result["update_available"] = True result["is_up_to_date"] = False result["message"] = f"[UPDATE] Доступно обновление! Текущий: {current_hash}, Последний: {latest_hash}" elif current_hash and latest_hash and current_hash == latest_hash: result["message"] = f"[OK] Версия актуальна (коммит {current_hash})" elif not current_hash: # Если в версии нет хеша, считаем что может быть обновление result["message"] = f"[INFO] Последний коммит: {latest_hash}" result["update_available"] = True result["is_up_to_date"] = False else: result["message"] = "[WARN] Не удалось проверить обновления" result["is_up_to_date"] = None except Exception as e: result["message"] = f"[ERROR] Ошибка проверки версии: {e}" result["is_up_to_date"] = None return result def print_version_info(self): """Выводит информацию о версии в консоль""" print(f"[INFO] Проверка версии {self.current_version}...") version_info = self.compare_versions() if version_info["is_up_to_date"] is True: print(f"[OK] {version_info['message']}") elif version_info["is_up_to_date"] is False: print(f"[UPDATE] {version_info['message']}") if version_info["latest_commit"]: commit = version_info["latest_commit"] print(f" [COMMIT] Последний коммит: {commit['hash']}") print(f" [AUTHOR] Автор: {commit['author']}") print(f" [DATE] Дата: {commit['date']}") print(f" [MSG] Сообщение: {commit['message'][:50]}...") else: print(f"[WARN] {version_info['message']}") if version_info["update_available"]: print(f"[REPO] Репозиторий: {self.repo_url}") print("[TIP] Для обновления выполните: git pull origin master") def check_version(current_version: str, repo_url: str = "https://gitverse.ru/HookDev-Arch/ServerMonitor") -> Dict[str, Any]: """Быстрая функция для проверки версии""" checker = VersionChecker(current_version, repo_url) return checker.compare_versions() def print_version_check(current_version: str, repo_url: str = "https://gitverse.ru/HookDev-Arch/ServerMonitor"): """Быстрая функция для вывода информации о версии""" checker = VersionChecker(current_version, repo_url) checker.print_version_info()