#!/usr/bin/env bash # Recompile Openssl 1.1.1w on RHEL9+ and install Old Rubies # Mateusz GruszczyƄski @linuxiarz.pl set -eo pipefail OPENSSL_VERSION="1.1.1w" OPENSSL_PREFIX="/opt/openssl111" SRC_DIR="/usr/local/src" if [ "${EUID}" -ne 0 ]; then echo "ERROR: run this script as root" exit 1 fi if [ $# -ne 1 ]; then echo "Usage: $0 2.7.X" exit 1 fi RUBY_VERSION="$1" if [[ ! "${RUBY_VERSION}" =~ ^2\.7\.[0-9]+$ ]]; then echo "ERROR: only Ruby 2.7.X is allowed" echo "Example: $0 2.7.8" exit 1 fi load_rvm() { if [ -s /etc/profile.d/rvm.sh ]; then . /etc/profile.d/rvm.sh elif [ -s /usr/local/rvm/scripts/rvm ]; then . /usr/local/rvm/scripts/rvm elif [ -s /root/.rvm/scripts/rvm ]; then . /root/.rvm/scripts/rvm else echo "ERROR: RVM was not found" exit 1 fi if ! command -v rvm >/dev/null 2>&1; then echo "ERROR: RVM is not available in this shell" exit 1 fi } ruby_already_installed() { if command -v ruby >/dev/null 2>&1; then current_ruby_version="$(ruby -e 'print RUBY_VERSION' 2>/dev/null || true)" if [ "${current_ruby_version}" = "${RUBY_VERSION}" ]; then echo "Ruby ${RUBY_VERSION} is already available in PATH" return 0 fi fi if rvm list strings | grep -Fxq "ruby-${RUBY_VERSION}"; then echo "Ruby ${RUBY_VERSION} is already installed in RVM" return 0 fi return 1 } install_build_dependencies() { echo "[1/6] Installing build dependencies" dnf groupinstall -y "Development Tools" dnf install -y \ curl tar xz bzip2 git perl-core pkgconfig \ zlib-devel readline-devel libyaml-devel libffi-devel \ gdbm-devel ncurses-devel gmp-devel autoconf automake libtool bison } install_openssl() { echo "[2/6] Preparing OpenSSL ${OPENSSL_VERSION}" mkdir -p "${SRC_DIR}" mkdir -p "${OPENSSL_PREFIX}" cd "${SRC_DIR}" if [ ! -f "openssl-${OPENSSL_VERSION}.tar.gz" ]; then curl -fLO "https://www.openssl.org/source/old/1.1.1/openssl-${OPENSSL_VERSION}.tar.gz" fi rm -rf "openssl-${OPENSSL_VERSION}" tar xf "openssl-${OPENSSL_VERSION}.tar.gz" cd "openssl-${OPENSSL_VERSION}" echo "[3/6] Building OpenSSL into ${OPENSSL_PREFIX}" ./config \ --prefix="${OPENSSL_PREFIX}" \ --openssldir="${OPENSSL_PREFIX}" \ shared zlib make -j"$(nproc)" rm -rf "${OPENSSL_PREFIX:?}/"* make install_sw } install_ruby_with_rvm() { echo "[4/6] Configuring RVM build environment" rvm autolibs disable export CPPFLAGS="-I${OPENSSL_PREFIX}/include" export CFLAGS="-I${OPENSSL_PREFIX}/include" export LDFLAGS="-L${OPENSSL_PREFIX}/lib -Wl,-rpath,${OPENSSL_PREFIX}/lib" export PKG_CONFIG_PATH="${OPENSSL_PREFIX}/lib/pkgconfig" export RUBY_CONFIGURE_OPTS="--with-openssl-dir=${OPENSSL_PREFIX}" echo "[5/6] Installing Ruby ${RUBY_VERSION} with RVM" rvm install "${RUBY_VERSION}" --with-openssl-dir="${OPENSSL_PREFIX}" } verify_installation() { echo "[6/6] Verifying installation" rvm use "${RUBY_VERSION}" >/dev/null installed_ruby_version="$(ruby -e 'print RUBY_VERSION')" installed_openssl_version="$(ruby -ropenssl -e 'print OpenSSL::OPENSSL_VERSION')" echo "Installed Ruby version: ${installed_ruby_version}" echo "Linked OpenSSL version: ${installed_openssl_version}" } load_rvm if ruby_already_installed; then echo "Nothing to do" exit 0 fi install_build_dependencies install_openssl install_ruby_with_rvm verify_installation