#!/bin/sh
#set -x
# <BEGIN COPYRIGHT>
# This file is part of the "Bad Penguin" GNU/Linux distribution
# Copyright (C) 1997-98-99 by Antonio GALLO
# Home Page at ......: http://www.badpenguin.org
# Home Page at ......: http://www.linux.it/~agx/
# e-mail contact ....: mailto:agx@linux.it	mailto:agx@geocities.com
# This program is distributed under the GNU General Public License
# You are not allowed to remove the copyright notice
# <END COPYRIGHT>

# setup--install: Installa un pacchetto di Bad Penguin
# 19990629  - Version 1.1.3 by AGX
# 19990726  - Version 1.1.4 by AGX : Target partition not specified upon --remove
# 19990830  - Version 1.2.0 by AGX : support .bpp format and RESTORE, fix UPDATE
# 1999-11-10, Version 1.5.9 by AGX
# 1999-11-30, Version 1.6.2 by AGX

# --------------------------------------------------------


# === Controllo lancio ===
if [ "$SETUP_MODE" = "" ]; then
  echoc RED "Questo script non puo' essere lanciato direttamente. Usa setup --help !"
  USCITA=1 ; exit 1
fi
[ $SETUP_VERBOSE -gt 1 ] && echo "- Entro in setup--install"

# === Trapping file temporanei ===
[   -d ${SETUP_TARGETDIR}/install ]  &&  rm -fR ${SETUP_TARGETDIR}/install  > /dev/null
[   -d ${SETUP_TARGETDIR}/incoming ] &&  rm -fR ${SETUP_TARGETDIR}/incoming > /dev/null
TEMPDIR="${SETUP_TARGETDIR}/tmp"
[ ! -d "$TEMPDIR" ] && mkdir -p "$TEMPDIR"
TARBALL="$TEMPDIR/tarball.$$.tar"
trap 'rm -f "$TARBALL" ; rm -fR "$SETUP_TARGETDIR/incoming" ; rm -fR "$SETUP_TARGETDIR/install" ; exit $USCITA ' 0

# === Tracing ===
LOGFILE="$TEMPDIR/agxsetup.log"
echo -e "\n[ setup--install: $SETUP_SOURCEFILE , $SETUP_TARGETDIR ]------------------------------"  >>"$LOGFILE"
TAROPTION=""
if [ $SETUP_VERBOSE -gt 1 ]; then
  TAROPTION=" -v -v "
fi

# DEBUG ???
echo "Analisi del pacchetto nel file `basename $SETUP_SOURCEFILE .bpp`"

# === Decompressione ===
[ $SETUP_VERBOSE -gt 0 ] && echo "- Decompressione di $SETUP_SOURCEFILE"
rm -f "$TARBALL"
gzip -cd "$SETUP_SOURCEFILE"  1>"$TARBALL"  2>>"$LOGFILE"
REPLY=$?
if [ $REPLY -ne 0 ]; then
  echoc RED "- La decompressione del pacchetto e' fallita ($REPLY)"
  sleep 1
  USCITA=3 ; exit 3
fi  


# === Estrae le informazioni sul pacchetto ===
[ $SETUP_VERBOSE -gt 0 ] && echo "- Estrazione delle informazioni dal pacchetto"
tar -px install/  -f "$TARBALL" $TAROPTION  2>>"$LOGFILE"
REPLY=$?
if [ $REPLY -ne 0 -a $REPLY -ne 2 ] ; then
  echoc RED "- Errore durante l'estrazione delle informazioni sul pacchetto ($REPLY)"
  sleep 1
  USCITA=3 ; exit 3
fi  
if [ ! -d install ] ; then
  # Probabilmente stai installando un pacchetto della Slackware
  echoc YELLOW "- Il pacchetto non contiene informazioni sull'installazione."
fi  


