добавила PackageManager с базовой установкой
This commit is contained in:
71
mypkg/core/package_manager.py
Normal file
71
mypkg/core/package_manager.py
Normal file
@@ -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())
|
||||||
Reference in New Issue
Block a user