Skip to content

Commit

Permalink
Merge pull request #142 from nmfs-opensci/eeholmes-patch-1
Browse files Browse the repository at this point in the history
switch user at start of script
  • Loading branch information
eeholmes authored Nov 5, 2024
2 parents c0a42fb + bd6be09 commit d4b3732
Show file tree
Hide file tree
Showing 8 changed files with 209 additions and 122 deletions.
72 changes: 47 additions & 25 deletions scripts/install-apt-packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,51 @@
# Required User: root

echo "Running install-apt-packages.sh"
echo " Checking for ${REPO_DIR}/childimage/..."
if [ -d "${REPO_DIR}/childimage/" ]; then
cd "${REPO_DIR}/childimage/" || exit 1

echo " Checking for apt.txt in ${REPO_DIR}/childimage/..."
if test -f "apt.txt"; then
# Check if the script is run as root
if [[ $(id -u) -ne 0 ]]; then
echo " Error: This script must be run as root." >&2 # Output error message to standard error
exit 1 # Exit with a non-zero status to indicate failure
fi

echo " Running install-apt-packages.sh as root. Proceeding with installation..."

package_list=$(grep -v '^\s*#' apt.txt | grep -v '^\s*$' | sed 's/\r//g; s/#.*//; s/^[[:space:]]*//; s/[[:space:]]*$//' | awk '{$1=$1};1')
apt-get update --fix-missing > /dev/null
apt-get install --yes --no-install-recommends $package_list
apt-get autoremove --purge
apt-get clean
rm -rf /var/lib/apt/lists/*
else
echo " No apt.txt found. Skipping package installation."
fi
else
echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script."

# Check that a file name is provided
if [ -z "$1" ]; then
echo "Error: install-apt-packages.sh requires a file name (a list of apt packages and typically called apt.txt)." >&2
echo "Usage: RUN /pyrocket_scripts/install-apt-packages.sh <filename>" >&2
exit 1
fi

# Check if the script is run as root
if [[ $(id -u) -ne 0 ]]; then
echo "Error: install-apt-packages.sh must be run as root. Please use 'USER root' in your Dockerfile before running this script."
echo "Remember to switch back to the non-root user with 'USER ${NB_USER}' after running this script."
exit 1
fi

echo "Running install-apt-packages.sh as root..."

# Set variable for the provided file
apt_file="$1"
echo " Using packages file: ${apt_file}"

# Check if the specified file exists
if [ ! -f "${apt_file}" ]; then
echo " Error: File '${apt_file}' not found. Ensure the file exists and try again."
exit 1
fi

# Update package list and handle errors
echo " Updating package list..."
if ! apt-get update --fix-missing; then
echo " Error: Failed to update package list. Exiting."
exit 1
fi

# Install packages and handle errors
echo " Installing packages from ${apt_file}..."
package_list=$(grep -v '^\s*#' "${apt_file}" | grep -v '^\s*$' | sed 's/\r//g; s/#.*//; s/^[[:space:]]*//; s/[[:space:]]*$//' | awk '{$1=$1};1')
if ! apt-get install --yes --no-install-recommends $package_list; then
echo " Error: Installation of packages failed. Please check the package names and try again."
exit 1
fi