# === Lettura informazioni del pacchetto ===
[ $SETUP_VERBOSE -gt 0 ] && echo "- Lettura delle informazioni del pacchetto"
ARCH=""
SUMMARY=""
SONAME=""
VERSION=""
MAJOR=""
MINOR=""
DISKUSAGE=0
if [ ! -f install/INFO ]; then
  echoc YELLOW "- Il pacchetto e' nel vecchio formato 1.2"
  [ ! -d install/ ] && mkdir -p install
  > install/INFO
  # Importants
  echo "SONAME=\"`cat install/SONAME 2>/dev/null`\""        >> install/INFO
  echo "VERSION=\"`cat install/VERSION 2>/dev/null`\""      >> install/INFO
  echo "MAJOR=\"`cat install/MAJOR 2>/dev/null`\""          >> install/INFO
  echo "MINOR=\"`cat install/MINOR 2>/dev/null`\""          >> install/INFO
  echo "ARCH=\"`cat install/ARCH 2>/dev/null`\""            >> install/INFO
  echo "OPTIM=\"\""                                         >> install/INFO
  echo "STATUS=\"`cat install/STATUS 2>/dev/null`\""        >> install/INFO
  echo "SUMMARY=\"`cat install/SUMMARY 2>/dev/null`\""      >> install/INFO
  echo "DISKUSAGE=\"`cat install/DISKUSAGE 2>/dev/null`\""  >> install/INFO

  # Controllo Categoria
  TEMPVAR="`cat install/CATEGORY 2>/dev/null`"
  if [ "$TEMPVAR" = "" ]; then
    echoc YELLOW "- Il pacchetto e' nella versione 1.1, categoria non definita"
    echo "$SETUP_SOURCEDIR" | grep -q "packages"
    if [ $? -eq 0 ]; then
      TEMPVAR="`basename $SETUP_SOURCEDIR`"
    else
      TEMPVAR=""
    fi
    echoc YELLOW "  Categoria presunta = $TEMPVAR"
  fi
  echo "CATEGORY=\"$TEMPVAR\""    >> install/INFO

  # Infoes
  echo "AUTHOR=\"\""                                        >> install/INFO
  echo "COPYRIGHT=\"`cat install/COPYRIGHT 2>/dev/null`\""  >> install/INFO
  echo "DESCRIPTION=\"`cat install/DESCRIPTION 2>/dev/null`\"" >> install/INFO
  echo "URL=\"`cat install/URL 2>/dev/null`\""              >> install/INFO
  echo "FTPURL=\"`cat install/FTPURL 2>/dev/null`\""        >> install/INFO
  echo "MANTAINER=\"`cat install/MANTAINER 2>/dev/null`\""  >> install/INFO
  echo "BUILDTIME=\"`cat install/BUILDTIME 2>/dev/null`\""  >> install/INFO
  
  # Controllo Disk Name
  TEMPVAR="`cat install/DISKNAME 2>/dev/null`"
  [ "$TEMPVAR" = "" ] && TEMPVAR="Bad Penguin - Disco 1"
  echo "DISKNAME=\"$TEMPVAR\""                              >> install/INFO
  
  # Compress and remove some files ( keep REQUEST and MANIFEST )
  [ -f install/MD5SUM ] && gzip -1 install/MD5SUM
  ( 
    cd install 
    rm -f MILESTONE ARCH BUILDTIME CATEGORY COPYRIGHT DISKNAME DISKUSAGE 
    rm -f FTPURL MANTAINER SONAME STATUS SUMMARY URL VERSION MAJOR MINOR 
    rm -f DESCRIPTION *~
  )
fi

# Read infoes
. install/INFO


