浏览代码

[multi-python] Refactor Hue build system for multi-python support and environment consistency

- Standardized Python environment setup for python3.8, python3.9, and python3.11 across RedHat, Ubuntu, and SLES.
- Introduced helper functions `setup_python_env`, `install_prerequisite`, and `should_build_python` for modular environment configuration.
- Updated Makefile to use proper virtualenv creation with `--system-site-packages` and corrected binary usage (`ENV_PYTHON` vs `SYS_PYTHON`).
- Corrected VIRTUAL_ENV_VERSION mappings:
  - Pinned python3.8 to virtualenv 20.19.0 for compatibility.
  - Upgraded python3.11 to virtualenv 20.30.0 for latest features.
- Added missing `Markdown` dependency per Python version in `generate_requirements.py`.
- Simplified and modularized OS-specific dependency installations (build_hue_cloudera.sh):
  - Added dynamic sqlite3 build from source where necessary.
  - Corrected PATH and LD_LIBRARY_PATH exports.
- Improved consistency for environment detection (is_supported_os) and python version validation (is_supported_python_version).
- Enhanced release Makefile target to build with python3.8 or python3.11 based on OS compatibility.

Overall improves reproducibility, clarity, and multi-Python build support across different OS distributions.

(cherry picked from commit 68d7906dc6a45ddd36302f69ddc2908f45a23c68)
Change-Id: I9f3a3749a9bf97162ce05e5ee218c07461b74831
(cherry picked from commit 74fe7015e855b5f07790d8939e567174ebe2db99)
Prakash Ranade 7 月之前
父节点
当前提交
986ebe0010
共有 5 个文件被更改,包括 415 次插入421 次删除
  1. 3 2
      Makefile
  2. 2 2
      Makefile.vars
  3. 21 3
      desktop/core/generate_requirements.py
  4. 123 97
      tools/cloudera/build_hue_cloudera.sh
  5. 266 317
      tools/cloudera/build_hue_common.sh

+ 3 - 2
Makefile

@@ -159,8 +159,9 @@ $(BLD_DIR_ENV)/bin/python:
 	@mkdir -p $(BLD_DIR_ENV)
 	@$(SYS_PYTHON) -m pip install --upgrade pip==$(PIP_VERSION)
 	@$(SYS_PYTHON) -m pip install virtualenv==$(VIRTUAL_ENV_VERSION) virtualenv-make-relocatable==$(VIRTUAL_ENV_RELOCATABLE_VERSION)
+	@$(SYS_PYTHON) -m virtualenv --system-site-packages --copies -p $(PYTHON_VER) $(BLD_DIR_ENV)
+	@$(ENV_PYTHON) -m pip install virtualenv==$(VIRTUAL_ENV_VERSION) virtualenv-make-relocatable==$(VIRTUAL_ENV_RELOCATABLE_VERSION)
 	@$(eval RELOCATABLE := $(shell which virtualenv-make-relocatable))
-	@$(SYS_PYTHON) -m virtualenv -p $(PYTHON_VER) $(BLD_DIR_ENV) --copies
 	@echo "REQUIREMENT_FILE is $(REQUIREMENT_FILE)"
 	@$(ENV_PIP) install -r $(REQUIREMENT_FILE)
 	@echo "--- Virtual environment setup complete for $(PYTHON_VER) ---"
@@ -184,7 +185,7 @@ desktop: virtual-env
 relocatable-env:
 	@$(MAKE) virtual-env
 	@echo "--- Running $(SYS_PYTHON) $(RELOCATABLE) $(BLD_DIR_ENV)"
-	@$(SYS_PYTHON) $(RELOCATABLE) $(BLD_DIR_ENV)
+	@$(ENV_PYTHON) $(RELOCATABLE) $(BLD_DIR_ENV)
 	@echo "--- Setting up pth files $(ENV_PYTHON) $(ROOT)/tools/relocatable.py"
 	@$(ENV_PYTHON) $(ROOT)/tools/relocatable.py
 

+ 2 - 2
Makefile.vars

@@ -166,7 +166,7 @@ VIRTUAL_ENV_RELOCATABLE_VERSION := 0.0.1
 ##############################
 ifeq ($(PYTHON_VER),python3.8)
   PIP_VERSION := 22.2.2
-  VIRTUAL_ENV_VERSION := 20.24.4
+  VIRTUAL_ENV_VERSION := 20.19.0
   VIRTUAL_ENV_RELOCATABLE_VERSION := 0.0.1
   REQUIREMENT_PPC64LE_FILE := $(ROOT)/desktop/core/requirements_ppc64le.txt
 else ifeq ($(PYTHON_VER),python3.9)
@@ -180,7 +180,7 @@ else ifeq ($(PYTHON_VER),python3.10)
   VIRTUAL_ENV_RELOCATABLE_VERSION := 0.0.1
 else ifeq ($(PYTHON_VER),python3.11)
   PIP_VERSION := 22.2.2
-  VIRTUAL_ENV_VERSION := 20.24.4
+  VIRTUAL_ENV_VERSION := 20.30.0
   VIRTUAL_ENV_RELOCATABLE_VERSION := 0.0.1
 endif
 

+ 21 - 3
desktop/core/generate_requirements.py

@@ -69,7 +69,6 @@ class RequirementsGenerator:
             "kerberos==1.3.0",
             "kubernetes==26.1.0",
             "Mako==1.2.3",
-            "Markdown==3.7",
             "openpyxl==3.0.9",
             "phoenixdb==1.2.1",
             "prompt-toolkit==3.0.39",
@@ -111,7 +110,7 @@ class RequirementsGenerator:
                 "http://ibm-ppc-builds.s3.amazonaws.com/silx-py-libs/pandas-1.4.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
                 "http://ibm-ppc-builds.s3.amazonaws.com/silx-py-libs/lxml-4.6.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
                 "PyYAML==5.4.1",
