#!/bin/bash

ARCH=`uname -i`
ARGS="$@"

echo "This is an upgrade script for CentOS/Fedora."
echo "WARNING: Use with caution!"

if [ ! "$ARGS" = "-y" ]; then
  echo "Press ENTER to continue or CTRL+C to stop."
  read enter
fi

upgrade_centos() {
  CENTOS_RELEASE=`rpm -E %rhel`
  CENTOS_NEXT=$((CENTOS_RELEASE+1))
  if [ "$CENTOS_RELEASE" = "6" ]; then
    yum install --enablerepo=upg -y \
      redhat-upgrade-tool preupgrade-assistant-contents
    # fix dependency problems
    rpm -e --nodeps --justdb pcre grep openldap vim-minimal \
      nss nspr nss-util
    #  elfutils-libelf elfutils-libs nss nspr nss-util
    # downgrade some packages for compatibility
    #yum downgrade -y \
    #  http://vault.centos.org/6.7/os/x86_64/Packages/elfutils-libelf-0.161-3.el6.x86_64.rpm \
    #  http://vault.centos.org/6.7/os/x86_64/Packages/elfutils-libs-0.161-3.el6.x86_64.rpm
    # import keys
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Security-6
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
    # run preupgrade
    UPG=`preupg -l`
    if [ "$ARGS" = "-y" ]; then
      upgrade_force="--force"
      upgrade_tool_reboot="--reboot"
    fi
    preupg -s $UPG $upgrade_force
    if [ ! "$ARGS" = "-y" ]; then
      echo "Press ENTER to upgrade or CTRL+C to stop."
      read enter
    fi
    PUD=/root/preupgrade/postupgrade.d
    # upgrade other pkgs after base upgrade
    mkdir -p $PUD/salpack
    (
      echo "#!/bin/bash"
      echo ""
      echo "/usr/sbin/salpack-os-upgrade -y"
    ) > $PUD/salpack/salpack.sh
    # fix broken library problems
    mkdir -p $PUD/0salpack
    (
      echo "#!/bin/bash"
      echo ""
      echo "cp -avf $PUD/0salpack/*.so /usr/lib64/"
      echo "/sbin/ldconfig -v"
    ) > $PUD/0salpack/salpack.sh
    for lib in libelf-0.163.so; do
      curl http://work.salstar.sk/public/c/$lib > $PUD/0salpack/$lib
    done
    chmod +x $PUD/*salpack/*.sh
    # run regular update
    centos-upgrade-tool-cli --network $CENTOS_NEXT \
      --instrepo=http://ftp.upjs.sk/pub/centos/$CENTOS_NEXT/os/$ARCH/ \
      --enablerepo="salstar.sk" \
      --cleanup-post $upgrade_tool_reboot $upgrade_force
      #--addrepo="epel$CENTOS_NEXT=http://ftp.upjs.sk/pub/mirrors/epel/$CENTOS_NEXT/$ARCH/" \
      #--enablerepo="epel$CENTOS_NEXT" \
  elif [ "$CENTOS_RELEASE" = "7" ]; then
    # try to finish upgrade
    yum remove preupgrade-assistant $ARGS
    yum update epel-release --disablerepo=epel $ARGS
    yum clean all
    yum distro-sync $ARGS --disablerepo=epel --exclude=salpack\*
    yum update $ARGS
  else
    echo "Unknown CentOS version [$CENTOS_RELEASE]!"
    exit 2
  fi
}

dnf_upgrade() {
  rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$FEDORA_NEXT-$ARCH
  dnf upgrade $ARGS
  dnf clean all
  dnf --releasever=$FEDORA_NEXT --setopt=deltarpm=false distro-sync $ARGS
  if [ $? = 0 ]; then
    echo "Extra packages after install:"
    dnf list extras
  fi
}

upgrade_fedora() {
  FEDORA_MIRROR=http://ftp.upjs.sk/pub/fedora/linux
  FEDORA_RELEASE=`rpm -E %fedora`
  FEDORA_NEXT=$((FEDORA_RELEASE+1))
  FEDORA_NEXT2=$((FEDORA_RELEASE+2))
  if wget -O /dev/null -q $FEDORA_MIRROR/updates/$FEDORA_NEXT2/; then
    echo "Currently running Fedora $FEDORA_RELEASE."
    echo "Fedora $FEDORA_NEXT2 is already available, do you want to update"
    echo "to Fedora $FEDORA_NEXT2? Type \"y\" or \"yes\" to confirm."
    read yn
    if [ "$yn" = "yes" -o "$yn" = "y" ]; then
      FEDORA_NEXT=$FEDORA_NEXT2
    fi
  fi
  if [ "$FEDORA_RELEASE" -ge "22" ]; then
    dnf_upgrade
  else
    echo "Unknown Fedora release [$FEDORA_RELEASE]!"
    exit 2
  fi
}

if [ -f /etc/centos-release ]; then
  upgrade_centos
elif [ -f /etc/fedora-release ]; then
  if [ -z "$STY" -a -z "$TMUX" ]; then
    echo "Please run this script under screen or tmux."
    exit 1
  fi
  upgrade_fedora
fi