# Versioning and Fullversion
if [ ! -f install/CONFLICTS ]; then
  echoc YELLOW "- Pacchetto nel vecchio formato, conflitti non gestiti."
  if [ "$SONAME" = "" ]; then
    case "$SETUP_SOURCEFILE" in
      *bpp) EXT=".bpp" ;;
      *tgz) EXT=".tgz" ;;
      *) EXT="" ;;
    esac
    FULL_VERSION="`basename $SETUP_SOURCEFILE $EXT`"
    REMOVE_VERSION="`echo $FULL_VERSION | cut -f 1 -d '.'`"
    SONAME="$REMOVE_VERSION"
    VERSION="`echo $FULL_VERSION | cut -f 2- -d '.'`"
    echoc YELLOW "- Il pacchetto non contiene informazioni di versioning,"
    echo         "  Full version = $FULL_VERSION"
    echo         "  Conflict version = $REMOVE_VERSION"
  elif [ "$MAJOR" = "" ] ; then
    FULL_VERSION="${SONAME}_${VERSION}"
    REMOVE_VERSION="$SONAME?[0-9]"
  else
    FULL_VERSION="${SONAME}_${MAJOR}.${MINOR}"
    REMOVE_VERSION="$SONAME?$MAJOR"
  fi
  echo "$REMOVE_VERSION" >> install/CONFLICTS
else
  FULL_VERSION="${SONAME}_${VERSION}"
fi

# === Controllo Architettura ===
if [ "$ARCH" = "" ] ; then
  echoc YELLOW "- Il pacchetto non contiene informazioni sull'architettura."
elif [ ! "$ARCH" = "ANY" ]; then
  echo "(CONTROLLO ARCHITETTURA DA IMPLEMENTARE)" >/dev/null
fi

# === Controllo Pacchetto gia' installato ===
if [ -d "$PKG_SPOOL/$FULL_VERSION" ] ; then
  INSTALLED=1
else
  INSTALLED=0
fi

# SOLO PER INSTALL
if [ "$SETUP_MODE" = "INSTALL" ]; then

  # Controllo installazione
  if [ $INSTALLED -eq 1 ]; then
    #TODO: Richiedi installo/non installo
    if [ $SETUP_FORCE -eq 1 ]; then
      echoc YELLOW "- Il pacchetto e' gia' installato, forzo l'installazione."
    elif [ $SETUP_RELAXED -eq 1 ]; then
      echoc YELLOW "- Il pacchetto e' gia' installato, rinuncio all'installazione."
      USCITA=4 ; exit 4
    else
      echoc YELLOW "- Il pacchetto e' gia' installato"
      CHOICE="X"
      while [ "$CHOICE" != "S" -a "$CHOICE" != "N" ]; do
        echo -n "  Desideri continuare l'installazione del pacchetto (S/N) ? "
        read CHOICE  < /dev/tty
        CHOICE="`echo $CHOICE | tr '[a-z]' '[A-Z]'`"
      done
      if [ "$CHOICE" = "N" ]; then
        USCITA=4 ; exit 4
      fi
    fi
  fi

  # Controllo spazio occupato
  if [ "$DISKUSAGE" = "" ]; then
    DISKUSAGE=`filesize $SETUP_SOURCEFILE`
    DISKUSAGE=`expr $DISKUSAGE \* 4 `
    echoc YELLOW "- Disk usage del pacchetto non dichiarato, desumo = $DISKUSAGE"
  fi

  # Controllo spazio su disco
  AVAILABLE=`df -k "$SETUP_TARGETDIR" | tail -1 | cut -b 37-45`
  if [ "$AVAILABLE" = "" -o "$DISKUSAGE" = "" ]; then
    [ "$AVAILABLE" = "" ] && echoc YELLOW "- Impossibile determinare lo spazio libero disponibile !"
  else
    FREESPACE=`expr $AVAILABLE \* 1024 - $DISKUSAGE`
    if [ $FREESPACE -lt 0 ]; then
      echoc RED "L'installazione del pacchetto esaurira' lo spazio libero"
    else
      [ $SETUP_VERBOSE -gt 0 ] && echo "- Spazio libero $FREESPACE bytes"
    fi
  fi

  # Removing previous version of the package
  # only when Installing not when Updating  
  ( cat install/CONFLICTS ; echo ) | while read REMOVE_THIS
  do
    [ "$REMOVE_THIS" = "" ] && continue
    for i in $PKG_SPOOL/$REMOVE_THIS* ; do
      if [ -d "$i" ]; then
        [ $SETUP_VERBOSE -gt 0 ] && echo "- Rimozione del pacchetto $i"
        setup --remove `basename $i` --no-header  $SETUP_TARGETDIR
      fi
    done
  done