-                "sasl==0.3.1",
+                "Markdown==3.1",
             ],
             "3.9": [
                 "http://ibm-ppc-builds.s3.amazonaws.com/silx-py-libs/cryptography-41.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
@@ -119,7 +118,7 @@ class RequirementsGenerator:
                 "http://ibm-ppc-builds.s3.amazonaws.com/silx-py-libs/pandas-1.4.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
                 "http://ibm-ppc-builds.s3.amazonaws.com/silx-py-libs/lxml-4.6.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
                 "PyYAML==6.0.1",
-                "sasl==0.3.1",
+                "Markdown==3.8",
             ]
         }
         self.x86_64_requirements = {
@@ -129,6 +128,15 @@ class RequirementsGenerator:
                 "pandas==2.0.3",
                 "lxml==4.9.1",
                 "sasl==0.3.1",
+                "Markdown==3.1",
+            ],
+            "3.9": [
+                "pyopenssl==22.1.0",
+                "numpy==1.24.4",
+                "pandas==2.0.3",
+                "lxml==4.9.1",
+                "sasl==0.3.1",
+                "Markdown==3.8",
             ],
             "3.11": [
                 "cryptography==42.0.8",
@@ -137,6 +145,7 @@ class RequirementsGenerator:
                 "lxml==4.9.1",
                 "async-timeout==5.0.1",
                 "pure-sasl==0.6.2",
+                "Markdown==3.8",
             ],
         }
         self.aarch64_requirements = {
@@ -145,7 +154,15 @@ class RequirementsGenerator:
                 "numpy==1.24.4",
                 "pandas==2.0.3",
                 "lxml==4.9.1",
+                "Markdown==3.1",
+            ],
+            "3.9": [
+                "pyopenssl==22.1.0",
+                "numpy==1.24.4",
+                "pandas==2.0.3",
+                "lxml==4.9.1",
                 "sasl==0.3.1",
+                "Markdown==3.8",
             ],
             "3.11": [
                 "cryptography==42.0.8",
@@ -154,6 +171,7 @@ class RequirementsGenerator:
                 "lxml==4.9.1",
                 "async-timeout==5.0.1",
                 "pure-sasl==0.6.2",
+                "Markdown==3.8"
             ],
         }
         self.pytorch_requirements = {

+ 123 - 97
tools/cloudera/build_hue_cloudera.sh

@@ -1,10 +1,7 @@
 #!/usr/bin/env bash
-
 set -ex
 
-# Time marker for both stderr and stdout
 date; date 1>&2
-
 FORCEINSTALL=1
 
 function find_os() {
@@ -33,118 +30,147 @@ function find_home() {
   echo ${WORK_DIR}
 }
 
-function install_prerequisite() {
-  if [[ $1 == "redhat9_ppc" ]]; then
-    export FORCEINSTALL=0
-    export SQLITE3_PATH="$TOOLS_HOME/sqlite/bin/sqlite3"
-    redhat9_ppc_install
-  elif [[ $1 == "redhat8_ppc" ]]; then
-    export FORCEINSTALL=0
-    export SQLITE3_PATH="$TOOLS_HOME/sqlite/bin/sqlite3"
-    redhat8_ppc_install
-  elif [[ $1 == "redhat7_ppc" ]]; then
-    export FORCEINSTALL=0
-    export SQLITE3_PATH="$TOOLS_HOME/sqlite/bin/sqlite3"
-    redhat7_ppc_install
-  fi
-
-  export SQLITE3_PATH=${SQLITE3_PATH:-"$TOOLS_HOME/sqlite/bin/sqlite3"}
-  check_sqlite3
-  if [[ $1 == "centos7" ]]; then
-    export PYTHON38_PATH=/opt/cloudera/cm-agent
-    export pip_bin="$PYTHON38_PATH/bin/pip3.8"
-    export PATH="$PYTHON38_PATH/bin:$PATH"
-    export SYS_PYTHON="$PYTHON38_PATH/bin/python3.8"
-    export SYS_PIP="$PYTHON38_PATH/bin/pip3.8"
-    centos7_install
-  elif [[ $1 == "redhat8" || $1 == "snapshot" ]]; then
-    redhat8_install
-  elif [[ $1 == "sles12" ]]; then
-    sles12_install
-    export PATH=/usr/lib/mit/bin:$PATH
-  elif [[ $1 == "sles15" ]]; then
-    sles15_install
-    export PATH=/usr/lib/mit/bin:$PATH
-  elif [[ $1 == "ubuntu18" ]]; then
-    ubuntu18_install
-  elif [[ $1 == "ubuntu20" ]]; then
-    ubuntu20_install
-  elif [[ $1 == "redhat9" ]]; then
-    redhat9_install
-  elif [[ $1 == "ubuntu22" ]]; then
-    ubuntu22_install $2
-  elif [[ $1 == "redhat8-arm64" ]]; then
-    redhat8_arm64_install
-  fi
-
-}
-
 WORK_DIR=$(find_home)
-. ${WORK_DIR}/build_hue_common.sh
+. "${WORK_DIR}/build_hue_common.sh"
 
 BUILDTYPE=$1
 DOCKEROS=$2
 HUE_JAR_VERSION=$3
 
-export VIRTUAL_ENV_VERSION="20.24.4"
-export VIRTUAL_ENV_RELOCATABLE_VERSION="0.0.1"
+PYTHON38_OSES=("centos7" "redhat8" "sles12" "ubuntu18" "ubuntu20")
+PYTHON39_OSES=("redhat8" "redhat8-arm64" "redhat9", "ubuntu22")
+PYTHON311_OSES=("redhat8" "redhat8-arm64" "redhat9" "sles15" "ubuntu22")
 
-export DESKTOP_VERSION=$2
+LATEST_PYTHON="python3.11"
+PYTHON_VERSIONS=("python3.11" "python3.9" "python3.8")
+
+export REQ_PYTHON38="3.8.12"
+export REQ_PYTHON39="3.9.16"
+export REQ_PYTHON311="3.11.12"
+
+export DESKTOP_VERSION=$DOCKEROS
 export HUE_WEBPACK_CONFIG='webpack.config.internal.js'
-export PATH="$PYTHON38_PATH/bin:$PATH"
-export SYS_PYTHON="$PYTHON38_PATH/bin/python3.8"
-export SYS_PIP="$PYTHON38_PATH/bin/pip3.8"
 export SQLITE3_PATH=${SQLITE3_PATH:="${TOOLS_HOME}/sqlite/bin/sqlite3"}
 export ORACLE_INSTANTCLIENT19_PATH="/opt/toolchain/instantclient_19_15"
-export LD_LIBRARY_PATH=/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_LIBRARY_PATH
-export LD_RUN_PATH=/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_RUN_PATH
+export LD_LIBRARY_PATH="/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_LIBRARY_PATH"
+export LD_RUN_PATH="/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_RUN_PATH"
+
+setup_python_env() {
+  local ver="$1" os="$2"
+
+  case "$ver" in
+    python3.8)
+      if is_supported_os PYTHON38_OSES "$os"; then
+        export PYTHON38_PATH=${PYTHON38_PATH:=/opt/python/3.8.12}
+        if is_supported_python_version "$PYTHON38_PATH/bin/python3.8" $REQ_PYTHON38; then
+          export PATH="$PYTHON38_PATH/bin:$PATH"
+        else
+          unset PYTHON38_PATH
+        fi
+      fi
+      ;;
+    python3.9)
+      if is_supported_os PYTHON39_OSES "$os"; then
+        export PYTHON39_PATH=${PYTHON39_PATH:=/opt/python/3.9.16}
+        if is_supported_python_version "$PYTHON39_PATH/bin/python3.9" $REQ_PYTHON39; then
+          export PATH="$PYTHON39_PATH/bin:$PATH"
+        else
+          unset PYTHON39_PATH
+        fi
+      fi
+      ;;
+    python3.11)
+      if is_supported_os PYTHON311_OSES "$os"; then
+        export PYTHON311_PATH=${PYTHON311_PATH:=/opt/python/3.11.12}
+        if is_supported_python_version "$PYTHON311_PATH/bin/python3.11" $REQ_PYTHON311; then
+          export PATH="$PYTHON311_PATH/bin:$PATH"
+        else
+          unset PYTHON311_PATH
+        fi
+      fi
+      ;;
+    *) echo "Unsupported python version: $ver"; exit 1 ;;
+  esac
+}
+
+install_prerequisite() {
+  local os="$1"
+
+  case "$os" in
+    centos7) centos7_install ;;
+    redhat8|snapshot) redhat8_install ;;
+    redhat9) redhat9_install ;;
+    sles12) sles12_install ;;
+    sles15) sles15_install ;;
+    ubuntu18) ubuntu18_install ;;
+    ubuntu20) ubuntu20_install ;;
+    ubuntu22) ubuntu22_install ;;
+    redhat8-arm64) redhat8_arm64_install ;;
+    *) echo "Unsupported OS: $os"; exit 1 ;;
+  esac
+
+  export SQLITE3_PATH=${SQLITE3_PATH:-"$TOOLS_HOME/sqlite/bin/sqlite3"}
+}
+
+should_build_python() {
+  local ver="$1"
+  local os="$2"
+
+  case "$ver" in
+    python3.11)
+      is_supported_os PYTHON311_OSES "$os"
+      return $?
+      ;;
+    python3.9)
+      is_supported_os PYTHON39_OSES "$os"
+      return $?
+      ;;
+    python3.8)
+      is_supported_os PYTHON38_OSES "$os"
+      return $?
+      ;;
+    *)
+      return 1
+      ;;
+  esac
+
+  return 1
+}
 
