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

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 the library is missing, the applications
will not run. Some of the libraries were removed between Oracle Linux 6 and Oracle Linux 7.

The following libraries from your installed Oracle Linux 6 packages are not present in Oracle Linux 7:
" >solution.txt

RemovedLibs=$(mktemp .removedpkgsXXX --tmpdir=/tmp)
removed_tmp=$(mktemp .removedpkgsXXX --tmpdir=/tmp)
cat "$COMMON_DIR"/default*_so*-removed  | sed -e 's/ removed /:/g' \
  | sort | uniq >"$RemovedLibs"

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

#Check for soname removals and report them for RH packages installed
#on the system
while read 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 packages not signed by Oracle:"
    for l in $(rpm -q --whatrequires $pkg | grep -v "no package requires" | \
     rev | cut -d'-' -f3- | rev)
    do
      is_pkg_installed "$l" && is_dist_native "$l" || rq_msg="$rq_msg$l "
    done
    rq_msg="${rq_msg% })"


    #### form/text of log messages: ####
    # The <lib> library from the <pkg> package was removed between Oracle Linux 6 and Oracle Linux 7
    # The <lib> library from the <pkg> package (required by packages not signed by Oracle: <pkg>[, pkg ...]) was removed between Oracle Linux 6 and Oracle Linux 7

    #### text of items in produced list in solution file ###
    # <lib> from <pkg>
    # <lib> from <pkg> (required by packages not signed by Oracle: <pkg>[, pkg ...])

    [ "$rq_msg" == " (required by packages not signed by Oracle:)" ] && rq_msg=""
    [ -n "$rq_msg" ] && $tmp_log_risk "The $soname_lib library from the $pkg package$rq_msg was removed between Oracle Linux 6 and Oracle Linux 7."

    echo "$soname_lib from the $pkg package$rq_msg" >>solution.txt

    # do not touch the line below
    echo "$soname_lib from $pkg$rq_msg" >>"$removed_tmp"
    found=1
  done
done < "$RemovedLibs"

grep required "$removed_tmp" | sort | uniq >>"$KICKSTART_DIR/RemovedLibs-required"
grep -v required "$removed_tmp" | grep -v "^$" | sort | uniq >> "$KICKSTART_DIR/RemovedLibs-optional"

rm -f "$removed_tmp" "$RemovedLibs"

echo -n "
 * RemovedLibs-required: This file contains all Oracle Linux 6 libraries that were removed in Oracle Linux 7. As some of your packages depend on these libraries, check for alternative solutions.
 * RemovedLibs-optional: This file is similar to the RemovedLibs-required file, but in this case no package not signed by Oracle requires these libraries. It is more of an informational thing for you, so that you can deal with the unavailability of these libraries.
 " >>"$KICKSTART_README"

echo \
"
The requirements in packages not signed by Oracle 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 libraries from the list above, get the .so library from a different place, or search for an alternative.
" >>solution.txt

[ $found -eq 1 ] && log_medium_risk \
 "Some .so libraries installed on the system were removed between Oracle Linux 6 and Oracle 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