#Endif SETUP_MODE==INSTALL
fi

# --------------------------------------------------------------
echoc GREEN "Installazione del pacchetto $FULL_VERSION in $SETUP_TARGETDIR"
# Show Summary
echoc BLUE "$SUMMARY"
# --------------------------------------------------------------

# Extracting the pre-install script (not for RESTORE)
if [ "$SETUP_MODE" != "RESTORE" ]; then
  if [ "$SETUP_MODE" != "RESTORE" ]; then
    if [ -f install/PRE-INSTALL ]; then
      [ $SETUP_VERBOSE -gt 0 ] && echo "- Eseguo lo script PRE-INSTALL"
      chmod 755 install/PRE-INSTALL
      install/PRE-INSTALL  "$SETUP_TARGETDIR"
      REPLY=$?
      cd  "$SETUP_TARGETDIR"
      if [ $REPLY -ne 0 ]; then
        echo
        echoc RED "- Errore durante l'esecuzione di PRE-INSTALL ($REPLY)."
        echo -n "Premi INVIO per continuare ..."
        read x  < /dev/tty
      fi
    fi
  fi
#EndIf SETUP_MODE!=RESTORE
fi

# Extract the manifest (list of installed files) file, if missed
if [ ! -f install/MANIFEST ]; then
  echoc YELLOW "- Preparazione del file MANIFEST mancante"
  mkdir -p install
  tar -tf "$TARBALL"  --exclude 'install/*'  $TAROPTION  1> install/MANIFEST 2>>"$LOGFILE"
fi

# Extract the package 
[ $SETUP_VERBOSE -gt 0 ] && echo "- Estrazione files dal tarball"
if [ "$SETUP_MODE" = "INSTALL" ]; then
  # -U = unlink-first
  tar -U -pxf "$TARBALL"  --exclude 'install/*'  $TAROPTION
#  2>>"$LOGFILE"
  REPLY=$?
else
  # Updating or restore
  # TODO: (update) deve aggiornare tutti i file meno recenti !
  tar -xf "$TARBALL" -k  --exclude 'install/*'  $TAROPTION  2>>"$LOGFILE"
  REPLY=$?
  [ $REPLY -eq 2 ] && REPLY=0
fi
if [ $REPLY -ne 0 ]; then
    echoc RED "- Errore durante l'estrazione dei files ($REPLY) !"
    echoc YELLOW "  Provo a continuare ..."
    SETUP_SUCCESS=1
    sleep 1
else
  [ $SETUP_VERBOSE -gt 0 ] && echo "- Estrazione dei file dal tarball ultimata"
fi  


# === INCOMING ===
if [ -d incoming ]; then
  # Estrae solo i file non esistenti
  [ $SETUP_VERBOSE -gt 0 ] && echo "- Aggiornamento dei file in incoming"
  ( cd incoming ; tar -O -p -c * ) | tar -x -k -p $TAROPTION 2>/dev/null

  # ldconfig when in interactive mode
  if [ $SETUP_INTERACTIVE -eq 1 ]; then
    [ $SETUP_VERBOSE -gt 0 ] && echo "- Configurazione delle librerie dinamiche"
    ldconfig
  fi
fi


