#!/bin/bash
#
# netsrpm-install.sh - Build srpms that download sources from network
#
# Copyright (C) 2003-2024 by Silvan Calarco <silvan.calarco@mambasoft.it>
# Copyright (C) 2005 by Massimo Pintore <massimo.pintore@qilinux.it>
# Copyright (C) 2005-2007 by Davide Madrisan <davide.madrisan@qilinux.it>

TEXTDOMAINDIR=/usr/share/locale/
TEXTDOMAIN=netsrpms
me="${0##*/}"
DISTRO_SRPMS_DIR=/usr/share/netsrpms
rpmdir=$(rpm --eval=%{_rpmdir} 2>/dev/null)

while [ "$1" ]; do
   case $1 in
      -c) CHECK_MODE=1 ;;
      -f) FORCE_MODE=1 ;;
      -u) UPGRADE_MODE=1 ;;
      -h|--help) PACKAGES= ; break ;;
      -*) echo $"Error: invalid option $1; aborting."; exit 1 ;;
      *) PACKAGES="$PACKAGES $1"
   esac
   shift
done

if [ -z "$PACKAGES" ]; then
   echo $"Usage:
$me [options...] pkgname ...

Options:
-c: only check and exit (returns: 0: up-to-date; 1: needs update; 2: not installed)
-f: force reinstallation if already installed
-u: only upgrade if already installed
"
   exit 255
fi

function check_if_already_installed() {
   rpm -q $1-$2 &>/dev/null
   return $?
}

declare -A SRPMVERSION SRPMRELEASE

for pckname in $PACKAGES; do
   export SRPMCHECK="$pckname"
   . /etc/sysconfig/netsrpminstall || exit 1

   SRPM_PATH=$DISTRO_SRPMS_DIR/${pckname}
   SPEC_PATHNAME=$SRPM_PATH/${pckname}.spec

   [ -r "$SPEC_PATHNAME" ] || {
      echo $"$me: $pckname is missing in $DISTRO_SRPMS_DIR; aborting."
      exit 255
   }

   icon=`grep Icon= /usr/share/applications/$pckname.desktop 2>/dev/null | sed "s|Icon=||"`

   SRPMVER="${SRPMVERSION[${pckname}]}"
   if [ "$SRPMVER" ]; then
      SRPM_VERSION=${SRPMVER}-${SRPMRELEASE[${pckname}]}
   else
      SRPM_VERSION=
   fi

   RPM_INSTALLED=`rpm -q $pckname`
   [ $? -eq 0 ] || RPM_INSTALLED=

   RPM_INSTALLED_VERSION=`\
      echo $RPM_INSTALLED | \
      sed "s|${pckname//+/\\+}-\([^-]*-[^-]*\)\..*|\1|" 2>/dev/null`

   echo $"Package name:      $pckname"
   echo $"Installed version: $RPM_INSTALLED_VERSION"
   echo $"Last version:      $SRPM_VERSION"
   echo

   if [ "$SRPM_VERSION" -a "$RPM_INSTALLED_VERSION" != "$SRPM_VERSION" ]; then
      if [ "$RPM_INSTALLED_VERSION" ]; then
         UPDATE_NEEDED=1
      elif [ "$UPGRADE_MODE" ]; then
         continue
      fi
   elif [ ! "$FORCE_MODE" -a "$SRPM_VERSION" ]; then
      continue
   fi

   if [ ! "$CHECK_MODE" ]; then
      if [ -f ${SRPM_PATH}/LICENSE ]; then
         if [ "$DISPLAY" ]; then
            license-dialog ${SRPM_PATH}/LICENSE
            [ $? -ne 0 ] && exit 1
         else
            echo $"You must accept the following license terms:"
            echo
            more ${SRPM_PATH}/LICENSE
            echo -n $"Do you agree with the above license terms [y/N]? "
            read ans
            [ "$ans" = "Y" -o "$ans" = "y" -o "$ans" = "s" -o "$ans" = "S" ] || exit 1
         fi
      fi

      notify-send -a $"Network software installation" -i $icon "$pckname" $"$pckname installation in progress..."

      # build rpm
      tmpfile=`mktemp -q -t $me.XXXXXXXX` || {
         echo "$me: "$"error: cannot create temporary files; aborting."
         exit 255
      }

      tmpdir=`mktemp -d -q -t $me.XXXXXXXX` || {
         echo "$me: "$"error: cannot create temporary directory; aborting."
         exit 255
       }

      echo "$me: "$"rebuilding package \`$pckname'..."

      sed "s|@SRPMVERSION@|${SRPMVERSION[${pckname}]}|g;s|@SRPMRELEASE@|${SRPMRELEASE[${pckname}]}|g" \
         ${SPEC_PATHNAME} >> $tmpfile

      rpmbuild --ba \
         --define="%_topdir $tmpdir" \
         --define="%_sourcedir ${SRPM_PATH}" \
         $tmpfile

      if [ $? -gt 0 ]; then
         echo "$me: "$"error rebuilding \`$pckname'."" "$"Aborting..." >&2
         notify-send -a $"Network software installation" -i $icon "$pckname" $"There was an error building"" $pckname!"
         exit 255
      fi
      RPM_PATH=`find ${tmpdir}/RPMS -name \*.rpm`

      # install rpm
      if [ "$FORCE_MODE" = "1" ]; then
         pkcon remove -y $pckname
      fi
      pkcon install-local -y $RPM_PATH
      if [ $? -gt 0 ]; then
         echo "$me: "$"error installing \`$RPM_PATH'."" "$"Aborting..." >&2
         check_if_already_installed $pckname $SRPM_VERSION
         if [ $? -eq 0 ]; then
            notify-send -a $"Network software installation" -i $icon "$pckname" "$pckname: "$"already installed."
         else
            notify-send -a $"Network software installation" -i $icon "$pckname" $"There was an error installing"" $pckname!"
         fi
         exit 255
      fi

      rpm -q $pckname 2>/dev/null
      if [ $? -eq 0 ]; then
         notify-send -a $"Network software installation" -i $icon "$pckname" $"Installation of $pckname successfully completed."
      else
         notify-send -a $"Network software installation" -i $icon "$pckname" $"There was an error installing $pckname!"
      fi
      rm -rf $tmpdir $tmpfile

   fi
done

if [ "$CHECK_MODE" ]; then
   if [ "$UPDATE_NEEDED" ]; then
      echo $"Update needed."
      exit 1
   fi
   rpm -q $pckname > /dev/null
   if [ $? -eq 1 ]; then
      echo $"Not installed."
      exit 2
   fi
fi

exit 0
