#!/bin/bash

set -euo pipefail

PKG="$(cd "$(dirname "$0")" && pwd)/glibc-2.34.tar.gz"
DESTDIR="${DESTDIR:-"/"}"
ROLLBACK_DIR="$DESTDIR/usr/lib64/.rollback-2.17"

backup_glibc() {
  cd /usr/lib64 &&
  mkdir -p .rollback-2.17 &&
  ls -l lib*so* | awk '/->/ && /2\.17/ {print $9,$11}' |
  while read -r soname target; do
    /bin/cp -P "$soname" .rollback-2.17/ 2>/dev/null || true
    [[ -f $target ]] && cp -f "$target" .rollback-2.17/ 2>/dev/null || true
  done &&
  cd - >/dev/null
}

rollback_glibc() {
    echo "Rolling back SONAME links ..."
    /bin/cp -P "$ROLLBACK_DIR"/* "$DESTDIR/usr/lib64/" 2>/dev/null || true

    SONAMES=(libm.so.6 libpthread.so.0 librt.so.1 libdl.so.2 libresolv.so.2 libc.so.6 ld-linux-x86-64.so.2)
    LIBS=(libm-2.17.so libpthread-2.17.so librt-2.17.so libdl-2.17.so libresolv-2.17.so libc-2.17.so ld-2.17.so)
    NLIBS=(libm-2.34.so libpthread-2.34.so librt-2.34.so libdl-2.34.so libresolv-2.34.so libc-2.34.so ld-2.34.so)

    cd /usr/lib64 &&
    for i in "${!SONAMES[@]}"; do
      soname=${SONAMES[i]}
      lib=${LIBS[i]}
      nlib=${NLIBS[i]}
      /bin/ln -svf ${lib} ${soname} >/dev/null || sln ${lib} ${soname}
      LD_PRELOAD=/usr/lib64/libc-2.17.so /bin/rm -f "${nlib}"
    done &&
    cd - >/dev/null

    ldconfig
    echo "Rollback complete, current glibc version: $(getconf GNU_LIBC_VERSION)"

    exit 0
}

if [[ "${1:-}" == "--rollback" ]]; then
  [[ -d $ROLLBACK_DIR ]] || { echo "No snapshot found"; exit 1; }
  if ! rollback_glibc; then
    export LD_PRELOAD=/usr/lib64/libc-2.34.so rollback_glibc && continue
    export LD_PRELOAD=/usr/lib64/libc-2.17.so rollback_glibc && continue
    export LD_PRELOAD=/usr/lib64/.rollback-2.17/libc-2.17.so rollback_glibc
  fi
  exit $?
fi

[[ -f $PKG ]] || { echo "Package $PKG not found"; exit 1; }

echo "Backuping to $ROLLBACK_DIR/ ..."
backup_glibc || { echo "Backup glibc failed"; exit 1; }

echo "Unpacking to $DESTDIR/ ..."
tar -C "$DESTDIR" -xzvf "$PKG"

echo "Running ldconfig ..."
if [[ -n "$DESTDIR" ]]; then ldconfig -r "$DESTDIR"; else ldconfig; fi

echo "Generating locale en_US.UTF-8 ..."
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias UTF-8 2>/dev/null || true
# localedef -i en_US -c -f UTF-8 UTF-8
echo "Install complete, current glibc version: $(getconf GNU_LIBC_VERSION)"
