#!/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 aka AGX
# 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>

# The "Bad Penguing Package Manager"
# KEEP OUT: THOSE FILES SHOULD WORK UNDER "SH" AND NOT UNDER "BASH" !!!

# PREREQUISITI:
# - GNU gzip
# - GNU tar
# - cp, rm, mv, touch, ls, date, chmod, chown, sleep, exec
# - grep, cat, tr, cut, sort, wc, head, tail
# - expr, pwd, echo, echoc
# - dirname, basename, df

# Changes
# 1999-04-27, Version 1.1.0 by AGX
# 1999-11-08, Version 1.5.9 by AGX
# 1999-11-11, Version 1.6.0 by AGX
# 1999-11-30, Version 1.6.2 by AGX: Should work now ^_^

# ----------------------------------
#      Return Codes
# ----------------------------------
# 1 - Bad usage or unknow parameters
# 2 - File o directory inesistente
# 3 - Errore nel pacchetto gzip
# 4 - Installazione annullata dall'utente


# === Inizializza variabili da esportare ===
export USCITA=0
# - Versione
export SETUP_VERSION="versione 1.6.2 del 1999-11-30"
# - Modalita' di funzionamento: INSTALL, UPGRADE, etc.
export SETUP_MODE=""
# - Se ci sono stati problemi durante l'installazione
export SETUP_SUCCESS=0
# - The file or package name you are going to install
export SETUP_SOURCEFILE=""
# - The directory where the package lies
export SETUP_SOURCEDIR=""
# - 0=Don't prompt ; 1=Prompt for questions
export SETUP_INTERACTIVE=0
# - Target Directory
export SETUP_TARGETDIR=""
# - 0=Hide headers ; 1=Show headers
export SETUP_HEADERS=1
# - Livello di verbose ( 0=minimo )
export SETUP_VERBOSE=0
# - Forza ogni operazione senza chiedere conferma
export SETUP_FORCE=0
# - Annulla ogni operazione senza chiedere conferma
export SETUP_RELAXED=0
# - Package Name for remove,purge,check,restore,update NOT install
export PKG_NAME=""
# - Spool directory = $SETUP_TARGETDIR + /var/spool/badpenguin
export PKG_SPOOL=""
# - Pkg spool dir = PKG_SPOOL + PKG_NAME
export PKG_SPOOLNAME=""

# === Controllo Parametri ===
while [ ! "X$1" = "X" ]; do
  case "$1" in
    # ----------------------------------------------------- Commands
    -i|--install)
      SETUP_MODE="INSTALL"
      ;;
    -y|--finalize)
      SETUP_MODE="FINALIZE"
      ;;
    -z|--post-install)
      SETUP_MODE="POST"
      ;;
    -x|--x-post-install)
      SETUP_MODE="XPOST"
      ;;
    -u|--update)
      SETUP_MODE="UPDATE"
      ;;
    -k|--restore)
      SETUP_MODE="RESTORE"
      ;;
    -h|--help)
      exec setup--help
      USCITA=2 ; exit 2
      ;;
    -d|--remove)
      SETUP_MODE="REMOVE"
      ;;
    -p|--purge|--prune)
      SETUP_MODE="PURGE"
      ;;      
    -c|--check)
      SETUP_MODE="CHECK"
      ;;
    --md5check)
      SETUP_MODE="MD5CHECK"
      ;;
    -U|--upgrade)
      SETUP_MODE="UPGRADE"
      ;;
    # ----------------------------------------------------- Options
    --no-header)
      SETUP_HEADERS=0
      ;;
    -f|--force)
      SETUP_FORCE=1
      ;;
    --relaxed)
      SETUP_RELAXED=1
      ;;
    -v|--verbose)
      #SETUP_VERBOSE=`expr $SETUP_VERBOSE + 1`
      SETUP_VERBOSE=`expr $SETUP_VERBOSE + 1`
      ;;
    # ----------------------------------------------------- Default
    *)
      if [ "$SETUP_SOURCEFILE" = "" ]; then
        SETUP_SOURCEFILE="$1"
        if [ "$SETUP_MODE" = "" ]; then
          SETUP_MODE="INSTALL"
          SETUP_TARGETDIR="/"
          SETUP_INTERACTIVE=1
        else
          SETUP_INTERACTIVE=0
        fi
      elif [ "$SETUP_TARGETDIR" = "" ]; then
        SETUP_TARGETDIR="$1"
      else
        echoc RED "- Il parametro [ $1 ] non e' valido."
	USCITA=1 ; exit 1
      fi
      ;;
  esac
  # Next
  shift 1
