16 changed files with 389 additions and 55 deletions
@ -0,0 +1,58 @@ |
|||||||
|
#!/usr/bin/env python3 |
||||||
|
"""Remove Argos dirs under /argos that are not needed for LT_LOAD_ONLY (host mounts this to .../share/argos-translate).""" |
||||||
|
import os |
||||||
|
import re |
||||||
|
import shutil |
||||||
|
import sys |
||||||
|
|
||||||
|
DEFAULT = "en,de,es,fr,it,pt,ru,zh,ja,ar" |
||||||
|
allowed = set(os.environ.get("LT_LOAD_ONLY", DEFAULT).replace(" ", "").split(",")) |
||||||
|
if not allowed or allowed == {""}: |
||||||
|
print("LT_LOAD_ONLY empty", file=sys.stderr) |
||||||
|
sys.exit(1) |
||||||
|
|
||||||
|
argos = os.environ.get("ARGOS_ROOT", "/argos") |
||||||
|
pkgs = os.path.join(argos, "packages") |
||||||
|
msbd = os.path.join(argos, "minisbd") |
||||||
|
|
||||||
|
|
||||||
|
def pair_from_dirname(name: str) -> tuple[str, str] | None: |
||||||
|
m = re.match(r"^([a-z]{2})_([a-z]{2})$", name) |
||||||
|
if m: |
||||||
|
return m.group(1), m.group(2) |
||||||
|
m = re.match(r"^translate-([a-z]{2})_([a-z]{2})-", name) |
||||||
|
if m: |
||||||
|
return m.group(1), m.group(2) |
||||||
|
return None |
||||||
|
|
||||||
|
|
||||||
|
removed = 0 |
||||||
|
if os.path.isdir(pkgs): |
||||||
|
for name in sorted(os.listdir(pkgs)): |
||||||
|
path = os.path.join(pkgs, name) |
||||||
|
if not os.path.isdir(path): |
||||||
|
continue |
||||||
|
p = pair_from_dirname(name) |
||||||
|
if p is None: |
||||||
|
print(f"skip (unrecognized name): {name}") |
||||||
|
continue |
||||||
|
f, t = p |
||||||
|
if f in allowed and t in allowed: |
||||||
|
continue |
||||||
|
print(f"remove package: {name}") |
||||||
|
shutil.rmtree(path) |
||||||
|
removed += 1 |
||||||
|
|
||||||
|
if os.path.isdir(msbd): |
||||||
|
for fn in sorted(os.listdir(msbd)): |
||||||
|
if not fn.endswith(".onnx"): |
||||||
|
continue |
||||||
|
code = fn[:-5] |
||||||
|
if code in allowed: |
||||||
|
continue |
||||||
|
p = os.path.join(msbd, fn) |
||||||
|
print(f"remove minisbd: {fn}") |
||||||
|
os.remove(p) |
||||||
|
removed += 1 |
||||||
|
|
||||||
|
print(f"done ({removed} removed)") |
||||||
@ -0,0 +1,40 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
# Drop Argos packages / MiniSBD files not in LT_LOAD_ONLY (default matches docker-compose libretranslate). |
||||||
|
# Stops LibreTranslate briefly so files are not in use; uses Docker+Alpine to delete UID-1032-owned trees. |
||||||
|
set -euo pipefail |
||||||
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)" |
||||||
|
ARGOS="$ROOT/.local-libretranslate/share/argos-translate" |
||||||
|
LT_LOAD_ONLY="${LT_LOAD_ONLY:-en,de,es,fr,it,pt,ru,zh,ja,ar}" |
||||||
|
|
||||||
|
if [[ ! -d "$ARGOS/packages" ]]; then |
||||||
|
echo "Nothing to prune (missing $ARGOS/packages)." >&2 |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
running="" |
||||||
|
for n in jumble-libretranslate imwald-libretranslate; do |
||||||
|
if docker inspect -f '{{.State.Running}}' "$n" &>/dev/null; then |
||||||
|
if [[ $(docker inspect -f '{{.State.Running}}' "$n") == "true" ]]; then |
||||||
|
running="$n" |
||||||
|
break |
||||||
|
fi |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
if [[ -n "$running" ]]; then |
||||||
|
echo "Stopping $running ..." |
||||||
|
docker stop "$running" >/dev/null |
||||||
|
fi |
||||||
|
|
||||||
|
docker run --rm \ |
||||||
|
-e LT_LOAD_ONLY="$LT_LOAD_ONLY" \ |
||||||
|
-e ARGOS_ROOT=/argos \ |
||||||
|
-v "$ARGOS:/argos:rw" \ |
||||||
|
-v "$ROOT/scripts/prune-libretranslate-packages.py:/prune.py:ro" \ |
||||||
|
alpine:3.20 \ |
||||||
|
sh -ec 'apk add --no-cache python3 >/dev/null && python3 /prune.py' |
||||||
|
|
||||||
|
if [[ -n "$running" ]]; then |
||||||
|
echo "Starting $running ..." |
||||||
|
docker start "$running" >/dev/null |
||||||
|
fi |
||||||
Loading…
Reference in new issue