#!/bin/sh
# Copyright 1994, Patrick Volkerding, Moorhead, Minnesota USA 
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Sun Nov 26 12:38:25 CST 1995
# Added patch from Glenn Moloney <glenn@physics.unimelb.edu.au> to allow
# packages to be installed to directories other than /.
#

# ʿǯ() ʬ
# ܸ첽

make_install_script() {
 COUNT=1
 LINE="`sed -n "$COUNT p" $1`"
 while [ ! "$LINE" = "" ]; do
  LINKGOESIN="`echo "$LINE" | cut -f 1 -d " "`" 
  LINKGOESIN="`dirname $LINKGOESIN`" 
  LINKNAMEIS="`echo "$LINE" | cut -f 1 -d ' '`"
  LINKNAMEIS="`basename "$LINKNAMEIS"`"
  LINKPOINTSTO="`echo "$LINE" | cut -f 3 -d ' '`"
  echo "( cd $LINKGOESIN ; rm -rf $LINKNAMEIS )"
  echo "( cd $LINKGOESIN ; ln -sf $LINKPOINTSTO $LINKNAMEIS )"
  COUNT=`expr $COUNT + 1`
  LINE="`sed -n "$COUNT p" $1`"
 done
}

usage() {
 cat << EOF
Usage: installpkg package_name
       installpkg -warn package_name
       installpkg -r package_name
       installpkg -m package_name

̾ʲΤ褦 .tgz  .tar.gz եľܻꤷƵưޤ
   installpkg xf_bin.tgz

-warn ץդȥ󥹥ȡ¹Ԥ줿񤭤
եɽޤ

-r ץȤСΥǥ쥯ȥˤǥ쥯ȥ꤫ƵŪ
󥹥ȡ뤹뤳ȤǤޤ

   installpkg -r uucp

-m ץȤ "*.tgz" ѥå뤳ȤǽǤ
("-m" ץξ硢ѥåϥ󥹥ȡ뤵ʤΤޤ)

ξ硢ߤΥǥ쥯ȥʲ̾ΥѥåƱͤ / ʲإ
ԡ졢/var/log/packages  /var/log/scripts ʲ˥ѥå̾Ȥ
ꤷ"uucp" Ȥե뤬졢¾ Slackware ΥѥåƱ
˥å뤳Ȥǽˤʤޤ

/ ʳΥǥ쥯ȥ(㤨 /mnt)˥󥹥ȡ뤹ϡ

   ROOT=/mnt installpkg package.tgz

ȤƤ

EOF
}

# These tests, while by no means exhaustive, will give a usage message
# and exit with a wide range of bad input.

if [ "$1" = "-warn" -a -f "$2" ]; then # -warn
 echo "$2 ƤåƤޤ..."
 echo
 mkdir -p /tmp/scan
 ( cd /tmp/scan ; tar xzf - install/doinst.sh ) < $2 2> /dev/null 
 if [ -r /tmp/scan/install/doinst.sh ]; then
  if cat /tmp/scan/install/doinst.sh | fgrep 'rm -rf' 1>/dev/null 2>/dev/null ; then
   cat /tmp/scan/install/doinst.sh | fgrep 'rm -rf' > /tmp/scan/install/delete
   echo "ʲμʬϥܥå󥯤뤿˴"
   echo "־õפޤ('rm -rf' ޤ)"
   echo "õоݤϥեǥ쥯ȥΤǤ"
   echo
   echo "Υѥå򥤥󥹥ȡ뤹ˡõʬˤɬ"
   echo "פʥե˺줺˥ХååפƤƤ"
   echo
   cat /tmp/scan/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'
  fi
  if [ -d /tmp/scan ]; then
   ( cd /tmp/scan ; rm -rf install ) 2> /dev/null
   ( cd /tmp ; rmdir scan ) 2> /dev/null
  fi
 fi
 echo
 echo "ʲΥեϤΥѥå򥤥󥹥ȡ뤹Ⱦ񤭤"
 echo "ޤ餬פʥեǤʤȤ򤢤餫ǧƤ"
 echo "Ƥ"
 echo
 ( tar tzvvf - ) < $2 | fgrep -v 'drwx'
 echo "ٹ𤷤ޤ"
 exit
