#!/usr/bin/env bash set -euo pipefail RUNTIME="python" ARCHIVE_FILE="python-${DEST_VERSION}.tar.xz" ARTIFACT_BASE_URL="${ZLH_ARTIFACT_BASE_URL:-http://10.60.0.251:8080}" DEST_DIR="${RUNTIME_ROOT}/${DEST_VERSION}" TMP_DIR="/tmp/zlh-python-install" ARCHIVE_FILE="python-${DEST_VERSION}.tar.xz" URL="${ARTIFACT_BASE_URL%/}/devcontainer/python/${DEST_VERSION}/${ARCHIVE_FILE}" echo "[python] Installing Python ${DEST_VERSION}" mkdir -p "${RUNTIME_ROOT}" # Idempotency if [ -d "${DEST_DIR}" ]; then echo "[python] Python ${DEST_VERSION} already installed at ${DEST_DIR}" else echo "[python] Downloading ${URL}" rm -rf "${TMP_DIR}" mkdir -p "${TMP_DIR}" if command -v curl >/dev/null 2>&1; then curl -fL "${URL}" -o "${TMP_DIR}/${ARCHIVE_FILE}" elif command -v wget >/dev/null 2>&1; then wget -O "${TMP_DIR}/${ARCHIVE_FILE}" "${URL}" else echo "[python][ERROR] curl or wget is required" exit 1 fi echo "[python] Extracting ${ARCHIVE_FILE} -> ${DEST_DIR}" mkdir -p "${DEST_DIR}" tar -xf "${TMP_DIR}/${ARCHIVE_FILE}" -C "${DEST_DIR}" --strip-components=1 fi # Stable symlinks (same model as Node) ln -sfn "${DEST_DIR}" "${RUNTIME_ROOT}/current" ln -sfn "${DEST_DIR}/bin" "${RUNTIME_ROOT}/bin" # System-wide PATH export cat >/etc/profile.d/zlh-python.sh <<'EOF' export PATH="/opt/zlh/runtime/python/bin:$PATH" EOF chmod +x /etc/profile.d/zlh-python.sh # Permissions sanity chmod -R 755 "${DEST_DIR}" echo "[python] Python ${DEST_VERSION} installed successfully"