Extracts the docker-exec-with-base64-stdin pattern out of canary/planter and orchestrator/drivers/ssh into a shared decnet.decky_io package. Both consumers now delegate; the canary planter test still proves the contract end-to-end. Adds POST/DELETE /api/v1/deckies/files for arbitrary file drops. Container resolution is shared with the canary path: topology_id absent means fleet (<name>-ssh), present routes through resolve_decky_container which picks <name>-ssh when the topology decky exposes ssh, else the topology base container decnet_t_<id8>_<name>. Path validation rejects relative paths and '..' traversal at the request model layer. Bad base64 → 400; unknown topology → 404; decky not in topology → 422; docker exec failure → 409.
40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
"""Shared primitives for writing/deleting files inside running deckies.
|
|
|
|
The canary planter and the orchestrator SSH driver both need to drop
|
|
bytes into a decky container's filesystem, then sometimes unlink them.
|
|
The ARG_MAX-safe ``base64 -d``-via-stdin trick lived in two places
|
|
before this module existed.
|
|
|
|
Public API:
|
|
|
|
* :func:`write_file_to_container` — write bytes at a path, set mode,
|
|
optionally backdate mtime.
|
|
* :func:`delete_file_from_container` — best-effort ``rm -f``.
|
|
* :func:`resolve_topology_container` — pick the right docker container
|
|
for a MazeNET decky based on its services list.
|
|
* :func:`resolve_decky_container` — async helper that takes
|
|
``(decky_name, topology_id?)``, hydrates the topology when needed,
|
|
and returns the docker container name.
|
|
|
|
Container resolution conventions are documented in
|
|
:mod:`decnet.topology.compose`; we mirror them here without taking
|
|
a runtime dependency on the compose generator.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from .resolve import (
|
|
resolve_decky_container,
|
|
resolve_topology_container,
|
|
)
|
|
from .write import (
|
|
delete_file_from_container,
|
|
write_file_to_container,
|
|
)
|
|
|
|
__all__ = [
|
|
"delete_file_from_container",
|
|
"resolve_decky_container",
|
|
"resolve_topology_container",
|
|
"write_file_to_container",
|
|
]
|