-PYTHON_VERSIONS=("python3.11" "python3.9" "python3.8")
 for PYTHON_VER in "${PYTHON_VERSIONS[@]}"; do
-  if [[ $PYTHON_VER == "python3.8" && ( $DOCKEROS == "redhat7_ppc" || $DOCKEROS == "redhat8" || $DOCKEROS == "redhat8_ppc" || $DOCKEROS == "sles12" || $DOCKEROS == "centos7" || $DOCKEROS == "ubuntu18" || $DOCKEROS == "ubuntu20" || $DOCKEROS == "ubuntu22" ) ]]; then
-    check_python38_path
-    export PATH="$PYTHON38_PATH/bin:$PATH"
-    export SYS_PYTHON="$PYTHON38_PATH/bin/python3.8"
-    export SYS_PIP="$PYTHON38_PATH/bin/pip3.8"
-    export VIRTUAL_ENV_VERSION="20.24.4"
-  elif [[ $PYTHON_VER == "python3.9" && ( $DOCKEROS == "redhat9" || $DOCKEROS == "redhat8" || $DOCKEROS == "redhat9_ppc" || $DOCKEROS == "redhat8-arm64" ) ]]; then
-    check_python39_path
-    export PATH="$PYTHON39_PATH/bin:$PATH"
-    export SYS_PYTHON="$PYTHON39_PATH/bin/python3.9"
-    export SYS_PIP="$PYTHON39_PATH/bin/pip3.9"
-    export VIRTUAL_ENV_VERSION="20.19.0"
-  elif [[ $PYTHON_VER == "python3.11" && ( $DOCKEROS == "redhat9" || $DOCKEROS == "redhat8" || $DOCKEROS == "sles15" || $DOCKEROS == "redhat8-arm64" || $DOCKEROS == "ubuntu22" ) ]]; then
-    check_python311_path
-    export PATH="$PYTHON311_PATH/bin:$PATH"
-    export SYS_PYTHON="$PYTHON311_PATH/bin/python3.11"
-    export SYS_PIP="$PYTHON311_PATH/bin/pip3.11"
-    export VIRTUAL_ENV_VERSION="20.24.4"
-  else
-    continue
-  fi
+  setup_python_env "$PYTHON_VER" "$DOCKEROS"
+done
 
-  big_console_header "Hue PreRequisite Start for" $PYTHON_VER "$@"
-  install_prerequisite $DOCKEROS $PYTHON_VER
-  big_console_header "Hue PreRequisite End for" $PYTHON_VER "$@"
+big_console_header "Hue PreRequisite Start for $DOCKEROS"
+install_prerequisite "$DOCKEROS"
+big_console_header "Hue PreRequisite End for $DOCKEROS"
 
+THISPATH=$PATH
+for PYTHON_VER in "${PYTHON_VERSIONS[@]}"; do
   HUE_SRC=$(realpath "$WORK_DIR/../..")
   cd "$HUE_SRC" || exit 1
 
-  BLD_DIR="${BLD_DIR:-$HUE_SRC/build}"             # Default build directory if not set
-  if [[ $PYTHON_VER == "python3.11" ]]; then
-    BLD_DIR_ENV="${BLD_DIR}/env"
-  else
-    BLD_DIR_ENV="${BLD_DIR}/venvs/${PYTHON_VER}"
-  fi
-  if [[ $DOCKEROS == "sles12" || $DOCKEROS == "centos7" || $DOCKEROS == "ubuntu20" ]]; then
-    BLD_DIR_ENV="${BLD_DIR}/env"
-  fi
-  echo "BLD_DIR_ENV=${BLD_DIR_ENV}"
+  if should_build_python "$PYTHON_VER" "$DOCKEROS"; then
+    BLD_DIR="${BLD_DIR:-$HUE_SRC/build}"
+    BLD_DIR_ENV="$BLD_DIR/venvs/${PYTHON_VER}"
+    [[ "$PYTHON_VER" == "python3.11" || "$DOCKEROS" =~ (sles12|centos7|ubuntu20) ]] && BLD_DIR_ENV="$BLD_DIR/env"
+    echo "BLD_DIR_ENV=${BLD_DIR_ENV}"
+
+    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${ORACLE_INSTANTCLIENT19_PATH}
+    export PATH=$PYTHON38_PATH/bin:$PYTHON39_PATH/bin:$PYTHON311_PATH/bin:/opt/sqlite3/bin:/usr/bin:$THISPATH
 
