#!/usr/bin/env bash set -euo pipefail # Security: Validate input parameters to prevent command injection sanitized_input() { local input="$1" # Check for potentially dangerous characters/commands case "$input" in *[\;\|\&\`\$]*) echo "Error: Invalid input detected: $input" >&2 exit 1 ;; esac } # Validate dependencies if ! command -v docker &> /dev/null; then echo "Error: docker is required but not installed." >&2 exit 1 fi if ! command -v docker compose &> /dev/null; then echo "Error: docker compose is required but not installed." >&2 exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml" # Sanitize user input export LOCAL_UID="${USER_ID_OVERRIDE:-$(id -u)}" sanitized_input "$LOCAL_UID" export LOCAL_GID="${GROUP_ID_OVERRIDE:-$(id -g)}" sanitized_input "$LOCAL_GID" export LOCAL_USERNAME="${USERNAME_OVERRIDE:-toolbox}" sanitized_input "$LOCAL_USERNAME" export TOOLBOX_IMAGE="${TOOLBOX_IMAGE_OVERRIDE:-tsysdevstack-toolboxstack-toolbox-base:release-current}" sanitized_input "$TOOLBOX_IMAGE" if [[ ! -f "${COMPOSE_FILE}" ]]; then echo "Error: docker-compose.yml not found at ${COMPOSE_FILE}" >&2 exit 1 fi ACTION="${1:-up}" sanitized_input "$ACTION" shift || true if [[ "${ACTION}" == "up" ]]; then # Create necessary directories for the toolbox tools with proper permissions mkdir -p "${HOME}/.local/share/mise" "${HOME}/.cache/mise" mkdir -p "${HOME}/.config" "${HOME}/.local/share" mkdir -p "${HOME}/.cache/openai" "${HOME}/.cache/gemini" "${HOME}/.cache/qwen" "${HOME}/.cache/code" "${HOME}/.cache/opencode" mkdir -p "${HOME}/.config/openai" "${HOME}/.config/gemini" "${HOME}/.config/qwen" "${HOME}/.config/code" "${HOME}/.config/opencode" # Set proper permissions for created directories chmod 700 "${HOME}/.config" "${HOME}/.local/share" "${HOME}/.cache" 2>/dev/null || true fi case "${ACTION}" in up) docker compose -f "${COMPOSE_FILE}" up --build --detach "$@" echo "Container started. Use 'docker exec -it tsysdevstack-toolboxstack-toolbox-base zsh' to access the shell." ;; down) docker compose -f "${COMPOSE_FILE}" down "$@" echo "Container stopped." ;; *) echo "Usage: $0 [up|down] [additional docker compose args]" >&2 exit 1 ;; esac