#!/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
}

FILENAME_BASIS="RemovedLib"
removed_libs=$(mktemp /tmp/.removedpkgsXXX)
removed_tmp=$(mktemp /tmp/.removedpkgsXXX)
found=0

cat "$COMMON_DIR"/default*_so*-removed  | sed -e 's/ removed /:/g' \
  | sort | uniq >"$removed_libs"

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

rm -f solution.txt >/dev/null
echo \
"Applications developed in C may use dynamic libraries (.so files) to reuse the
common functions or symbols in the binary. If the library is missing, the applications
will not run. Some of the libraries were removed between Red Hat Enterprise Linux 5 and Red Hat Enterprise Linux 7.

The lists of removed libraries from your Red Hat Enterprise Linux 5 packages are
available in the following files:
 [link:${KICKSTART_DIR#$VALUE_TMP_PREUPGRADE/}/${FILENAME_BASIS}-required]
 [link:${KICKSTART_DIR#$VALUE_TMP_PREUPGRADE/}/${FILENAME_BASIS}-optional]
" >solution.txt



#Check for soname removals and report them for RH packages installed
#on the system
line=
while IFS= read line || [ -n "$line" ]; do
  soname_lib="$(echo $line | cut -d':' -f1)"
  for pkg in $(echo $line | cut -d':' -f2 | sed -e 's/,/ /g')
  do
    #skip non-rh and unavailable packages
    is_pkg_installed "$pkg" && is_dist_native "$pkg" || continue
    rq_msg=" (required by NonRH signed package(s):"
    for l in $(rpm -q --whatrequires $pkg | grep -v "no package requires" | \
     rev | cut -d'-' -f3- | rev | sort | uniq)
    do
      is_pkg_installed "$l" || continue
      is_dist_native "$l" || rq_msg="$rq_msg$l "
    done
    rq_msg="${rq_msg% })"

    [ "$rq_msg" == " (required by NonRH signed package(s):)" ] && rq_msg=""
    [ -n "$rq_msg" ] && log_medium_risk "The $soname_lib library from $pkg$rq_msg was removed between Red Hat Enterprise Linux 5 and Red Hat Enterprise Linux 7."

    echo "$soname_lib from $pkg$rq_msg" >>"$removed_tmp"
    found=1
  done
done < "$removed_libs"

grep required "$removed_tmp" | sort | uniq >>"$KICKSTART_DIR/${FILENAME_BASIS}-required"
grep -v required "$removed_tmp" | grep -v "^$" | sort | uniq >> "$KICKSTART_DIR/${FILENAME_BASIS}-optional"

rm -f "$removed_tmp" "$removed_libs"

echo -n "
 * ${FILENAME_BASIS}-required - The file contains all Red Hat Enterprise Linux 5 libraries that were removed in Red Hat Enterprise Linux 7. As some of your packages depend on them, you will need to check for alternative solutions.
 * ${FILENAME_BASIS}-optional - The file is similar to the ${FILENAME_BASIS}-required file, but in this case no package that is not signed by Red Hat requires this. It is more of an informational thing for you so that you can deal with the unavailability of these libraries.
 " >>"$KICKSTART_README"

echo \
"
We checked the requirements in packages not signed by Red Hat, but for the non
RPM-packaged binaries check the compatibility list yourself
by using for example the 'ldd <binary>' command.
If any of your applications use a library from the list above, you might need
to get the .so library from a different place or search for an alternative.
" >>solution.txt

[ $found -eq 1 ] && log_medium_risk \
 "We detected that some .so libraries installed on the system were removed between Red Hat Enterprise Linux 5 and Red Hat Enterprise Linux 7. This might break the functionality of some of your third party applications." \
 && exit $RESULT_FAIL

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

exit $RESULT_PASS