-  big_console_header "Hue Build Start for" $PYTHON_VER "$@"
-  BLD_DIR_ENV=$BLD_DIR_ENV PYTHON_VER=$PYTHON_VER make apps docs relocatable-env huecheck
-  big_console_header "Hue Build End for" $PYTHON_VER "$@"
+    big_console_header "Hue Build Start for" "$PYTHON_VER" "$@"
+    BLD_DIR_ENV="$BLD_DIR_ENV" PYTHON_VER="$PYTHON_VER" make apps docs
+    BLD_DIR_ENV="$BLD_DIR_ENV" PYTHON_VER="$PYTHON_VER" make relocatable-env
+    BLD_DIR_ENV="$BLD_DIR_ENV" PYTHON_VER="$PYTHON_VER" make huecheck
+    big_console_header "Hue Build End for" "$PYTHON_VER" "$@"
+  fi
 done
+
 big_console_header "Hue PROD Build Start for" "$@"
-BLD_DIR_ENV=$BLD_DIR_ENV PYTHON_VER=$PYTHON_VER make release
+if [[ "$DOCKEROS" =~ (centos7|sles12|ubuntu18) ]]; then
+  PYTHON_VER="python3.8" make release
+else
+  PYTHON_VER="python3.11" make release
+fi
 big_console_header "Hue PROD Build End for" "$@"

+ 266 - 317
tools/cloudera/build_hue_common.sh

@@ -1,64 +1,116 @@
 #!/usr/bin/env bash
 
-function big_console_header() {
+big_console_header() {
   set +x
   local text="$*"
   local spacing=$(( (75+${#text}) /2 ))
-  printf "\n\n"
-  echo "============================================================================"
-  echo "============================================================================"
+  printf "\n\n============================================================================\n"
   printf "%*s\n"  ${spacing} "${text}"
-  echo "============================================================================"
-  echo "============================================================================"
-  printf "\n\n"
+  printf "============================================================================\n\n\n"
   set -x
 }
 
-function check_python38_path() {
-  export python38_bin="$PYTHON38_PATH/bin/python3.8"
-  if [ ! -e "$python38_bin" ]; then
-    echo "Python38 bin does not exists at " $python38_bin
-    exit 1
-  fi
-  export pip_bin="$PYTHON38_PATH/bin/pip3.8"
+is_supported_os() {
+  local -n _array=$1
+  local _os=$2
+  for item in "${_array[@]}"; do
+    if [[ "$item" == "$_os" ]]; then
+      return 0
+    fi
+  done
+  return 1
 }
 
-function check_python39_path() {
-  export python39_bin="$PYTHON39_PATH/bin/python3.9"
-  if [ ! -e "$python39_bin" ]; then
-    echo "Python39 bin does not exists at " $python39_bin
-    exit 1
-  fi
-  export pip_bin="$PYTHON39_PATH/bin/pip3.9"
+is_supported_python_version() {
+  local PYBIN="$1"
+  local version="$2"
+  IFS='.' read -r major minor patch <<< "$version"
+  "$PYBIN" -c "import sys; exit(0) if sys.version_info >= ($major, $minor, $patch) else exit(1)"
+  return $?
 }
 
-function check_python310_path() {
-  export python310_bin="$PYTHON310_PATH/bin/python3.10"
-  if [ ! -e "$python310_bin" ]; then
-    echo "Python310 bin does not exists at " $python310_bin
-    exit 1
-  fi
-  export pip_bin="$PYTHON310_PATH/bin/pip3.10"
-}
+function install_python311() {
+  local DOCKEROS=${1:-"ubuntu22"}
+  local PYTHON_VERSION=${2:-"3.11.12"}
 
-function check_python311_path() {
-  export python311_bin="$PYTHON311_PATH/bin/python3.11"
-  if [ ! -e "$python311_bin" ]; then
-    echo "Python311 bin does not exists at " $python311_bin
-    exit 1
-  fi
-  export pip_bin="$PYTHON311_PATH/bin/pip3.11"
-}
+  pushd .
 
-function check_sqlite3() {
-  export sqlit3_bin="$SQLITE3_PATH"
-  if [ ! -e "$sqlit3_bin" ]; then
-    echo "sqlit3 bin does not exists at " $sqlit3_bin
-    exit 1
-  fi
+  cd $HOME
+  local INSTALL_PREFIX="/opt/python/${PYTHON_VERSION}"
+  local PYTHON_TGZ="Python-${PYTHON_VERSION}.tgz"
+  local PYTHON_SRC_DIR="Python-${PYTHON_VERSION}"
+
+  export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/mit/bin:$PATH
+  export LD_LIBRARY_PATH=${INSTALL_PREFIX}/lib:/opt/sqlite3/lib:${LD_LIBRARY_PATH}
+  export CPPFLAGS="-I/opt/sqlite3/include"
+  export LDFLAGS="-L/opt/sqlite3/lib"
+
+  echo "Installing build dependencies..."
+  case "${DOCKEROS}" in
+      ubuntu22)
+          sudo -- sh -c 'apt update && \
+            apt install -y \
+            build-essential \
+            libbz2-dev libncurses5-dev libgdbm-dev libreadline-dev libkrb5-dev \
+            liblzma-dev uuid-dev libldap2-dev libffi-dev zlib1g-dev libssl-dev wget curl'
+          ;;
+      redhat9|redhat8|redhat8-arm64)
+          sudo -- sh -c 'yum groupinstall -y "Development Tools" && \
+            yum install -y \
+            bzip2-devel ncurses-devel gdbm-devel readline-devel krb5-devel \
+            xz-devel libuuid-devel openldap-devel libffi-devel zlib-devel openssl-devel wget curl'
+          ;;
+      sles15)
+          sudo -- sh -c 'zypper refresh'
+          sudo -- sh -c 'zypper install -y \
+            gcc gcc-c++ make \
+            ncurses-devel gdbm-devel readline-devel krb5-devel \
+            xz-devel libuuid-devel openldap2-devel libffi-devel zlib-devel libopenssl-devel wget curl'
+          ;;
+      *)
+          echo "Unsupported OS: ${DOCKEROS}. Exiting."
+          exit 1
+          ;;
+  esac
+
+  echo "Installing sqlite3..."
+  sudo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} PATH=${PATH} \
+    -- sh -c 'cd /tmp && \
+    mkdir -p /opt/sqlite3 && \
+    curl -o sqlite-autoconf-3350500.tar.gz https://www.sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
+    tar zxvf sqlite-autoconf-3350500.tar.gz && \
+    cd sqlite-autoconf-3350500 && \
+    ./configure --prefix=/opt/sqlite3 && make && make install && \
+    libtool --finish /opt/sqlite3/lib'
+
+  echo "Installing Python ${PYTHON_VERSION}..."
+  sudo DOCKEROS=${DOCKEROS} PYTHON_VERSION=${PYTHON_VERSION} INSTALL_PREFIX=${INSTALL_PREFIX} \
+    PYTHON_TGZ=${PYTHON_TGZ} PYTHON_SRC_DIR=${PYTHON_SRC_DIR} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} \
+    CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} PATH=${PATH} \
+    -- sh -c 'cd /tmp && mkdir -p "${INSTALL_PREFIX}" && \
+    curl -o "${PYTHON_TGZ}" "https://www.python.org/ftp/python/${PYTHON_VERSION}/${PYTHON_TGZ}" && \
+    tar zxf "${PYTHON_TGZ}" && \
+    cd "${PYTHON_SRC_DIR}" && \
+    ./configure --prefix="${INSTALL_PREFIX}" --enable-shared --enable-optimizations --with-lto && \
+    make altinstall'
+
+  # echo "Stripping debug symbols to reduce size..."
+  # sudo -- sh -c '/usr/bin/strip "${INSTALL_PREFIX}/bin/python3.11" && \
+  #   /usr/bin/strip "${INSTALL_PREFIX}/lib/libpython3.11.so.1.0"'
+
+  sudo DOCKEROS=${DOCKEROS} PYTHON_VERSION=${PYTHON_VERSION} INSTALL_PREFIX=${INSTALL_PREFIX} \
+    PYTHON_TGZ=${PYTHON_TGZ} PYTHON_SRC_DIR=${PYTHON_SRC_DIR} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} \
+    CPPFLAGS=${CPPFLAGS} LDFLAGS=${LDFLAGS} PATH=${PATH} \
+    -- sh -c 'cd /tmp && curl -sS https://bootstrap.pypa.io/get-pip.py | "${INSTALL_PREFIX}/bin/python3.11"'
+
+  export SQLITE3_PATH=/opt/sqlite3/bin/sqlite3
+  export PYTHON311_PATH=${INSTALL_PREFIX}
+  export PATH=${INSTALL_PREFIX}/bin:$PATH
+  export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
+  popd
 }
 