fi
if [ $# = 2 -a ! "$1" = "-m" -a ! "$1" = "-r" -a ! -r "$1" ]; then
 usage;
 exit
elif [ $# = 0 ]; then
 usage;
 exit
fi
if [ $# = 1 -a ! -r "$1" ]; then
 echo "ѥåĤޤ: $1"
 echo
 usage;
 exit
fi
if [ "$1" = "-r" -o "$1" = "-m" ]; then
 if [ -r "$ROOT/var/log/packages/$2" -a ! "$1" = "-m" ]; then
  echo
  echo " '$2' Ȥѥå¸ߤޤƱ̾Υѥå"
  echo "󥹥ȡ뤹ˤ pkgtool ȤäơŤѥå"
  echo "ƤƤʤȡŤǥåե뤬"
  echo "have to remove any leftover files and links manually."
  echo "Ƥޤᡢưǥե󥯤ʤȤ"
  echo "ʤʤޤ"
  echo -n "λޤ([y]es, [n]o)? "
  read EXIT;
  if [ "$EXIT" = "y" ]; then
   exit
  fi
 fi
 echo
 echo "Υѥå˴ޤޤƤ륷ܥå󥯤 ./install/doinst.sh "
 echo "Ȥ󥹥ȡ륹ץѤѴޤѴ硢"
 echo "ä󥷥ܥå󥯤Ϻޤѥå縵"
 echo "Υǥ쥯ȥ sh install/doinst.sh СñǤ"
 echo "ޤ"
 echo 
 echo "ѥå硢ܥå󥯤ϥץȤѴ"
 echo "뤳Ȥ򤪴ᤷޤ"
 echo
 echo -n "ܥå󥯤Ѵޤ([y]es, [n]o)? "
 read CONVERT_LINKS;
 echo
 if [ "$CONVERT_LINKS" = "y" ]; then
  echo "ܥå󥯤Ĵ٤Ƥޤ..."
  echo
  find . -type l -exec ls -l {} \; | cut -b59- | tee /tmp/iNsT-a.$$
  echo
  if [ ! -d install ]; then
   mkdir install
  fi
  if [ -r install/doinst.sh ]; then
    cat << EOF

Ǥ install/doinst.sh ȤץȤ¸ߤޤξ硢ʲ
 3 Ĥ褬ޤ

1 - ¸ߤƤ륹ץȤκǸ˥ܥå󥯤Ѵ뤿
    ɤղä롣
2 - ¸ΥץȤơΤ֤
3-  ߤƽλ롣

EOF
   echo -n "ɤ줬ߤǤ礦(1,2,3)? "
   read DOINST;
   if [ "$DOINST" = "1" ]; then
    echo "¸ΥץȤɲäƤޤ..."
    echo
    make_install_script /tmp/iNsT-a.$$ | tee --append install/doinst.sh
   elif [ "$DOINST" = "2" ]; then
    echo "¸ΥץȤ֤ޤ..."
    echo
    make_install_script /tmp/iNsT-a.$$ | tee install/doinst.sh
   else
    rm -f /tmp/iNsT-a.$$
    exit
   fi
  else # no script exists:
   echo "󥹥ȡѥץȤƤޤ..."
   echo
   make_install_script /tmp/iNsT-a.$$ | tee install/doinst.sh
  fi # is there already a script?
  rm -f /tmp/iNsT-a.$$
  echo
  echo "ܥå󥯤Ƥޤ:"
  echo
  find . -type l -print -exec rm {} \;
  echo
 fi # make install script?
 # Install the package:
 if [ "$1" = "-r" ]; then # install
  if [ -r install/doinst.sh ]; then # hey, did we do anything?
   # Put the backup of the script in place
   cp install/doinst.sh $ROOT/var/log/scripts/$2
   chmod 755 $ROOT/var/log/scripts/$2
  fi
  # Write the filelist out:
  echo "PACKAGE NAME:     $2" > $ROOT/var/log/packages/$2
  echo "FILE LIST:" >> $ROOT/var/log/packages/$2
  echo "./" >> $ROOT/var/log/packages/$2
  find . -type f -print | cut -b3- >> $ROOT/var/log/packages/$2
  # Copy the stuff into place:
  echo "Installing your new package onto $ROOT/..."
  cp -a . $ROOT/
  ( cd $ROOT/ ; sh install/doinst.sh ; rm install/doinst.sh ; rmdir install )
 elif [ "$1" = "-m" ]; then
  echo "$2.tgz ..."
  tar --create --gzip --exclude $2.tgz --file $2.tgz .
 fi
else # we're just going to try to install each argument as a package:
 for package in $* ; do
  echo "$package ѥå򥤥󥹥ȡ... "
  # This stuff looks for symbolic links that also belong to other packages and
  # leaves them in place. That way, if you have a couple package pointing to
  # /usr/include on the cdrom and delete one, you'll still have include files.
  shortname=`basename $package .tgz`
  ADM_DIR="$ROOT/var/log" 
  TMP=/tmp
  if [ -r $ADM_DIR/scripts/$shortname ]; then
   cat $ADM_DIR/scripts/$shortname | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
   if [ ! -d $ADM_DIR/removed_scripts ]; then
    mkdir -p $ADM_DIR/removed_scripts
   fi
   mv $ADM_DIR/scripts/$shortname $ADM_DIR/removed_scripts 1> /dev/null 2>&1    
   ( cat $ADM_DIR/scripts/* ; tar xzOf $package install/doinst.sh ) | \
     fgrep 'rm -rf' | sort -u > $TMP/required_links
   comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
   ( cd $ROOT/ ; sh $TMP/delscript )
   rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
  fi
  echo "PACKAGE NAME:     $shortname" > $ROOT/var/log/packages/$shortname
  COMPRESSED=`gzip -l $package | fgrep -v uncompressed_name | cut -b0-19`
  UNCOMPRESSED=`gzip -l $package | fgrep -v uncompressed_name | cut -b20-39`
  echo "COMPRESSED PACKAGE SIZE:     `expr $COMPRESSED / 1024` K" >> $ROOT/var/log/packages/$shortname
  echo "UNCOMPRESSED PACKAGE SIZE:     `expr $UNCOMPRESSED / 1024` K" >> $ROOT/var/log/packages/$shortname
  echo "PACKAGE LOCATION: $package" >> $ROOT/var/log/packages/$shortname
  packagedir="`dirname $package`"
  for file in $packagedir/disk* $packagedir/package_descriptions ; do
    if [ ! "$file" = "$packagedir/disk??*" ]; then
      if [ -r "$file" ]; then
        echo "PACKAGE DESCRIPTION:" >> $ROOT/var/log/packages/$shortname
        if cat $file | uniq | fgrep "$shortname:" >> $ROOT/var/log/packages/$shortname 2> /dev/null ; then
          echo "PACKAGE DESCRIPTION:" 
          cat $file | uniq | fgrep "$shortname:"
          break;
        fi
      fi
    fi
  done
  echo "FILE LIST:" >> $ROOT/var/log/packages/$shortname
  ( cd $ROOT/ ; tar -xzlpvf - ) < $package >> $ROOT/var/log/packages/$shortname 2> /dev/null
  if [ -f /install/doinst.sh ]; then
   echo "$package ѤΥ󥹥ȡ륹ץȤ¹..."
   ( cd $ROOT/ ; sh install/doinst.sh -install; )
  fi 
  # Clean up the mess...
  if [ -d $ROOT/install ]; then
   cp $ROOT/install/doinst.sh $ROOT/var/log/scripts/$shortname
   chmod 755 $ROOT/var/log/scripts/$shortname
   (cd $ROOT/install ; rm -r -f doin* 1> /dev/null 2>&1 )
   rmdir $ROOT/install 1> /dev/null 2>&1
  fi
  echo
 done
fi
echo