# Clean up
apt-get autoremove --purge
apt-get clean
rm -rf /var/lib/apt/lists/*

echo " Success! install-apt-packages.sh"
93 changes: 54 additions & 39 deletions scripts/install-conda-packages.sh
Original file line number Diff line number Diff line change
@@ -1,44 +1,59 @@
#!/bin/bash
# Required User: NB_USER

echo "Running install-conda-packages.sh"

echo " Checking for ${REPO_DIR}/childimage/..."
if [ -d "${REPO_DIR}/childimage/" ]; then
cd "${REPO_DIR}/childimage/" || exit 1

echo " Checking for conda-lock.yml or environment.yml in ${REPO_DIR}/childimage/..."
if test -f "conda-lock.yml" || test -f "environment.yml"; then
# Switch to NB_USER only if the relevant files exist
if [[ $(id -u) -eq 0 ]]; then
echo " Switching to ${NB_USER} to run install-conda-packages.sh"
exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script
fi

if test -f "conda-lock.yml"; then
echo " Using conda-lock.yml"
${NB_PYTHON_PREFIX}/bin/conda-lock install --name ${CONDA_ENV}
${NB_PYTHON_PREFIX}/bin/pip install --no-deps jupyter-remote-desktop-proxy
INSTALLATION_HAPPENED=true
elif test -f "environment.yml"; then
echo " Using environment.yml"
${CONDA_DIR}/condabin/mamba env update --name ${CONDA_ENV} -f environment.yml
${NB_PYTHON_PREFIX}/bin/pip install --no-deps jupyter-remote-desktop-proxy
INSTALLATION_HAPPENED=true
fi

# Only run cleanup if installation occurred
if [ "$INSTALLATION_HAPPENED" = true ]; then
${CONDA_DIR}/condabin/mamba clean -yaf
find ${CONDA_DIR} -follow -type f -name '*.a' -delete
find ${CONDA_DIR} -follow -type f -name '*.js.map' -delete
if ls ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static > /dev/null 2>&1; then
find ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static -follow -type f -name '*.js' ! -name '*.min.js' -delete
fi
fi
else
echo " No conda-lock.yml or environment.yml found. Skipping installation."
fi
# Check if a filename argument is provided
if [ -z "$1" ]; then
echo "Error: install-conda-packages.sh requires a file name (either conda-lock.yml or environment.yml)." >&2
echo "Usage: RUN /pyrocket_scripts/install-conda-packages.sh <filename.yml>" >&2
exit 1
fi

# Check if running as root and switch to NB_USER if needed
if [[ $(id -u) -eq 0 ]]; then
echo "Switching to ${NB_USER} to run install-conda-packages.sh"
exec su "${NB_USER}" -c "/bin/bash $0 $1" # Pass along the filename argument
fi

# Main script execution as NB_USER
echo "Running install-conda-packages.sh as ${NB_USER}"

# Set the file variable to the provided argument
ENV_FILE="$1"

# Verify the file exists and is readable
if [ ! -f "$ENV_FILE" ]; then
echo " Error: File '$ENV_FILE' not found. Please provide a valid file path." >&2
echo " Usage: RUN /pyrocket_scripts/install-conda-packages.sh <filename.yml>" >&2
exit 1
fi

echo " Found file: $ENV_FILE"

# Determine file type based on content
if grep -q "lock_set" "$ENV_FILE"; then
echo " Detected conda-lock.yml file."
${NB_PYTHON_PREFIX}/bin/conda-lock install --name ${CONDA_ENV} -f "$ENV_FILE"
INSTALLATION_HAPPENED=true
elif grep -q "name:" "$ENV_FILE"; then
echo " Detected environment.yml file."
${CONDA_DIR}/condabin/mamba env update --name ${CONDA_ENV} -f "$ENV_FILE"
INSTALLATION_HAPPENED=true
else
echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script."
# If neither condition matches, output a helpful error message
echo "Error: Unrecognized file format in '${env_file}'."
echo " - For an environment.yml file, ensure it includes a 'name:' entry. Any name is acceptable."
echo " - For a conda-lock.yml file, ensure it includes a 'lock_set:' entry."
exit 1
fi

# Run cleanup if installation occurred
if [ "$INSTALLATION_HAPPENED" = true ]; then
${CONDA_DIR}/condabin/mamba clean -yaf
find ${CONDA_DIR} -follow -type f -name '*.a' -delete
find ${CONDA_DIR} -follow -type f -name '*.js.map' -delete
if ls ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static > /dev/null 2>&1; then
find ${NB_PYTHON_PREFIX}/lib/python*/site-packages/bokeh/server/static -follow -type f -name '*.js' ! -name '*.min.js' -delete
fi
fi