-function redhat7_ppc_install() {
+function centos7_install() {
   if [[ $FORCEINSTALL -eq 1 ]]; then
     # pre-req install
     sudo -- sh -c 'yum install -y cyrus-sasl-gssapi \
@@ -72,60 +124,68 @@ function redhat7_ppc_install() {
       nmap-ncat \
       xmlsec1 \
       xmlsec1-openssl \
-      unzip'
+      unzip \
+      python3-devel \
+      postgresql-devel'
+    # Ensure pg_config is available
+    export PG_CONFIG=$(which pg_config)
+    if [ -z "$PG_CONFIG" ]; then
+      echo "Error: pg_config not found. Ensure PostgreSQL development libraries are installed."
+      exit 1
+    fi
+    echo "PG_CONFIG is set to $PG_CONFIG"
+    # MySQLdb install
+    sudo -- sh -c 'cd /tmp && curl -sSLO https://cloudera-build-us-west-1.vpc.cloudera.com/s3/ARTIFACTS/mysql80-community-release-el7-11.noarch.rpm && \
+        rpm -ivh mysql80-community-release-el7-11.noarch.rpm && \
+        yum install -y mysql-community-libs mysql-community-client-plugins mysql-community-common'
     # NODEJS 16 install
     # Upgrading to node-v16 because of the following CVE's in node-v14 "CVE-2021-3450, CVE-2021-44531, CVE-2023-32004, CVE-2023-32006"
     # Node-v20-LTS is not supported by old OS'es - Redhat7_ppc, Centos7, Ubuntu18, Sles12. So upgrading to node-v16
-    sudo -- sh -c 'curl -fsSL https://nodejs.org/dist/v16.20.2/node-v16.20.2-linux-ppc64le.tar.gz -o node-v16.20.2-linux-ppc64le.tar.gz && \
-      mkdir -p /usr/local/lib/nodejs && \
-      tar -xzf node-v16.20.2-linux-ppc64le.tar.gz -C /usr/local/lib/nodejs'
-    echo 'export PATH=/usr/local/lib/nodejs/node-v16.20.2-linux-ppc64le/bin:$PATH' >> ~/.bashrc
-    source ~/.bashrc
-
+    sudo -- sh -c 'cd /tmp && curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - && \
+        yum install -y nodejs npm'
     # sqlite3 install
-    sudo TOOLS_HOME=${TOOLS_HOME} -- sh -c 'mkdir -p ${TOOLS_HOME} && \
-      cd ${TOOLS_HOME} && \
-      curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-      tar zxvf sqlite-autoconf-3350500.tar.gz && \
-      cd sqlite-autoconf-3350500 && \
-      ./configure --prefix=${TOOLS_HOME}/sqlite && make && make install'
-    export LD_LIBRARY_PATH=${TOOLS_HOME}/sqlite/lib:/usr/local/lib:$LD_LIBRARY_PATH
+    sudo -- sh -c 'cd /tmp && curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
+        tar zxvf sqlite-autoconf-3350500.tar.gz && \
+        cd sqlite-autoconf-3350500 && \
+        ./configure --prefix=/opt/sqlite3 && make && make install'
     # python3.8 re install for sqlite3 3.35.5 or higher version
-    sudo LD_LIBRARY_PATH=/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_LIBRARY_PATH \
-         LD_RUN_PATH=/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_RUN_PATH \
-         -- sh -c 'curl -o Python-3.8.13.tgz https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz && \
+    sudo LD_LIBRARY_PATH=/opt/sqlite3/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_LIBRARY_PATH \
+         LD_RUN_PATH=/opt/sqlite3/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_RUN_PATH \
+         -- sh -c 'cd /tmp && curl -o Python-3.8.13.tgz https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz && \
       tar zxvf Python-3.8.13.tgz && \
       cd Python-3.8.13 && \
       ./configure --enable-shared --prefix=/opt/cloudera/cm-agent && \
-      make install'
+      make altinstall'
+
+    export SQLITE3_PATH=/opt/sqlite3/bin/sqlite3
+    export PYTHON38_PATH="/opt/cloudera/cm-agent"
+
+    pip_bin="${PYTHON38_PATH}/bin/pip3.8"
+    export VIRTUAL_ENV_VERSION="20.19.0"
+
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}''
+    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
     sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
   fi
 }
 
