diff --git a/install-ruby-rvm.sh b/install-ruby-rvm.sh new file mode 100644 index 0000000..b6dea27 --- /dev/null +++ b/install-ruby-rvm.sh @@ -0,0 +1,133 @@ +#!/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 \ No newline at end of file