echo " Success! install-conda-packages.sh"
21 changes: 15 additions & 6 deletions scripts/setup-desktop.sh → scripts/install-desktop.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,26 @@

echo "Running setup-desktop.sh"

# Check if the script is run as root
if [[ $(id -u) -ne 0 ]]; then
echo " Error: This script must be run as root. Please use 'USER root' in your Dockerfile before running this script."
echo " Remember to switch back to the non-root user with 'USER ${NB_USER}' after running this script."
exit 1
fi

# Check if a filename argument is provided
if [ -n "$1" ]; then
echo " Warning: Passed-in file '$1' is ignored. Looking for Desktop files in the 'Desktop' directory in your repository." >&2
fi

echo " Checking for ${REPO_DIR}/childimage/..."
if [ -d "${REPO_DIR}/childimage/" ]; then
cd "${REPO_DIR}/childimage/" || exit 1

echo " Checking for Desktop directory..."
if test -d "${REPO_DIR}/childimage/Desktop"; then
# Check if the script is run as root
if [[ $(id -u) -ne 0 ]]; then
echo " Error: This script must be run as root." >&2 # Output error message to standard error
exit 1 # Exit with a non-zero status to indicate failure
fi

echo " Running setup-desktop.sh as root. Proceeding with installation..."
echo " ${REPO_DIR}/childimage/Desktop directory found. Proceeding with installation..."

