#!/bin/bash

#Preupgrade Assistant performs system upgradability assessment
#and gathers information required for successful operating system upgrade.
#Copyright (C) 2013 Red Hat Inc.
#Petr Stodulka <pstodulk@redhat.com>
#
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program.  If not, see <http://www.gnu.org/licenses/>.
. /usr/share/preupgrade/common.sh
#END GENERATED SECTION

rm -f solution.txt
touch solution.txt

#[ -f "/etc/centos-release" ] || {
#  log_error "Could not determine version. Is this really CentOS 6?"
#  exit_error
#}

[ -f "versions" ] || {
  log_error "SystemVersion" "File 'versions' not found."
  exit $RESULT_ERROR
}

# first line in versions contains last CentOS 6 release
rhel_latest=$(cat versions | head -n 1 | grep "#\s*release:" | grep -oE "6\.[0-9][0-9]?")

[ -n "$rhel_latest" ] || {
  log_error "SystemVersion" "wrong file format: versions"
  exit $RESULT_ERROR
}

QUERY_FORMAT="%{NAME}-%{VERSION}-%{RELEASE}\n"
MISSING_VARIANT_MSG="The variant of your system was not detected. The upgrade or migration
without required packages is not supported. Install the
centos-release package and then run 'preupg' again. Type:

# yum install centos-release && preupg
"
UNSUPPORTED_VARIANT_MSG="Only the upgrade of CentOS Server
variant is supported at the moment. The upgrade of Workstation and Client variants
is not supported."

if [ $UPGRADE -eq 1 ]; then
  local_log_risk="log_extreme_risk"
  ERROR_MSG="For a successful upgrade you need the latest release of CentOS 6 system. Update
your system to the latest CentOS 6 release and then run 'preupg' again."
else
  local_log_risk="log_high_risk"
  ERROR_MSG="For the best result of the migration to the target system it is recommended
(but not required) to update your system to the CentOS $rhel_latest release first,
and then run 'preupg' again."
fi

check_variant_release() {
  [ $UPGRADE -eq 1 ] && {
    grep -qE "CentOS release" "/etc/centos-release" || {
      $local_log_risk "This system is $(cat /etc/centos-release)."
      $local_log_risk "Only the upgrade of the latest version of CentOS 6 Server is supported."
      echo "$UNSUPPORTED_VARIANT_MSG" >> solution.txt
      exit $RESULT_FAIL
    }
  }

  # check if the system is the last release version of CentOS-6.x
  rhel_version=$(cat /etc/centos-release | sed -r "s/[a-zA-Z ]+([0-9.]+).*/\1/")
  [ "$rhel_version" != "$rhel_latest" ] && {
    $local_log_risk "This is not the latest CentOS $rhel_latest release."
    echo "$ERROR_MSG" >> solution.txt
    exit $RESULT_FAIL
  }
}

get_variant_by_yum() {
  yum_ttmp="$(yum search centos-release | grep -E "^redhat\-release\-.*")"
  [ -n "$yum_ttmp" ] || return 1

  echo "Server"
  return 0
}

if [ -f "/etc/centos-release" ]; then
  check_variant_release
else
  VARIANT="$(get_variant_by_yum)"
  [ -n "$VARIANT" ] || {
    log_extreme_risk "The system variant was not detected. The centos-release package is missing."
    echo "$MISSING_VARIANT" >> solution.txt
    exit $RESULT_FAIL
  }

  echo $VARIANT | grep -qE "Server" || {
    $local_log_risk "This system is CentOS $Variant 6."
    $local_log_risk "Only the upgrade of the latest version of CentOS 6 Server is supported."
    echo "$UNSUPPORTED_VARIANT_MSG" >> solution.txt
    exit $RESULT_FAIL
  }
fi

# check NVR of some core packages
while read line; do
  echo $line | grep -q "^\s*#"
  [ $? -eq 0 ] && continue # comment lines
  [ -n "$line" ] || continue # empty line

  pkgname=$(echo $line | cut -d "=" -f 1 | sed -e "s/^\s*//" -e "s/\s*$//")
  pkg_nvr=$(echo $line | cut -d "=" -f 2 | sed -e "s/^\s*//" -e "s/\s*$//")

  # head because of multilib pkgs..you know.. x86_64 and i686 versions installed at once...
  pkg_nvr_installed=$(rpm -q --qf "${QUERY_FORMAT}" $pkgname | sort -Vr | head -n 1)
  [ $? -ne 0 ] && {
    log_error "The $pkgname package is not installed, or there is a different problem with the rpm utility."
    exit $RESULT_ERROR
  }

  ./rpmdev-vercmp "$pkg_nvr" "$pkg_nvr_installed" > /dev/null
  status=$?
  [ $status -ne 0 ] && [ $status -ne 11 ] && [ $status -ne 12 ] && {
    log_error "Versions of RPMs cannot be compared."
    exit $RESULT_ERROR
  }

  [ $status -eq 11 ] && {
    $local_log_risk "This is not the latest CentOS 6 release."
    echo "$ERROR_MSG" >> solution.txt
    exit $RESULT_FAIL
  }
done < versions

PREUPGRADE_DIR="$VALUE_TMP_PREUPGRADE/preupgrade-scripts"
RELEASE_FILE="release_version"
if [[ -f "$COMMON_DIR/$RELEASE_FILE" ]]; then
    cp $COMMON_DIR/$RELEASE_FILE $PREUPGRADE_DIR/$RELEASE_FILE
fi

exit $RESULT_PASS

