#!/bin/bash
set -euo pipefail
# Public wrapper: no installs or downloads; requires Linux user/mount/net namespaces.
# Usage: bash uav-resolution-launch.sh DATASET_DIR PRETRAINED_PT VENV_DIR > run.log 2>&1
if [[ "${1:-}" != "--inside" ]]; then
  [[ $# == 3 ]] || { echo "Usage: $0 DATASET_DIR PRETRAINED_PT VENV_DIR" >&2; exit 2; }
  script=$(realpath "$0")
  dataset=$(realpath "$1")
  weights=$(realpath "$2")
  venv=$(realpath "$3")
  source_script=$(dirname "$script")/uav-resolution-run.py
  manifest=$(dirname "$script")/uav-training-manifest.json
  [[ -f "$source_script" && -f "$dataset/manifest.json" && -f "$weights" && -x "$venv/bin/python" ]] || exit 2
  root=$(mktemp -d /tmp/uav-training-root.XXXXXXXX)
  trap 'rmdir "$root"' EXIT
  timeout --signal=TERM --kill-after=10s 900s taskset -c 0,1 prlimit --as=6442450944 --cpu=870 --fsize=134217728 --nproc=512 --nofile=256 -- unshare --user --map-root-user --mount --net --pid --fork --kill-child bash "$script" --inside "$root" "$dataset" "$weights" "$venv" "$source_script" "$manifest"
  exit $?
fi
root=$2
dataset=$3
weights=$4
venv=$5
source_script=$6
manifest=$7
mount --make-rprivate /
mount -t tmpfs -o size=2G tmpfs "$root"
mkdir -p "$root"/{usr,etc,proc,dev,work,input,opt/venv}
ln -s usr/bin "$root/bin"
ln -s usr/lib "$root/lib"
ln -s usr/lib64 "$root/lib64"
robind() { mount --rbind "$1" "$2"; while read -r target; do mount -o remount,bind,ro "$target"; done < <(findmnt -Rrn -o TARGET "$2"); }
robind /usr "$root/usr"
mkdir -p "$root/etc/fonts"
touch "$root/etc/ld.so.cache"
robind /etc/fonts "$root/etc/fonts"
robind /etc/ld.so.cache "$root/etc/ld.so.cache"
robind "$venv" "$root/opt/venv"
robind "$dataset" "$root/input"
touch "$root/pretrained.pt" "$root/run.py" "$root/manifest.json"
robind "$weights" "$root/pretrained.pt"
robind "$source_script" "$root/run.py"
robind "$manifest" "$root/manifest.json"
mount -t proc proc "$root/proc"
for d in null zero random urandom; do touch "$root/dev/$d"; mount --bind "/dev/$d" "$root/dev/$d"; done
mount -t tmpfs -o size=2G tmpfs "$root/work"
mkdir -p "$root/work"/{home,tmp,config,shm}
ln -s /work/shm "$root/dev/shm"
cp /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf "$root/work/config/Arial.ttf"
mount -o remount,bind,ro "$root"
cd "$root/work"
exec chroot "$root" /usr/bin/setpriv --bounding-set=-all --no-new-privs /usr/bin/env -i HOME=/work/home TMPDIR=/work/tmp PATH=/opt/venv/bin:/usr/bin:/bin LANG=C.UTF-8 OMP_NUM_THREADS=2 OPENBLAS_NUM_THREADS=2 MKL_NUM_THREADS=2 YOLO_AUTOINSTALL=False YOLO_OFFLINE=True /opt/venv/bin/python /run.py
