Skip to content
Merged
Prev Previous commit
Next Next commit
changes requested
  • Loading branch information
gauravsaini04 committed May 30, 2024
commit 1a5780adff338ac6fb3bed38d3d4ca943759e0b0
105 changes: 30 additions & 75 deletions src/anaconda/.devcontainer/install_vulnerable_packages.sh
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
#!/bin/bash

# Find and install packages, if required, using conda channel or using pip package manager
vulnerable_packages=( "pydantic=2.5.3" "joblib=1.3.1" "mistune=3.0.1" "werkzeug=3.0.3" "transformers=4.36.0" "pillow=10.3.0" "aiohttp=3.9.4" \
"cryptography=42.0.4" "gitpython=3.1.41" "jupyter-lsp=2.2.2" "idna=3.7" "jinja2=3.1.4" "scrapy=2.11.2" )

# Define the number of rows (based on the length of vulnerable_packages)
rows=${#vulnerable_packages[@]}

# Define the number of columns
cols=4
cols=2

# Define the 2D array
declare -A packages_array
Expand All @@ -22,78 +21,6 @@ for ((i=0; i<rows; i++)); do
packages_array[$i,1]=${parts[1]}
done

value=0
insert_in_2D_array() {
local package_name=$1
local channel_name="anaconda"

echo "Running conda search for package '$package_name' in channel '$channel_name'..."

# Capture the conda search output and process it
latest_version=$(conda search "$package_name" -c "$channel_name" | \
grep -E '^[[:alnum:]]' | \
awk '{print $2}' | \
sort -V | \
uniq | \
tail -n 2 | \
head -n 1)

found_version=$(pip show $package_name | grep '^Version:' | awk '{print $2}')
if [[ -z "$latest_version" ]]; then
echo "No version found in anaconda channel."
latest_version="0"
fi
if [[ -z "$found_version" ]]; then
echo "No package version found in upstream."
found_version="0"
fi
echo "Latest version of $package_name on Conda Channel: $latest_version"
packages_array[$i,2]="$found_version"
packages_array[$i,3]="$latest_version"
((value++))
}

# store found package versions in upstream as 3rd column element in 2D array
check_packages_anaconda_channel() {
for ((i=0; i<rows; i++)); do
PACKAGE_NAME=${packages_array[$i,0]}
echo "Package Name $i: $PACKAGE_NAME"
insert_in_2D_array $PACKAGE_NAME
done
}

compare_and_install_packages() {
check_packages_anaconda_channel
printf "%-10s %-10s %-10s %-10s\n" "Package Name," "Version needed," "Version Present," "Conda channel version"
echo "---------------------------------------------------------------------------------"
for ((i=0; i<rows; i++)); do
for ((j=0; j<cols; j++)); do
echo -n "${packages_array[$i,$j]} "
done
echo
done
for ((i=0; i<rows; i++)); do
echo -e "\nComparing semver versions between required and present currently for ${packages_array[$i,0]}"
comparison_result=$(compare_semver "${packages_array[$i,1]}" "${packages_array[$i,2]}")
if [[ $comparison_result == "greater" ]]; then
echo -e "\n${packages_array[$i,0]} : ${packages_array[$i,1]} > ${packages_array[$i,2]}"
echo -e "\nComparing semver versions between required and available through conda channel for ${packages_array[$i,0]}"
comparison_result2=$(compare_semver "${packages_array[$i,1]}" "${packages_array[$i,3]}")
if [[ $comparison_result2 == "greater" ]]; then
echo -e "\n${packages_array[$i,0]} : ${packages_array[$i,1]} > ${packages_array[$i,3]}"
echo -e "\nInstalling ${packages_array[$i,0]} using pip"
python3 -m pip install --upgrade "${packages_array[$i,0]}==${packages_array[$i,1]}"
else
echo -e "\n${packages_array[$i,0]} : ${packages_array[$i,1]} < ${packages_array[$i,3]}"
echo -e "\nInstalling ${packages_array[$i,0]} using conda channel"
conda install "${packages_array[$i,0]}==${packages_array[$i,3]}"
fi
else
echo -e "No need to update ${packages_array[$i,0]}";
fi
done
}

# Function to compare semver versions
compare_semver() {
# Split versions into arrays
Expand Down Expand Up @@ -127,4 +54,32 @@ compare_semver() {
echo $comparison
}

compare_and_install_packages
for ((i=0; i<rows; i++)); do

CURRENT_VERSION=$(pip show "${packages_array[$i,0]}" | grep '^Version:' | awk '{print $2}')
REQUIRED_VERSION="${packages_array[$i,1]}"
comparison_result=$(compare_semver "${REQUIRED_VERSION}" "${CURRENT_VERSION}")
# Check if the current version installed is greater or equal to the required version
if [[ $comparison_result == "greater" ]]; then
echo "${packages_array[$i,0]} version v${CURRENT_VERSION} installed by the base image is not greater or equal to the required: v${REQUIRED_VERSION}"
# Check whether conda channel has a greater or equal version available, so install from conda, otherwise use pip package manager
channel_name="anaconda"
CONDA_VERSION=$(conda search "${packages_array[$i,0]}" -c "$channel_name" | \
grep -E '^[[:alnum:]]' | \
awk '{print $2}' | \
sort -V | \
uniq | \
tail -n 2 | \
head -n 1)
comparison_result2=$(compare_semver "${REQUIRED_VERSION}" "${CONDA_VERSION}")
if [[ $comparison_result2 == "lesser" ]] || [[ $comparison_result2 == "equal" ]]; then
echo -e "Greater version between required version: v${REQUIRED_VERSION} and conda version: v${CONDA_VERSION} is conda version: v${CONDA_VERSION}\n";
echo "Installing ${packages_array[$i,0]} from source from conda channel for ${REQUIRED_VERSION}..."
conda install "${packages_array[$i,0]}==${CONDA_VERSION}"
else
echo -e "Greater version between required version: v${REQUIRED_VERSION} and conda version: v${CONDA_VERSION} is the required version: v${REQUIRED_VERSION}\n";
echo "Installing ${packages_array[$i,0]} from source from pip package manager for ${REQUIRED_VERSION}..."
python3 -m pip install --upgrade "${packages_array[$i,0]}==${REQUIRED_VERSION}"
fi
fi
done