From ea216cfd70e81823cf7ed444b7ea82853c979658 Mon Sep 17 00:00:00 2001 From: 24_ChernovaSS <24_ChernovaSS@iux.local> Date: Tue, 31 Mar 2026 23:58:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B0=20PackageManager=20=D1=81=20=D0=B1=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mypkg/core/package_manager.py | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 mypkg/core/package_manager.py diff --git a/mypkg/core/package_manager.py b/mypkg/core/package_manager.py new file mode 100644 index 0000000..93a3f32 --- /dev/null +++ b/mypkg/core/package_manager.py @@ -0,0 +1,71 @@ +# mypkg/core/package_manager.py +import json +import os +import shutil +from typing import List, Optional +from ..models.package import Package +from ..database.db_manager import DatabaseManager + + +class PackageManager: + """Главный класс менеджера пакетов (прототип)""" + + def __init__(self, repo_path: str = "repo", root: str = "/"): + """ + Args: + repo_path: путь к репозиторию (папка с пакетами) + root: корень файловой системы (для песочницы) + """ + self.repo_path = repo_path + self.root = root + self.db = DatabaseManager(root) + + def install(self, package_name: str) -> bool: + """Устанавливает пакет""" + print(f"🔧 Поиск пакета {package_name}...") + + # Ищем meta.json пакета + meta_path = os.path.join(self.repo_path, "packages", package_name, "meta.json") + + if not os.path.exists(meta_path): + print(f"❌ Пакет {package_name} не найден в репозитории") + return False + + with open(meta_path, 'r') as f: + pkg_data = json.load(f) + + pkg = Package(**pkg_data) + + # Проверяем, не установлен ли уже + if self.db.is_installed(package_name): + print(f"ℹ️ Пакет {package_name} уже установлен") + return True + + print(f"📦 Установка {pkg.full_name()}...") + + # Копируем файлы + source_dir = os.path.join(self.repo_path, "packages", package_name, "files") + + for file_info in pkg.files: + src = os.path.join(source_dir, file_info["source"]) + dst = os.path.join(self.root, file_info["destination"].lstrip("/")) + + # Создаем папку назначения, если ее нет + os.makedirs(os.path.dirname(dst), exist_ok=True) + + # Копируем файл + shutil.copy2(src, dst) + + # Устанавливаем права доступа, если указаны + if "permissions" in file_info: + os.chmod(dst, file_info["permissions"]) + + # Сохраняем в базу + self.db.add_package(pkg) + + print(f"✅ Пакет {package_name} успешно установлен") + return True + + def list_installed(self) -> List[Package]: + """Возвращает список установленных пакетов""" + return list(self.db.installed.values()) \ No newline at end of file