Sunil Mohan Adapa 5b0d980035
container: Add component for managing containers using podman
Tests:

- Unit tests work.

- Enabling/disabling an app works.

- Developer documentation shows the Container in reference section.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2025-05-30 15:14:12 -04:00

79 lines
2.8 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""Handle container run using podman."""
from plinth import action_utils
from plinth import app as app_module
from plinth import module_loader
from plinth.actions import privileged
@privileged
def container_is_enabled(container: str) -> bool:
"""Return whether a container is enabled."""
_assert_container_is_managed(container)
return action_utils.podman_is_enabled(container)
@privileged
def container_enable(container: str):
"""Enable a container so that it start on system boot."""
_assert_container_is_managed(container)
action_utils.podman_enable(container)
action_utils.service_enable(container)
@privileged
def container_disable(container: str):
"""Disable a container so that it does not start on system boot."""
_assert_container_is_managed(container)
action_utils.service_disable(container)
action_utils.podman_disable(container)
@privileged
def container_setup(container: str, image_name: str, volume_name: str,
volume_path: str, volumes: dict[str, str] | None = None,
env: dict[str, str] | None = None,
binds_to: list[str] | None = None,
devices: dict[str, str] | None = None):
"""Remove and recreate the podman container."""
_assert_container_is_managed(container)
action_utils.podman_create(container, image_name, volume_name, volume_path,
volumes, env, binds_to, devices)
action_utils.service_start(container, check=True)
@privileged
def container_uninstall(container: str, image_name: str, volume_name: str,
volume_path: str):
"""Remove podman container."""
action_utils.podman_uninstall(container_name=container,
image_name=image_name,
volume_name=volume_name,
volume_path=volume_path)
def _get_managed_containers() -> set[str]:
"""Get a set of all containers managed by FreedomBox."""
from plinth.container import Container
containers = set()
module_loader.load_modules()
app_module.apps_init()
for app in app_module.App.list():
components = app.get_components_of_type(Container)
for component in components:
containers.add(component.name)
return containers
def _assert_container_is_managed(container_name):
"""Check that container is managed by one of the FreedomBox apps."""
managed_containers = _get_managed_containers()
if container_name not in managed_containers:
msg = ("The container '%s' is not managed by FreedomBox. Access is "
"only permitted for containers listed in the Container "
"components of any FreedomBox app.") % container_name
raise ValueError(msg)