mkdir -p "${REPO_DIR}/Desktop"
cp -r ${REPO_DIR}/childimage/Desktop/* "${REPO_DIR}/Desktop/" 2>/dev/null
Expand All @@ -34,3 +41,5 @@ if [ -d "${REPO_DIR}/childimage/" ]; then
else
echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script."
fi

echo " Success! install-desktop.sh"
57 changes: 36 additions & 21 deletions scripts/install-pip-packages.sh
Original file line number Diff line number Diff line change
@@ -1,25 +1,40 @@
#!/bin/bash
# Required User: NB_USER

echo "Running install-pip-packages.sh"

echo " Checking for ${REPO_DIR}/childimage/..."
if [ -d "${REPO_DIR}/childimage/" ]; then
cd "${REPO_DIR}/childimage/" || exit 1

echo " Checking for requirements.txt in ${REPO_DIR}/childimage/..."
if test -f "requirements.txt"; then
# Switch to NB_USER only if requirements.txt exists
if [[ $(id -u) -eq 0 ]]; then
echo "Switching to ${NB_USER} to run install-pip-packages.sh"
exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script
fi

echo " Installing pip packages from requirements.txt as ${NB_USER}..."
${NB_PYTHON_PREFIX}/bin/pip install --no-cache -r requirements.txt
else
echo " No requirements.txt found. Skipping pip installation."
fi
else
echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping script."
# Check if a filename argument is provided
if [ -z "$1" ]; then
echo "Error: install-pip-packages.sh requires an input file of package names (typically called requirements.txt)." >&2
echo "Usage: RUN /pyrocket_scripts/install-pip-packages.sh <filename>" >&2
exit 1
fi

# Check if running as root and switch to NB_USER if needed
if [[ $(id -u) -eq 0 ]]; then
echo "Switching to ${NB_USER} to run install-pip-packages.sh"
exec su "${NB_USER}" -c "/bin/bash $0 $1" # Pass along the filename argument
fi

# Main script execution as NB_USER
echo "Running install-pip-packages.sh as ${NB_USER}"


# Set variable for the provided file
requirements_file="$1"
echo " Using packages file: ${requirements_file}"

# Check if the specified file exists
if [ ! -f "${requirements_file}" ]; then
echo " Error: File '${requirements_file}' not found. Ensure the file exists and try again."
exit 1
fi

echo " Installing pip packages from ${requirements_file} as ${NB_USER}..."

# Install pip packages and handle errors
if ! ${NB_PYTHON_PREFIX}/bin/pip install --no-cache -r "${requirements_file}"; then
echo " Error: Installation of packages from '${requirements_file}' failed. Please check the package names and try again."
exit 1
fi

echo " Success! install-pip-packages.sh"

25 changes: 0 additions & 25 deletions scripts/install-r-package.sh

This file was deleted.

38 changes: 38 additions & 0 deletions scripts/install-r-packages.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/bash
# Required User: NB_USER

# Check if a filename argument is provided
if [ -z "$1" ]; then
echo "Error: install-r-packages.sh requires an input file (an R script and typically called install.R)." >&2
echo "Usage: RUN /pyrocket_scripts/install-r-packages.sh <filename>" >&2
exit 1
fi

# Check if running as root and switch to NB_USER if needed
if [[ $(id -u) -eq 0 ]]; then
echo "Switching to ${NB_USER} to run install-r-packages.sh"
exec su "${NB_USER}" -c "/bin/bash $0 $1" # Pass along the filename argument
fi

# Main script execution as NB_USER
echo "Running install-r-packages.sh as ${NB_USER}"

# Set the file variable to the provided argument
INSTALL_FILE="$1"

# Verify the file exists and is readable
if [ ! -f "$INSTALL_FILE" ]; then
echo " Error: File '$INSTALL_FILE' not found. Please provide a valid R script file." >&2
echo " Usage: RUN /pyrocket_scripts/install-r-packages.sh <filename>" >&2
exit 1
fi

echo " Found file: $INSTALL_FILE"

# Install R packages using the provided R script
if ! Rscript "$INSTALL_FILE"; then
echo " Error: Installation of packages from '$INSTALL_FILE' failed. Please check the script for errors." >&2
exit 1
fi

echo " Success! install-r-packages.sh"
5 changes: 5 additions & 0 deletions scripts/run-postbuild.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

echo "Running run-postbuild.sh"

# Check if a filename argument is provided
if [ -n "$1" ]; then
echo " Warning: Passed-in file '$1' to run-postbuild.sh is ignored. Looking for a file named 'postBuild' in your repository." >&2
fi

echo " Checking for ${REPO_DIR}/childimage/..."
if [ -d "${REPO_DIR}/childimage/" ]; then
cd "${REPO_DIR}/childimage/" || exit 1
Expand Down
20 changes: 14 additions & 6 deletions scripts/setup-start.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
#!/bin/bash
# Required User: NB_USER

echo "Running setup-start.sh"
# Check if a filename argument is provided
if [ -n "$1" ]; then
echo "Warning: Passed-in file '$1' to setup-start.sh is ignored. Looking for a file named 'start' in your repository." >&2
fi

# Check if running as root and switch to NB_USER if needed
if [[ $(id -u) -eq 0 ]]; then
echo "Switching to ${NB_USER} to run start.sh"
exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script
fi

echo "Running setup-start.sh as ${NB_USER}"

echo " Checking for ${REPO_DIR}/childimage/..."
if [ -d "${REPO_DIR}/childimage/" ]; then
Expand All @@ -10,15 +21,12 @@ if [ -d "${REPO_DIR}/childimage/" ]; then
echo " Checking for start in ${REPO_DIR}/childimage/..."
if test -f "start"; then
echo " start found in ${REPO_DIR}/childimage/."
# Switch to NB_USER only if the start file exists
if [[ $(id -u) -eq 0 ]]; then
echo " Switching to ${NB_USER} to run setup-start.sh"
exec su "${NB_USER}" -c "/bin/bash $0" # Switches to NB_USER and reruns the script
fi
chmod +x start
else
echo " No start file found in ${REPO_DIR}/childimage/. Skipping."
fi
else
echo " Directory ${REPO_DIR}/childimage/ does not exist. Skipping."
fi

echo " Success! setup-start.sh"

0 comments on commit d4b3732

Please sign in to comment.