done

# Fatto: annunciazione annunciazione :-)
[ $SETUP_HEADERS -eq 1 ] && echoc CYAN "AGX Package Management $SETUP_VERSION"

# =====  Controlli  =====

# Paranoia
if [ "$SETUP_MODE" = "" ]; then
  echoc RED "- Non e' stata specificata l'operazione da eseguire."
  USCITA=1 ; exit 1
fi

# ----- Params -----
case "$SETUP_MODE" in
  INSTALL|UPGRADE|RESTORE)
    # (1)=Sourcefile ; (2)=TargetDir
    if [ "$SETUP_SOURCEFILE" = "" ]; then
      echoc RED "- Non e' stato specificato il pacchetto su cui operare."
      USCITA=1 ; exit 1
    fi
    if [ ! -f "$SETUP_SOURCEFILE" ]; then
      if [ -f "${SETUP_SOURCEFILE}.bpp" ]; then
        SETUP_SOURCEFILE=${SETUP_SOURCEFILE}.bpp
      elif [ -f "${SETUP_SOURCEFILE}.tgz" ]; then
        SETUP_SOURCEFILE=${SETUP_SOURCEFILE}.tgz
      else
        echoc RED "- Il file da installare non esiste ($SETUP_SOURCEFILE)."
        USCITA=1 ; exit 1
      fi
    fi
    if [ "$SETUP_TARGETDIR" = "" ]; then
      echoc YELLOW "- Non e' stata specificata la directory di destinazione, presumo /"
      SETUP_TARGETDIR="/"
      sleep 1
    fi
    if [ ! -d "$SETUP_TARGETDIR" ]; then
      echoc RED "- La directory di destinazione non esiste ($SETUP_TARGETDIR)."
      USCITA=2 ; exit 2
   fi
   ;;
  FINALIZE)
  # (1)=Sourcedir ; (2)=TargetDir
    SETUP_SOURCEDIR="$SETUP_SOURCEFILE"
    if [ "$SETUP_SOURCEFILE" = "" ]; then
      #echoc RED "- Non e' stata specificata la directory della distribuzione."
      echoc YELLOW "- Non e' stata specificata la directory della distribuzione, presumo /cdrom"
      SETUP_SOURCEFILE="/cdrom"
      SETUP_SOURCEDIR="/cdrom"
      #exit 1
    fi
    if [ ! -d "$SETUP_SOURCEFILE" ]; then
      echoc RED "- La directory della distribuzione non esiste ($SETUP_SOURCEFILE)."
      USCITA=2 ; exit 2
    fi
    if [ "$SETUP_TARGETDIR" = "" ]; then
      echoc YELLOW "- La directory destinazione non e' stata specificata, presumo '/' ..."
      SETUP_TARGETDIR="/"
      sleep 1
    fi
    if [ ! -d "$SETUP_TARGETDIR" ]; then
      echoc RED "- La directory di destinazione non esiste ($SETUP_TARGETDIR)."
      USCITA=2 ; exit 2
    fi
    ;;
  POST|XPOST)
  # Nessun parametro
    if [ ! "$SETUP_SOURCEFILE" = "" ]; then
      echoc YELLOW "- Il parametro [$SETUP_SOURCEFILE] e' stato ignorato"
    fi
    if [ ! "$SETUP_TARGETDIR" = "" ]; then
      echoc YELLOW "- Il parametro [$SETUP_TARGETDIR] e' stato ignorato"
    fi
    SETUP_SOURCEFILE="/"
    SETUP_SOURCEDIR="/"
    SETUP_TARGETDIR="/"
    ;;
  REMOVE|CHECK)
  # (1) = Pacchetto ; (2) = [TargetDir]
    if [ "$SETUP_SOURCEFILE" = "" ]; then
      echoc RED "- Non e' stato specificato il pacchetto su cui operare."
      USCITA=1 ; exit 1
    fi
    if [ "$SETUP_TARGETDIR" = "" ]; then
      #echoc RED "- Non e' stata specificata la directory di destinazione."
      #exit 1
      echoc YELLOW "- La directory destinazione non e' stata specificata, presumo '/' ..."
      SETUP_TARGETDIR="/"
      sleep 1
    fi
    if [ ! -d "$SETUP_TARGETDIR" ]; then
      echoc RED "- La directory di destinazione non esiste ($SETUP_TARGETDIR)."
      USCITA=2 ; exit 2
    fi
    ;;
  *)
    echoc RED "Install mode ($SETUP_MODE) sconosciuto !"
    USCITA=1 ; exit 1
    ;;
