#!/bin/bash

ARCH=`uname -i`

show_help() {
cat << EOF
Usage: $0 [-y] [-s]
	-y - "yes" (do not ask)
	-s - skip update/clean of current OS
EOF
}

for arg in "$@"; do
  case $arg in
    -h|--help)
    	show_help
    	exit 0
    	;;
    -y|--yes)
    	ARG_Y=-y
    	;;
    -s|--skip|--short)
    	ARG_S=yes
    	;;
    -d|--downloadonly)
	ARG_D=--downloadonly
  esac
done

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

if [ ! "$ARG_Y" = "-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 openscap-1.0.8
    # fix dependency problems
    for i in pcre grep openldap vim-minimal nss nspr nss-util; do
      rpm -e --nodeps --justdb -v $i
    done
    #  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 [ "$ARG_Y" = "-y" ]; then
      upgrade_force="--force"
      upgrade_tool_reboot="--reboot"
    fi
    preupg -s $UPG $upgrade_force
    if [ ! "$ARG_Y" = "-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"
      #echo "rpm -Uhv $PUD/0salpack/*.rpm --force"
    ) > $PUD/0salpack/salpack.sh
    for lib in libelf-0.163.so; do
      curl http://work.salstar.sk/public/c/$lib > $PUD/0salpack/$lib
    done
    #for rpm in elfutils-libelf-0.163-3.el7.x86_64.rpm; do
    #  curl http://ftp.upjs.sk/pub/centos/7/os/x86_64/Packages/$rpm > $PUD/0salpack/$rpm
    #done
    chmod +x $PUD/*salpack/*.sh
    # run regular update
    if [ -z "$CENTOS_REPO" ]; then
      CENTOS_REPO=http://ftp.upjs.sk/pub/centos/$CENTOS_NEXT/os/$ARCH/
    elif [ "$CENTOS_REPO" = "7.2" ]; then
      CENTOS_VER=7.2.1511
      CENTOS_REPO=http://vault.centos.org/$CENTOS_VER/os/$ARCH/
    fi
    set -x
    centos-upgrade-tool-cli --network $CENTOS_NEXT \
      --instrepo=$CENTOS_REPO \
      --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 $ARG_Y
    yum update epel-release --disablerepo=epel $ARG_Y
    yum clean all
    yum distro-sync $ARG_Y --disablerepo=epel --exclude=salpack\*
    yum update $ARG_Y
  else
    echo "Unknown CentOS version [$CENTOS_RELEASE]!"
    exit 2
  fi
}

dnf_upgrade() {
  echo "Running upgrade ..."
  rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$FEDORA_NEXT-$ARCH
  if [ ! "ARG_S" ]; then
    echo "Upgrading and cleaning current system ..."
    dnf upgrade $ARG_Y
    dnf clean all
  fi
  echo "Upgrading to version $FEDORA_NEXT ..."
  echo "dnf --releasever=$FEDORA_NEXT --setopt=deltarpm=false distro-sync $ARG_Y $ARG_D"
  dnf --releasever=$FEDORA_NEXT --setopt=deltarpm=false distro-sync $ARG_Y $ARG_D
  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."
    if [ "$ARG_Y" = "-y" ]; then
      yn="yes"
    else
      read yn
    fi
    echo "Answer: $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
