#!/bin/bash


#Preupgrade Assistant performs system upgradability assessment
#and gathers information required for successful operating system upgrade.
#Copyright (C) 2013 Red Hat Inc.
#Ondrej Vasik <ovasik@redhat.com>, 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
check_rpm_to "" ""
#END GENERATED SECTION

[ ! -f "$VALUE_RPM_RHSIGNED" ] || [ ! -r "$COMMON_DIR" ] && {
  log_error "Generic common part of the module is missing."
  exit $RESULT_ERROR
}

BumpedLibs=$(mktemp .BumpedLibsXXX --tmpdir=/tmp)
sonamed_tmp=$(mktemp .sonamed_tmpXXX --tmpdir=/tmp)
cat $(ls "$COMMON_DIR"/default*_soversioned*bumped* | grep -v debug) \
  | sort | uniq  > "$BumpedLibs"

[ ! -r "$BumpedLibs" ] || [ ! -r "$sonamed_tmp" ] && {
  log_error "Generic part of the module is missing."
  rm -f "$BumpedLibs" "$sonamed_tmp"
  exit $RESULT_ERROR
}

# when migrate only - set just medium risk
# NOTE: May it should be  always only medium risk in both cases, but don't know
# if some troubles can appear during upgrade in some unknwown-special cases
# e.g. some pkg from 3rd party repository needs old lib and break transaction
# - should be discussed/tested before this next change
tmp_log_risk=$([ $UPGRADE -eq 1 ] && echo "log_high_risk" || echo "log_medium_risk")

found=0
rm -f solution.txt >/dev/null
echo \
"Applications developed in the C programming language may use dynamic libraries (.so files) to reuse the
common functions or symbols in the binary. If a library bumped its soname (
changed major version, API/ABI incompatibility), the applications that depend on
the library might not run.
Some of the libraries changed their soname version between Red Hat Enterprise
Linux 6 and Red Hat Enterprise Linux 7.

From your Red Hat Enterprise Linux 6 packages, the following libraries changed their soname:
" >solution.txt


#Check for soname bumps and report them for RH packages installed on the system
while read line; do
  npkgs="$(echo "$line" | cut -d ":" -f2 | cut -sd "|" -f2)"
  old_lib="$(echo "$line" | cut -d':' -f1)"
  new_lib="$(echo "$line" | cut -d':' -f3)"

  for pkg in $(echo $line | cut -d':' -f2 | cut -d "|" -f1 | sed -e 's/,/ /g')
  do
    #skip non-rh and unavailable packages
    is_pkg_installed "$pkg" && is_dist_native "$pkg" || {
      rpm -q $pkg >/dev/null 2>&1 \
        && log_debug "The $pkg package was skipped - installed but not signed." \
        || log_debug "The $pkg package was skipped."
      continue
    }
    pkgs_msg=""

    rq_msg=" (required by packages not signed by Red Hat:"
    for l in $(rpm -q --whatrequires $pkg | grep -v "no package requires" | \
     rev | cut -d'-' -f3- | rev)
    do
      is_pkg_installed "$l" || continue
      is_dist_native "$l" || rq_msg="$rq_msg$l "
    done
    rq_msg="${rq_msg% })"

    [ -n "$npkgs" ] && [[ "$pkg" !=  "$npkgs" ]] \
      && pkgs_msg=" (in Red Hat Enterprise Linux 7 available in: $npkgs)"
    [ "$rq_msg" == " (required by packages not signed by Red Hat:)" ] && rq_msg=""
    [ -n "$rq_msg" ] && $tmp_log_risk "The $pkg$rq_msg library changed its soname between Red Hat Enterprise Linux 6 and Red Hat Enterprise Linux 7 ${pkgs_msg}"
    echo "$old_lib from $pkg$rq_msg changed to $new_lib$pkgs_msg" >>solution.txt
    echo "$old_lib from $pkg$rq_msg changed to $new_lib$pkgs_msg" >>"$sonamed_tmp"
    found=1
  done
done < "$BumpedLibs"

grep required "$sonamed_tmp" >>"$KICKSTART_DIR/SonameBumpedLibs-required"
grep -v required "$sonamed_tmp" | grep -v "^$" >> "$KICKSTART_DIR/SonameBumpedLibs-optional"

rm -f "$sonamed_tmp" "$BumpedLibs"

echo -n "
 * SonameBumpedLibs-required: This file contains all Red Hat Enterprise Linux 6 libraries from your system where the soname version changed. As some of your packages depend on these libraries, rebuild these packages against their corresponding library.
 * SonameBumpedLibs-optional: This file is similar to the SonameBumpedLibs-required file, but in this case no package not signed by Red Hat requires these libraries. It is more of an informational thing for you, so that you can deal with a potential required rebuild.
 " >>"$KICKSTART_README"

echo \
"
The requirements in packages not signed by Red Hat were checked, but for the non
rpm-packaged binaries check the compatibility list yourself
by using, for example, the 'ldd <binary>' command.
If some of your applications use the library on the list above, rebuild such a package or application against the new library.
Applications available in Red Hat Enterprise Linux 7 will handle
these bumps automatically by the update or migration to a new Red Hat Enterprise
Linux because they were built against these libraries already.
" >>solution.txt

[ $found -eq 1 ] && log_medium_risk "\
 Some soname bumps in the libraries installed on the system were detected, which might break the functionality of some of your third-party applications. They might need to be rebuilt, so check their requirements." && \
 exit $RESULT_FAIL

rm -f solution.txt && touch solution.txt

exit $RESULT_PASS
