update agent

This commit is contained in:
2026-07-17 15:41:05 +07:00
parent 13bea66473
commit 476c41cf08
15 changed files with 467 additions and 20 deletions

View File

@@ -10,7 +10,7 @@ from app.core.checksum import sha256_file
from app.core.command_runner import CommandRunner
from app.core.downloader import Downloader
from app.core.docker_installer import DockerInstaller, image_reference
from app.core.installer import DebInstaller
from app.core.installer import AptInstaller, DebInstaller
from app.core.manifest_client import ManifestClient
from app.core.manifest_validator import ManifestValidator
from app.core.service_manager import ServiceManager
@@ -86,7 +86,7 @@ class TaskRunner:
ordered = sorted(components, key=lambda item: item["install_order"], reverse=True)
total = len(ordered)
removed_deb_package = False
removed_apt_package = False
for index, component in enumerate(ordered, start=1):
progress = int((index - 1) / total * 80) + 10
component_id = component["component_id"]
@@ -103,13 +103,14 @@ class TaskRunner:
self._best_effort(task_id, f"disable service {service_name}", lambda: services.disable_service(service_name))
package_name = component.get("package_name")
if component["type"] == "deb" and package_name:
if component["type"] in {"deb", "apt"} and package_name:
self.repository.add_log(task_id, "info", f"Removing package {package_name}")
installer.remove_package(package_name, purge=effective_purge)
self._clean_cached_package_files(task_id, package_name, component_id)
if component["type"] == "deb":
self._clean_cached_package_files(task_id, package_name, component_id)
if service_name:
self._best_effort(task_id, f"reset failed state for {service_name}", lambda: services.reset_failed(service_name))
removed_deb_package = True
removed_apt_package = True
elif component["type"] == "docker":
container_name = component.get("container_name") or component_id
self.repository.add_log(task_id, "info", f"Removing Docker container {container_name}")
@@ -127,7 +128,7 @@ class TaskRunner:
else:
raise ValueError(f"Unsupported installed component type: {component['type']}")
if removed_deb_package:
if removed_apt_package:
self.repository.update_task(task_id, progress=92, current_step="cleaning package leftovers")
self._best_effort(
task_id,
@@ -210,6 +211,8 @@ class TaskRunner:
if component["type"] == "deb":
self._install_deb_component(task_id, manifest["appId"], component)
elif component["type"] == "apt":
self._install_apt_component(task_id, manifest["appId"], component)
elif component["type"] == "docker":
self._install_docker_component(task_id, manifest["appId"], component)
else:
@@ -286,6 +289,73 @@ class TaskRunner:
self.repository.upsert_installed_component(app_id, component)
def _install_apt_component(self, task_id: str, app_id: str, component: dict[str, Any]) -> None:
component_id = component["componentId"]
package_name = component["packageName"]
command_runner = CommandRunner(self.repository, task_id)
installer = AptInstaller(command_runner)
services = ServiceManager(command_runner)
self.repository.update_task_component(
task_id,
component_id,
progress=10,
current_step="refreshing APT package index",
)
self.repository.add_log(task_id, "info", "Refreshing APT package index")
installer.update_package_index()
self.repository.update_task_component(
task_id,
component_id,
progress=35,
current_step=f"installing APT package {package_name}",
)
self.repository.add_log(task_id, "info", f"Installing trusted APT package {package_name}")
installer.install_package(package_name)
self.repository.update_task_component(
task_id,
component_id,
progress=70,
current_step="verifying installed package",
)
installed_version = installer.get_package_version(package_name)
if not installed_version:
raise RuntimeError(f"APT package was not installed: {package_name}")
self.repository.add_log(
task_id,
"info",
f"APT package {package_name} installed with version {installed_version}",
)
installed_component = dict(component)
installed_component["version"] = installed_version
if package_name == "postgresql":
service_name = "postgresql.service"
self.repository.update_task_component(
task_id,
component_id,
progress=85,
current_step="starting PostgreSQL service",
)
services.enable_service(service_name)
services.start_service(service_name)
services.assert_service_active(service_name)
self.repository.update_task_component(
task_id,
component_id,
progress=95,
current_step="checking PostgreSQL readiness",
)
installer.wait_for_postgresql()
self.repository.add_log(task_id, "info", "PostgreSQL service is active and accepting connections")
installed_component["serviceName"] = service_name
self.repository.upsert_installed_component(app_id, installed_component)
def _install_docker_component(self, task_id: str, app_id: str, component: dict[str, Any]) -> None:
component_id = component["componentId"]
container_name = component["containerName"]