esac

# Calcolo della Sourcedir
if [ "$SETUP_SOURCEDIR" = "" ]; then
  SETUP_SOURCEDIR="`dirname $SETUP_SOURCEFILE`"
  if [ "$SETUP_SOURCEDIR" = "." ]; then
    SETUP_SOURCEDIR=`pwd`
  fi
fi


# ---- Nome del pacchetto e posizione nel repository ----
case $SETUP_SOURCEFILE in
  *tgz) PKG_NAME=`basename $SETUP_SOURCEFILE .tgz` ;;
  *bpp) PKG_NAME=`basename $SETUP_SOURCEFILE .bpp` ;;
  *)    PKG_NAME=`basename $SETUP_SOURCEFILE` ;;
esac
[ "$PKG_NAME" = "" ] && PKG_NAME="$SETUP_SOURCEFILE"
PKG_SPOOL="$SETUP_TARGETDIR/var/spool/badpenguin"
PKG_SPOOLNAME="$PKG_SPOOL/$PKG_NAME"


# ===== Going on ... =====
if [ "$PWD" = "" ]; then
  export OLD_PWD="`pwd`"
else
  export OLD_PWD="$PWD"
fi
# -----------------
cd $SETUP_TARGETDIR
# -----------------
[ ! -d $PKG_SPOOL ]   && mkdir -p  $PKG_SPOOL    > /dev/null


# ===== Prerequisite Existsence ======
case "$SETUP_MODE" in
  CHECK|UPDATE|RESTORE|REMOVE|PURGE)
    if [ ! -d "$PKG_SPOOLNAME" ]; then
      echoc YELLOW "- Il pacchetto $PKG_NAME non e' installato in $SETUP_TARGETDIR"
      if [ $SETUP_RELAXED=1 ]; then
        USCITA=0 ; exit 0
      else
        sleep 1
        USCITA=2 ; exit 2
      fi
    fi
    ;;
esac
    

# ===== Selection ======
case "$SETUP_MODE" in
  INSTALL|UPDATE|RESTORE)
    exec setup--install
    ;;
  FINALIZE)
    exec setup--finalize
    ;;
  POST|XPOST)
    exec setup--postinstall
    ;;
  REMOVE|PURGE)
    exec setup--remove
    ;;
  CHECK|MD5CHECK)
    exec setup--check
    ;;
  UPGRADE)
    exec setup--upgrade
    ;;
  *)
    echoc RED "- La modalita' di funzionamento ($SETUP_MODE) non e' supportata."
    USCITA=1 ; exit 1
    ;;
esac
USCITA=0 ; exit 0