# Prepare /install script execution
if [ "$SETUP_MODE" != "RESTORE" ]; then

  # INSTALL
  if [ -f install/INSTALL ]; then
    [ $SETUP_VERBOSE -gt 0 ] && echo "- Esecuzione dello script INSTALL"
    chmod 755 install/INSTALL
    install/INSTALL  "$SETUP_TARGETDIR"
    cd "$SETUP_TARGETDIR"
    REPLY=$?
    if [ $REPLY -ne 0 ]; then
      echoc RED -e "\n- Errore durante l'esecuzione di INSTALL ($REPLY)."
      echo -n "Premi INVIO per continuare ..."
      read x  < /dev/tty
    fi
  fi

  # doinst.sh
  if [ -f install/doinst.sh ]; then
    echoc YELLOW "Esecuzione dello script doinst.sh (Slackware)"
    chmod 755 install/doinst.sh
    install/doinst.sh
    cd "$SETUP_TARGETDIR"
    REPLY=$?
    if [ $REPLY -ne 0 ]; then
      echoc RED -e "\n- Errore durante l'esecuzione di doinst.sh ($REPLY)."
      echo -n "Premi INVIO per continuare ..."
      read x  < /dev/tty
    fi
  fi

  # Schedule the post-install and x-post-install scripts
  if [ -f install/POST-INSTALL ]; then
    [ $SETUP_VERBOSE -gt 0 ] && echo "- Schedulo l'esecuzione di POST-INSTALL"
    mv  install/POST-INSTALL    "$PKG_SPOOL/$FULL_VERSION.post-install"
  fi
  if [ -f install/X-POST-INSTALL ]; then
    [ $SETUP_VERBOSE -gt 0 ] && echo "- Schedulo l'esecuzione di X-POST-INSTALL"
    mv  install/X-POST-INSTALL  "$PKG_SPOOL/$FULL_VERSION.x-post-install"
  fi  
# End != RESTORE
fi


# Schedule the dependencies ...
if [ "$SETUP_MODE" != "RESTORE" ]; then
  if [ -f install/REQUEST ]; then
    grep -v "^#" install/REQUEST | grep -v "^$"  >>  "$PKG_SPOOL/DEPENDENCIES"
  else
    echoc YELLOW "- Il pacchetto non contiene informazioni sulle dipendeze"
  fi
fi

# Controlla se sono stati installati programmi
SK_NAME="$PKG_SPOOL/zz-run-install-menu.post-install"
if [ ! -f "$SK_NAME"  ]; then
  grep -q "usr/share/gnome/apps/"  install/MANIFEST
  if [ $? -eq 0 ]; then
    echo "#!/bin/sh" > $SK_NAME
    echo "/usr/local/sbin/install-menu" >> $SK_NAME
    echo "- I menu' del Window managers saranno aggiornati"
  fi
fi

# Install package flag and copy install script there (for debug)
# then Copy install script
[ $SETUP_VERBOSE -gt 0 ] && echo "- Registrazione del pacchetto"
[ -d "$PKG_SPOOL/$FULL_VERSION" ] && rm -fR "$PKG_SPOOL/$FULL_VERSION"
mv  install/  "$PKG_SPOOL/$FULL_VERSION"

# Remove temp and install files
[ $SETUP_VERBOSE -gt 0 ] && echo "- Rimozione dei file temporanei"
rm -f $TARBALL
rm -fR incoming
rm -fR install
# End
[ $SETUP_VERBOSE -gt 0 ] && echoc GREEN "- installazione completata."


# === FINALIZE ===
#0.500: Run the install-dependencies script if installing interactlively
#0.800: Finalize the setup if running interactively
#1.1.2: if [ "$TARGET" = "/" ]; then
if [ $SETUP_INTERACTIVE -eq 1 ]; then
  # Clean up before exec
  rm -f "$TARBALL"
  rm -fR "$SETUP_TARGETDIR/incoming"
  rm -fR "$SETUP_TARGETDIR/install"
  # done
  SETUP_NO_HEADER=1
  SETUP_MODE="FINALIZE"
  exec setup--finalize  "$SETUP_SOURCEDIR"  "$SETUP_TARGETDIR"
  #(post install is called inside of finalize) setup --post-install
fi

#EOF
USCITA=$SETUP_SUCCESS
exit $SETUP_SUCCESS
