11#! /bin/bash
22
3- # Find and install packages, if required, using conda channel or using pip package manager
43vulnerable_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" \
54 " cryptography=42.0.4" " gitpython=3.1.41" " jupyter-lsp=2.2.2" " idna=3.7" " jinja2=3.1.4" " scrapy=2.11.2" )
65
76# Define the number of rows (based on the length of vulnerable_packages)
87rows=${# vulnerable_packages[@]}
98
109# Define the number of columns
11- cols=4
10+ cols=2
1211
1312# Define the 2D array
1413declare -A packages_array
@@ -22,78 +21,6 @@ for ((i=0; i<rows; i++)); do
2221 packages_array[$i ,1]=${parts[1]}
2322done
2423
25- value=0
26- insert_in_2D_array () {
27- local package_name=$1
28- local channel_name=" anaconda"
29-
30- echo " Running conda search for package '$package_name ' in channel '$channel_name '..."
31-
32- # Capture the conda search output and process it
33- latest_version=$( conda search " $package_name " -c " $channel_name " | \
34- grep -E ' ^[[:alnum:]]' | \
35- awk ' {print $2}' | \
36- sort -V | \
37- uniq | \
38- tail -n 2 | \
39- head -n 1)
40-
41- found_version=$( pip show $package_name | grep ' ^Version:' | awk ' {print $2}' )
42- if [[ -z " $latest_version " ]]; then
43- echo " No version found in anaconda channel."
44- latest_version=" 0"
45- fi
46- if [[ -z " $found_version " ]]; then
47- echo " No package version found in upstream."
48- found_version=" 0"
49- fi
50- echo " Latest version of $package_name on Conda Channel: $latest_version "
51- packages_array[$i ,2]=" $found_version "
52- packages_array[$i ,3]=" $latest_version "
53- (( value++ ))
54- }
55-
56- # store found package versions in upstream as 3rd column element in 2D array
57- check_packages_anaconda_channel () {
58- for (( i= 0 ; i< rows; i++ )) ; do
59- PACKAGE_NAME=${packages_array[$i,0]}
60- echo " Package Name $i : $PACKAGE_NAME "
61- insert_in_2D_array $PACKAGE_NAME
62- done
63- }
64-
65- compare_and_install_packages () {
66- check_packages_anaconda_channel
67- printf " %-10s %-10s %-10s %-10s\n" " Package Name," " Version needed," " Version Present," " Conda channel version"
68- echo " ---------------------------------------------------------------------------------"
69- for (( i= 0 ; i< rows; i++ )) ; do
70- for (( j= 0 ; j< cols; j++ )) ; do
71- echo -n " ${packages_array[$i,$j]} "
72- done
73- echo
74- done
75- for (( i= 0 ; i< rows; i++ )) ; do
76- echo -e " \nComparing semver versions between required and present currently for ${packages_array[$i,0]} "
77- comparison_result=$( compare_semver " ${packages_array[$i,1]} " " ${packages_array[$i,2]} " )
78- if [[ $comparison_result == " greater" ]]; then
79- echo -e " \n${packages_array[$i,0]} : ${packages_array[$i,1]} > ${packages_array[$i,2]} "
80- echo -e " \nComparing semver versions between required and available through conda channel for ${packages_array[$i,0]} "
81- comparison_result2=$( compare_semver " ${packages_array[$i,1]} " " ${packages_array[$i,3]} " )
82- if [[ $comparison_result2 == " greater" ]]; then
83- echo -e " \n${packages_array[$i,0]} : ${packages_array[$i,1]} > ${packages_array[$i,3]} "
84- echo -e " \nInstalling ${packages_array[$i,0]} using pip"
85- python3 -m pip install --upgrade " ${packages_array[$i,0]} ==${packages_array[$i,1]} "
86- else
87- echo -e " \n${packages_array[$i,0]} : ${packages_array[$i,1]} < ${packages_array[$i,3]} "
88- echo -e " \nInstalling ${packages_array[$i,0]} using conda channel"
89- conda install " ${packages_array[$i,0]} ==${packages_array[$i,3]} "
90- fi
91- else
92- echo -e " No need to update ${packages_array[$i,0]} " ;
93- fi
94- done
95- }
96-
9724# Function to compare semver versions
9825compare_semver () {
9926 # Split versions into arrays
@@ -127,4 +54,32 @@ compare_semver() {
12754 echo $comparison
12855}
12956
130- compare_and_install_packages
57+ for (( i= 0 ; i< rows; i++ )) ; do
58+
59+ CURRENT_VERSION=$( pip show " ${packages_array[$i,0]} " | grep ' ^Version:' | awk ' {print $2}' )
60+ REQUIRED_VERSION=" ${packages_array[$i,1]} "
61+ comparison_result=$( compare_semver " ${REQUIRED_VERSION} " " ${CURRENT_VERSION} " )
62+ # Check if the current version installed is greater or equal to the required version
63+ if [[ $comparison_result == " greater" ]]; then
64+ 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} "
65+ # Check whether conda channel has a greater or equal version available, so install from conda, otherwise use pip package manager
66+ channel_name=" anaconda"
67+ CONDA_VERSION=$( conda search " ${packages_array[$i,0]} " -c " $channel_name " | \
68+ grep -E ' ^[[:alnum:]]' | \
69+ awk ' {print $2}' | \
70+ sort -V | \
71+ uniq | \
72+ tail -n 2 | \
73+ head -n 1)
74+ comparison_result2=$( compare_semver " ${REQUIRED_VERSION} " " ${CONDA_VERSION} " )
75+ if [[ $comparison_result2 == " lesser" ]] || [[ $comparison_result2 == " equal" ]]; then
76+ echo -e " Greater version between required version: v${REQUIRED_VERSION} and conda version: v${CONDA_VERSION} is conda version: v${CONDA_VERSION} \n" ;
77+ echo " Installing ${packages_array[$i,0]} from source from conda channel for ${REQUIRED_VERSION} ..."
78+ conda install " ${packages_array[$i,0]} ==${CONDA_VERSION} "
79+ else
80+ echo -e " Greater version between required version: v${REQUIRED_VERSION} and conda version: v${CONDA_VERSION} is the required version: v${REQUIRED_VERSION} \n" ;
81+ echo " Installing ${packages_array[$i,0]} from source from pip package manager for ${REQUIRED_VERSION} ..."
82+ python3 -m pip install --upgrade " ${packages_array[$i,0]} ==${REQUIRED_VERSION} "
83+ fi
84+ fi
85+ done
0 commit comments