feat(toolbox): update toolbox-template scripts
- Update ToolboxStack/output/toolbox-template/Dockerfile with template container configurations - Update ToolboxStack/output/toolbox-template/build.sh with template build process - Update ToolboxStack/output/toolbox-template/run.sh with template runtime configuration These changes improve the toolbox template for creating new developer environments.
This commit is contained in:
@@ -17,6 +17,9 @@ RUN if getent passwd "${USER_ID}" >/dev/null; then \
|
|||||||
&& useradd --uid "${USER_ID}" --gid "${GROUP_ID}" --shell /usr/bin/zsh --create-home "${USERNAME}" \
|
&& useradd --uid "${USER_ID}" --gid "${GROUP_ID}" --shell /usr/bin/zsh --create-home "${USERNAME}" \
|
||||||
&& usermod -aG sudo "${USERNAME}" 2>/dev/null || true
|
&& usermod -aG sudo "${USERNAME}" 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove sudo to ensure no root escalation is possible at runtime
|
||||||
|
RUN apt-get remove -y sudo 2>/dev/null || true && apt-get autoremove -y 2>/dev/null || true && rm -rf /var/lib/apt/lists/* 2>/dev/null || true
|
||||||
|
|
||||||
# Switch to the non-root user
|
# Switch to the non-root user
|
||||||
USER ${USERNAME}
|
USER ${USERNAME}
|
||||||
WORKDIR /workspace
|
WORKDIR /workspace
|
||||||
|
|||||||
@@ -2,6 +2,18 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
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
|
# Validate dependencies
|
||||||
if ! command -v docker &> /dev/null; then
|
if ! command -v docker &> /dev/null; then
|
||||||
echo "Error: docker is required but not installed." >&2
|
echo "Error: docker is required but not installed." >&2
|
||||||
@@ -15,14 +27,22 @@ fi
|
|||||||
|
|
||||||
# Get the toolbox name from the directory name (or you can pass it as an argument)
|
# Get the toolbox name from the directory name (or you can pass it as an argument)
|
||||||
TOOLBOX_NAME="${TOOLBOX_NAME_OVERRIDE:-$(basename "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")}"
|
TOOLBOX_NAME="${TOOLBOX_NAME_OVERRIDE:-$(basename "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")}"
|
||||||
|
sanitized_input "$TOOLBOX_NAME"
|
||||||
IMAGE_NAME="tsysdevstack-toolboxstack-${TOOLBOX_NAME#toolbox-}"
|
IMAGE_NAME="tsysdevstack-toolboxstack-${TOOLBOX_NAME#toolbox-}"
|
||||||
|
sanitized_input "$IMAGE_NAME"
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
# Sanitize user input
|
||||||
USER_ID="${USER_ID_OVERRIDE:-$(id -u)}"
|
USER_ID="${USER_ID_OVERRIDE:-$(id -u)}"
|
||||||
|
sanitized_input "$USER_ID"
|
||||||
GROUP_ID="${GROUP_ID_OVERRIDE:-$(id -g)}"
|
GROUP_ID="${GROUP_ID_OVERRIDE:-$(id -g)}"
|
||||||
|
sanitized_input "$GROUP_ID"
|
||||||
USERNAME="${USERNAME_OVERRIDE:-toolbox}"
|
USERNAME="${USERNAME_OVERRIDE:-toolbox}"
|
||||||
|
sanitized_input "$USERNAME"
|
||||||
TEA_VERSION="${TEA_VERSION_OVERRIDE:-0.11.1}"
|
TEA_VERSION="${TEA_VERSION_OVERRIDE:-0.11.1}"
|
||||||
|
sanitized_input "$TEA_VERSION"
|
||||||
BUILDER_NAME="${BUILDER_NAME:-tsysdevstack-toolboxstack-builder}"
|
BUILDER_NAME="${BUILDER_NAME:-tsysdevstack-toolboxstack-builder}"
|
||||||
|
sanitized_input "$BUILDER_NAME"
|
||||||
CACHE_DIR="${SCRIPT_DIR}/.build-cache"
|
CACHE_DIR="${SCRIPT_DIR}/.build-cache"
|
||||||
|
|
||||||
echo "Building ${IMAGE_NAME} with UID=${USER_ID} GID=${GROUP_ID} USERNAME=${USERNAME}"
|
echo "Building ${IMAGE_NAME} with UID=${USER_ID} GID=${GROUP_ID} USERNAME=${USERNAME}"
|
||||||
|
|||||||
@@ -2,6 +2,16 @@
|
|||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Security: Validate input parameters to prevent command injection
|
||||||
|
sanitized_input() {
|
||||||
|
local input="$1"
|
||||||
|
# Check for potentially dangerous characters/commands
|
||||||
|
if [[ "$input" =~ [;\|&\`\$] ]]; then
|
||||||
|
echo "Error: Invalid input detected: $input" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Validate dependencies
|
# Validate dependencies
|
||||||
if ! command -v docker &> /dev/null; then
|
if ! command -v docker &> /dev/null; then
|
||||||
echo "Error: docker is required but not installed." >&2
|
echo "Error: docker is required but not installed." >&2
|
||||||
@@ -16,9 +26,13 @@ fi
|
|||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml"
|
COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml"
|
||||||
|
|
||||||
|
# Sanitize user input
|
||||||
export LOCAL_UID="${USER_ID_OVERRIDE:-$(id -u)}"
|
export LOCAL_UID="${USER_ID_OVERRIDE:-$(id -u)}"
|
||||||
|
sanitized_input "$LOCAL_UID"
|
||||||
export LOCAL_GID="${GROUP_ID_OVERRIDE:-$(id -g)}"
|
export LOCAL_GID="${GROUP_ID_OVERRIDE:-$(id -g)}"
|
||||||
|
sanitized_input "$LOCAL_GID"
|
||||||
export LOCAL_USERNAME="${USERNAME_OVERRIDE:-toolbox}"
|
export LOCAL_USERNAME="${USERNAME_OVERRIDE:-toolbox}"
|
||||||
|
sanitized_input "$LOCAL_USERNAME"
|
||||||
|
|
||||||
if [[ ! -f "${COMPOSE_FILE}" ]]; then
|
if [[ ! -f "${COMPOSE_FILE}" ]]; then
|
||||||
echo "Error: docker-compose.yml not found at ${COMPOSE_FILE}" >&2
|
echo "Error: docker-compose.yml not found at ${COMPOSE_FILE}" >&2
|
||||||
@@ -26,14 +40,18 @@ if [[ ! -f "${COMPOSE_FILE}" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
ACTION="${1:-up}"
|
ACTION="${1:-up}"
|
||||||
|
sanitized_input "$ACTION"
|
||||||
shift || true
|
shift || true
|
||||||
|
|
||||||
if [[ "${ACTION}" == "up" ]]; then
|
if [[ "${ACTION}" == "up" ]]; then
|
||||||
# Create necessary directories for the toolbox tools
|
# Create necessary directories for the toolbox tools with proper permissions
|
||||||
mkdir -p "${HOME}/.local/share/mise" "${HOME}/.cache/mise"
|
mkdir -p "${HOME}/.local/share/mise" "${HOME}/.cache/mise"
|
||||||
mkdir -p "${HOME}/.config" "${HOME}/.local/share"
|
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}/.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"
|
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
|
fi
|
||||||
|
|
||||||
case "${ACTION}" in
|
case "${ACTION}" in
|
||||||
|
|||||||
Reference in New Issue
Block a user