-function redhat8_ppc_install() {
+function redhat8_install() {
   if [[ $FORCEINSTALL -eq 1 ]]; then
     # pre-req install
     sudo -- sh -c 'yum install -y \
-      python38 \
-      python38-libs \
-      python38-devel \
-      python38-numpy \
-      python38-PyMySQL \
-      python38-cryptography \
-      python38-cffi \
-      python38-psycopg2 \
-      python38-Cython \
-      python38-lxml \
+      java-11-openjdk \
       java-11-openjdk-devel \
       java-11-openjdk-headless \
       krb5-workstation \
+      ncurses-devel \
       nmap-ncat \
       xmlsec1 \
       xmlsec1-openssl \
       libss \
-      ncurses-devel'
+      ncurses-c++-libs \
+      python3-devel \
+      postgresql-devel'
     # Ensure pg_config is available
     export PG_CONFIG=$(which pg_config)
     if [ -z "$PG_CONFIG" ]; then
@@ -135,39 +195,72 @@ function redhat8_ppc_install() {
     echo "PG_CONFIG is set to $PG_CONFIG"
     # MySQLdb install
     sudo -- sh -c 'yum install -y python3-mysqlclient'
-    # NODEJS install
-    sudo sh -c 'curl -fsSL https://nodejs.org/dist/v20.11.0/node-v20.11.0-linux-ppc64le.tar.gz -o node-v20.11.0-linux-ppc64le.tar.gz && \
-      mkdir -p /usr/local/lib/nodejs && \
-      tar -xzf node-v20.11.0-linux-ppc64le.tar.gz -C /usr/local/lib/nodejs'
-    echo 'export PATH=/usr/local/lib/nodejs/node-v20.11.0-linux-ppc64le/bin:$PATH' >> ~/.bashrc
-    source ~/.bashrc
+    # NODEJS 20 install
+    sudo -- sh -c 'cd /tmp && curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - && \
+      yum install -y nodejs'
+
+    if ! is_supported_python_version "$PYTHON311_PATH/bin/python3.11" $REQ_PYTHON311; then
+      install_python311 "redhat8" "$REQ_PYTHON311"
+    fi
+
+    export pip_bin=${PYTHON311_PATH}/bin/pip3.11
+    export VIRTUAL_ENV_VERSION="20.30.0"
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo TOOLS_HOME=${TOOLS_HOME} -- sh -c 'mkdir -p ${TOOLS_HOME} && \
-      cd ${TOOLS_HOME} && \
-      curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-      tar zxvf sqlite-autoconf-3350500.tar.gz && \
-      cd sqlite-autoconf-3350500 && \
-      ./configure --prefix=${TOOLS_HOME}/sqlite && make && make install'
-    export LD_LIBRARY_PATH=${TOOLS_HOME}/sqlite/lib:/usr/local/lib:$LD_LIBRARY_PATH
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
   fi
 }
 
-function redhat9_ppc_install() {
+function redhat8_arm64_install() {
   if [[ $FORCEINSTALL -eq 1 ]]; then
     # pre-req install
     sudo -- sh -c 'yum install -y \
+      java-11-openjdk \
       java-11-openjdk-devel \
       java-11-openjdk-headless \
       krb5-workstation \
+      ncurses-devel \
       nmap-ncat \
       xmlsec1 \
       xmlsec1-openssl \
       libss \
-      ncurses-devel'
+      ncurses-c++-libs'
+    # MySQLdb install
+    sudo -- sh -c 'yum install -y python3-mysqlclient'
+    # NODEJS 20 install
+    sudo -- sh -c 'cd /tmp && curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - && \
+      yum install -y nodejs'
+    # Pip modules install
+
+    if ! is_supported_python_version "$PYTHON311_PATH/bin/python3.11" $REQ_PYTHON311; then
+      install_python311 "redhat8-arm64" "$REQ_PYTHON311"
+    fi
+
+    export pip_bin=${PYTHON311_PATH}/bin/pip3.11
+    export VIRTUAL_ENV_VERSION="20.30.0"
+    # Pip modules install
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install psycopg2-binary==2.9.6'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
+  fi
+}
+
+function redhat9_install() {
+  if [[ $FORCEINSTALL -eq 1 ]]; then
+    # pre-req install
+    sudo -- sh -c 'yum install -y \
+      java-11-openjdk \
+      java-11-openjdk-devel \
+      java-11-openjdk-headless \
+      krb5-workstation \
+      ncurses-devel \
+      nmap-ncat \
+      xmlsec1 \
+      xmlsec1-openssl \
+      libss \
+      ncurses-c++-libs \
+      postgresql-devel'
     # Ensure pg_config is available
     export PG_CONFIG=$(which pg_config)
     if [ -z "$PG_CONFIG" ]; then
@@ -177,24 +270,20 @@ function redhat9_ppc_install() {
     echo "PG_CONFIG is set to $PG_CONFIG"
     # MySQLdb install
     sudo -- sh -c 'yum install -y python3-mysqlclient'
-    # NODEJS install
-    sudo sh -c 'curl -fsSL https://nodejs.org/dist/v20.11.0/node-v20.11.0-linux-ppc64le.tar.gz -o node-v20.11.0-linux-ppc64le.tar.gz && \
-      mkdir -p /usr/local/lib/nodejs && \
-      tar -xzf node-v20.11.0-linux-ppc64le.tar.gz -C /usr/local/lib/nodejs'
-    echo 'export PATH=/usr/local/lib/nodejs/node-v20.11.0-linux-ppc64le/bin:$PATH' >> ~/.bashrc
-    source ~/.bashrc
+    # NODEJS 20 install
+    sudo -- sh -c 'cd /tmp && curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - && \
+      yum install -y nodejs'
+
+    if ! is_supported_python_version "$PYTHON311_PATH/bin/python3.11" $REQ_PYTHON311; then
+      install_python311 "redhat9" "$REQ_PYTHON311"
+    fi
+
+    export pip_bin=${PYTHON311_PATH}/bin/pip3.11
+    export VIRTUAL_ENV_VERSION="20.30.0"
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo TOOLS_HOME=${TOOLS_HOME} -- sh -c 'mkdir -p ${TOOLS_HOME} && \
-      cd ${TOOLS_HOME} && \
-      curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-      tar zxvf sqlite-autoconf-3350500.tar.gz && \
-      cd sqlite-autoconf-3350500 && \
-      ./configure --prefix=${TOOLS_HOME}/sqlite && make && make install'
-    export LD_LIBRARY_PATH=${TOOLS_HOME}/sqlite/lib:/usr/local/lib:$LD_LIBRARY_PATH
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
   fi
 }
 
@@ -226,17 +315,22 @@ function sles12_install() {
     # NODEJS 16 install
     # Upgrading to node-v16 because of the following CVE's in node-v14 "CVE-2021-3450, CVE-2021-44531, CVE-2023-32004, CVE-2023-32006"
     # Node-v20-LTS is not supported by old OS'es - Redhat7_ppc, Centos7, Ubuntu18, Sles12. So upgrading to node-v16
-    sudo -- sh -c 'zypper install -y npm14 nodejs16'
+    sudo -- sh -c 'zypper install -y npm14 nodejs14'
+
+    pip_bin="${PYTHON38_PATH}/bin/pip3.8"
+    VIRTUAL_ENV_VERSION="20.19.0"
+
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
     sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
     sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
     # sqlite3 install
-    sudo -- sh -c 'curl --insecure -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
+    sudo -- sh -c 'cd /tmp && curl --insecure -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
         tar zxvf sqlite-autoconf-3350500.tar.gz && \
         cd sqlite-autoconf-3350500 && \
-        ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+        ./configure --prefix=/opt/sqlite3 && make && make install'
+    export LD_LIBRARY_PATH=/opt/sqlite3/lib:$LD_LIBRARY_PATH
+    export SQLITE3_PATH=/opt/sqlite3/bin/sqlite3
   fi
 }
 
@@ -266,142 +360,19 @@ function sles15_install() {
     sudo -- sh -c 'zypper install -y libmariadb-devel mariadb-client python3-mysqlclient'
     # NODEJS 18 install
     sudo -- sh -c 'zypper install -y nodejs18 npm20'
-    # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo -- sh -c 'curl --insecure -o sqlite-autoconf-3450000.tar.gz https://sqlite.org/2024/sqlite-autoconf-3450000.tar.gz && \
-        tar zxvf sqlite-autoconf-3450000.tar.gz && \
-        cd sqlite-autoconf-3450000 && \
-        ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
-  fi
-}
+    sudo -- sh -c 'rm -f /usr/local/bin/node && ln -s /usr/bin/node18 /usr/local/bin/node'
+    sudo -- sh -c 'rm -f /usr/local/bin/npm && ln -s /usr/bin/npm20 /usr/local/bin/npm'
 
-function centos7_install() {
-  if [[ $FORCEINSTALL -eq 1 ]]; then
-    # pre-req install
-    sudo -- sh -c 'yum install -y cyrus-sasl-gssapi \
-      cyrus-sasl-plain \
-      java-11-openjdk \
-      java-11-openjdk-devel \
-      java-11-openjdk-headless \
-      krb5-workstation \
-      libpcap \
-      ncurses-devel \
-      nmap-ncat \
-      xmlsec1 \
-      xmlsec1-openssl \
-      unzip \
-      python3-devel \
-      postgresql-devel'
-    # Ensure pg_config is available
-    export PG_CONFIG=$(which pg_config)
-    if [ -z "$PG_CONFIG" ]; then
-      echo "Error: pg_config not found. Ensure PostgreSQL development libraries are installed."
-      exit 1
+    if ! is_supported_python_version "$PYTHON311_PATH/bin/python3.11" $REQ_PYTHON311; then
+      install_python311 "sles15" "$REQ_PYTHON311"
     fi
-    echo "PG_CONFIG is set to $PG_CONFIG"
-    # MySQLdb install
-    sudo -- sh -c 'curl -sSLO https://cloudera-build-us-west-1.vpc.cloudera.com/s3/ARTIFACTS/mysql80-community-release-el7-11.noarch.rpm && \
-        rpm -ivh mysql80-community-release-el7-11.noarch.rpm && \
-        yum install -y mysql-community-libs mysql-community-client-plugins mysql-community-common'
-    # NODEJS 16 install
-    # Upgrading to node-v16 because of the following CVE's in node-v14 "CVE-2021-3450, CVE-2021-44531, CVE-2023-32004, CVE-2023-32006"
-    # Node-v20-LTS is not supported by old OS'es - Redhat7_ppc, Centos7, Ubuntu18, Sles12. So upgrading to node-v16
-    sudo -- sh -c 'curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - && \
-        yum install -y nodejs npm'
-    # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-        tar zxvf sqlite-autoconf-3350500.tar.gz && \
-        cd sqlite-autoconf-3350500 && \
-        ./configure --prefix=/usr/local/ && make && make install'
-    # python3.8 re install for sqlite3 3.35.5 or higher version
-    sudo LD_LIBRARY_PATH=/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_LIBRARY_PATH \
-         LD_RUN_PATH=/usr/local/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_RUN_PATH \
-         -- sh -c 'curl -o Python-3.8.13.tgz https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz && \
-      tar zxvf Python-3.8.13.tgz && \
-      cd Python-3.8.13 && \
-      ./configure --enable-shared --prefix=/opt/cloudera/cm-agent && \
-      make install'
-    # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-  fi
-}
-
-function redhat8_install() {
-  if [[ $FORCEINSTALL -eq 1 ]]; then
-    # pre-req install
-    sudo -- sh -c 'yum install -y \
-      java-11-openjdk \
-      java-11-openjdk-devel \
-      java-11-openjdk-headless \
-      krb5-workstation \
-      ncurses-devel \
-      nmap-ncat \
-      xmlsec1 \
-      xmlsec1-openssl \
-      libss \
-      ncurses-c++-libs \
-      python3-devel \
-      postgresql-devel'
-    # Ensure pg_config is available
-    export PG_CONFIG=$(which pg_config)
-    if [ -z "$PG_CONFIG" ]; then
-      echo "Error: pg_config not found. Ensure PostgreSQL development libraries are installed."
-      exit 1
-    fi
-    echo "PG_CONFIG is set to $PG_CONFIG"
-    # MySQLdb install
-    sudo -- sh -c 'yum install -y python3-mysqlclient'
-    # NODEJS 20 install
-    sudo -- sh -c 'curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - && \
-      yum install -y nodejs'
-    # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-      tar zxvf sqlite-autoconf-3350500.tar.gz && \
-      cd sqlite-autoconf-3350500 && \
-      ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
-  fi
-}
 
-function redhat8_arm64_install() {
-  if [[ $FORCEINSTALL -eq 1 ]]; then
-    # pre-req install
-    sudo -- sh -c 'yum install -y \
-      java-11-openjdk \
-      java-11-openjdk-devel \
-      java-11-openjdk-headless \
-      krb5-workstation \
-      ncurses-devel \
-      nmap-ncat \
-      xmlsec1 \
-      xmlsec1-openssl \
-      libss \
-      ncurses-c++-libs'
-    # MySQLdb install
-    sudo -- sh -c 'yum install -y python3-mysqlclient'
-    # NODEJS 20 install
-    sudo -- sh -c 'curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - && \
-      yum install -y nodejs'
+    export pip_bin=${PYTHON311_PATH}/bin/pip3.11
+    export VIRTUAL_ENV_VERSION="20.30.0"
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2-binary==2.9.6'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-      tar zxvf sqlite-autoconf-3350500.tar.gz && \
-      cd sqlite-autoconf-3350500 && \
-      ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
   fi
 }
 
@@ -447,18 +418,23 @@ function ubuntu18_install() {
     # NODEJS 16 install
     # Upgrading to node-v16 because of the following CVE's in node-v14 "CVE-2021-3450, CVE-2021-44531, CVE-2023-32004, CVE-2023-32006"
     # Node-v20-LTS is not supported by old OS'es - Redhat7_ppc, Centos7, Ubuntu18, Sles12. So upgrading to node-v16
-    sudo -- sh -c 'curl -sL https://deb.nodesource.com/setup_16.x | sudo bash - && \
+    sudo -- sh -c 'cd /tmp && curl -sL https://deb.nodesource.com/setup_16.x | sudo bash - && \
       apt -y install nodejs'
+
+    pip_bin="${PYTHON38_PATH}/bin/pip3.8"
+    VIRTUAL_ENV_VERSION="20.19.0"
+
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
     sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
     sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
     # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
+    sudo -- sh -c 'cd /tmp && curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
         tar zxvf sqlite-autoconf-3350500.tar.gz && \
         cd sqlite-autoconf-3350500 && \
-        ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+        ./configure --prefix=/opt/sqlite3 && make && make install'
+    export LD_LIBRARY_PATH=/opt/sqlite3/lib:$LD_LIBRARY_PATH
+    export SQLITE3_PATH=/opt/sqlite3/bin/sqlite3
   fi
 }
 
@@ -504,18 +480,40 @@ function ubuntu20_install() {
     # It is pre-installed
     # NODEJS 20 install
     sudo -- sh -c 'apt-get install -y curl && \
-      curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && \
+      cd /tmp && curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && \
       apt-get install -y nodejs'
+
+    # sqlite3 install
+    sudo -- sh -c 'cd /tmp && curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
+        tar zxvf sqlite-autoconf-3350500.tar.gz && \
+        cd sqlite-autoconf-3350500 && \
+        ./configure --prefix=/opt/sqlite3 && make && make install'
+    # python3.8 re install for sqlite3 3.35.5 or higher version
+    sudo LD_LIBRARY_PATH=/opt/sqlite3/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_LIBRARY_PATH \
+         LD_RUN_PATH=/opt/sqlite3/lib:$ORACLE_INSTANTCLIENT19_PATH:$LD_RUN_PATH \
+         -- sh -c 'cd /tmp && curl -o Python-3.8.13.tgz https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz && \
+      tar zxvf Python-3.8.13.tgz && \
+      cd Python-3.8.13 && \
+      ./configure --enable-shared --prefix=/opt/cloudera/cm-agent && \
+      make altinstall'
+
+    export SQLITE3_PATH=/opt/sqlite3/bin/sqlite3
+    export PYTHON38_PATH="/opt/cloudera/cm-agent"
+
+    export pip_bin="${PYTHON38_PATH}/bin/pip3.8"
+    VIRTUAL_ENV_VERSION="20.19.0"
+
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
     sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
     sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
     # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
+    sudo -- sh -c 'cd /tmp && curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
         tar zxvf sqlite-autoconf-3350500.tar.gz && \
         cd sqlite-autoconf-3350500 && \
-        ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+        ./configure --prefix=/opt/sqlite3 && make && make install'
+    export LD_LIBRARY_PATH=/opt/sqlite3/lib:$LD_LIBRARY_PATH
+    export SQLITE3_PATH=/opt/sqlite3/bin/sqlite3
   fi
 }
 
@@ -535,21 +533,11 @@ function ubuntu22_install() {
         libkrb5-dev'
     sudo -- sh -c "apt -y install \
         ldap-utils \
-        lib${PYTHON_VERSION}-dev \
-        lib${PYTHON_VERSION}-minimal \
-        lib${PYTHON_VERSION}-stdlib \
         libxmlsec1 \
         libxmlsec1-openssl \
         libpq-dev \
         netcat \
         nmap \
-        python3-asn1crypto \
-        python3-cryptography \
-        python3-keyring \
-        python3-psycopg2 \
-        python3-setuptools \
-        python3-wheel \
-        ${PYTHON_VERSION}-venv \
         openssl \
         sudo \
         tar \
@@ -565,57 +553,18 @@ function ubuntu22_install() {
     # It is pre-installed
     # NODEJS 20 install
     sudo -- sh -c 'apt-get install -y curl && \
-      curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && \
+      cd /tmp && curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - && \
       apt-get install -y nodejs'
-    # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3450000.tar.gz https://sqlite.org/2024/sqlite-autoconf-3450000.tar.gz && \
-        tar zxvf sqlite-autoconf-3450000.tar.gz && \
-        cd sqlite-autoconf-3450000 && \
-        ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
-  fi
-}
 
-function redhat9_install() {
-  if [[ $FORCEINSTALL -eq 1 ]]; then
-    # pre-req install
-    sudo -- sh -c 'yum install -y \
-      java-11-openjdk \
-      java-11-openjdk-devel \
-      java-11-openjdk-headless \
-      krb5-workstation \
-      ncurses-devel \
-      nmap-ncat \
-      xmlsec1 \
-      xmlsec1-openssl \
-      libss \
-      ncurses-c++-libs \
-      postgresql-devel'
-    # Ensure pg_config is available
-    export PG_CONFIG=$(which pg_config)
-    if [ -z "$PG_CONFIG" ]; then
-      echo "Error: pg_config not found. Ensure PostgreSQL development libraries are installed."
-      exit 1
+    if ! is_supported_python_version "$PYTHON311_PATH/bin/python3.11" $REQ_PYTHON311; then
+      install_python311 "ubuntu22" "$REQ_PYTHON311"
     fi
-    echo "PG_CONFIG is set to $PG_CONFIG"
-    # MySQLdb install
-    sudo -- sh -c 'yum install -y python3-mysqlclient'
-    # NODEJS 20 install
-    sudo -- sh -c 'curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash - && \
-      yum install -y nodejs'
+
+    export pip_bin=${PYTHON311_PATH}/bin/pip3.11
+    export VIRTUAL_ENV_VERSION="20.30.0"
     # Pip modules install
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable=='${VIRTUAL_ENV_RELOCATABLE_VERSION}' mysqlclient==2.1.1'
-    sudo pip_bin=${pip_bin} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
-    sudo pip_bin=${pip_bin} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
-    # sqlite3 install
-    sudo -- sh -c 'curl -o sqlite-autoconf-3350500.tar.gz https://sqlite.org/2021/sqlite-autoconf-3350500.tar.gz && \
-      tar zxvf sqlite-autoconf-3350500.tar.gz && \
-      cd sqlite-autoconf-3350500 && \
-      ./configure --prefix=/usr/local/ && make && make install'
-    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install virtualenv=='${VIRTUAL_ENV_VERSION}' virtualenv-make-relocatable==0.0.1 mysqlclient==2.1.1'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c '${pip_bin} install psycopg2==2.9.6 --global-option=build_ext --global-option="--pg-config=$PG_CONFIG"'
+    sudo pip_bin=${pip_bin} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} -- sh -c 'ln -fs ${pip_bin} $(dirname ${pip_bin})/pip'
   fi
-}
+}