#!/bin/sh
#
# Copyright 1993, 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.
#

# Wed, 27 Apr 1994 00:06:50 -0700 (PDT)
# Optimization by David Hinds.

SOURCE_DIR=/var/adm/mount
umask 000
ASK="tagfiles"
if [ ! -d /usr/sbin ]; then # we must be on the bootdisk
 TARGET_DIR=/mnt
 TMP=/mnt/tmp
 if mount | grep "on /mnt" 1> /dev/null 2>&1 ; then # good
  echo > /dev/null
 else # bad
  echo
  echo
  echo "Linuxのパーティションを /mnt にマウントするまではルートディスクから"
  echo "pkgtoolj を実行できません。以下に例を示します："
  echo "もしルートパーティション(/)が /dev/hda1 で、ext2fs を使っているなら"
  echo "次のように入力してください。"
  echo "mount /dev/hda1 /mnt -t ext2"
  echo
  echo "/dev/hda2 を /usr パーティションに割り当てるなら、次の通りです:"
  echo "mount /dev/hda2 /mnt/usr -t ext2"
  echo
  echo "Linuxパーティションをマウントして、cpkgtoojを再度立ち上げましょう。"
  echo
  exit
 fi
 if [ ! -d $TMP ]; then
  mkdir -p $TMP
  chmod 1777 $TMP
 fi
else
 TARGET_DIR=/
 TMP=/tmp
fi
ADM_DIR=$TARGET_DIR/var/log
LOG=$TMP/PKGTOOL.REMOVED

keep_files() {
 while read FILE ; do
  if [ -f "$TARGET_DIR/$FILE" ]; then
    echo "  --> $FILEは他のパッケージにありました。次へ移ります。" >> $LOG
  fi
 done
 }

keep_links() {
 while read LINK ; do
  echo "Duplicate link. 実行しません: $LINK" >> $LOG
 done
}

delete_files() {
 while read FILE ; do
  if [ -f "$TARGET_DIR/$FILE" ]; then
    echo "  --> $FILEを消去します。" >> $LOG
    rm -f $TARGET_DIR/$FILE
  fi
 done
 }

delete_links() {
 while read LINK ; do
  echo "Unique link. 実行します: $LINK" >> $LOG
 done
}

# Conversion to 'comm' utility by Mark Wisdom.
remove_packages() {
 for package_name in $* 
 do
  if [ -r $ADM_DIR/packages/$package_name ]; then
   dialog --title "パッケージを消去しています" --infobox "パッケージ$package_nameを消去しています。他にインストール\n\
されたパッケージの内容と重複する部分を消去してしまうといけません\n\
から、個々のファイルをチェックしています。そのためこの処理には少\n\
々時間が掛かります。もしこの処理の進行状況を確認したかったら、別\n\
の仮想コンソールに切替えて、'tail -f $TMP/PKGTOOL.REMOVED'と入力\n\
してみてください。" 9 70
   echo "$package_nameを消去中" >> $LOG
   if grep "./" $ADM_DIR/packages/$package_name 1> /dev/null 2>&1; then
    TRIGGER=".\/"
   else
    TRIGGER="FILE LIST:"
   fi
   echo "消去するファイル:" >> $LOG
   sed -n "/$TRIGGER/,/^$/p" < $ADM_DIR/packages/$package_name | sort -u > $TMP/delete_list
   # Pat's new-new && improved pre-removal routine.
   for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do
    if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi
   done
   mv $ADM_DIR/packages/$package_name $ADM_DIR/removed_packages 1> /dev/null 2>&1
   # Look for duplicated links and leave them in place.
   if [ -r $ADM_DIR/scripts/$package_name ]; then
    cat $ADM_DIR/scripts/$package_name | grep 'rm -rf' | sort -u > $TMP/del_link_list
    mv $ADM_DIR/scripts/$package_name $ADM_DIR/removed_scripts 1> /dev/null 2>&1
    cat $ADM_DIR/scripts/* | grep 'rm -rf' | sort -u > $TMP/required_links
    comm -12 $TMP/del_link_list $TMP/required_links | keep_links
    comm -23 $TMP/del_link_list $TMP/required_links | delete_links
    comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
    ( cd $TARGET_DIR ; sh $TMP/delscript )
    rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
   fi
   cat $ADM_DIR/packages/* | sort -u > $TMP/required_files
   comm -12 $TMP/delete_list $TMP/required_files | keep_files
   comm -23 $TMP/delete_list $TMP/required_files | delete_files
   rm -f $TMP/delete_list
   rm -f $TMP/required_files
  else
   echo "このようなパッケージはありません：$package_name。消去できません" >> $LOG
  fi
 done
}

# Here, we read the list of arguments passed to the pkgtool script.
if [ $# -gt 0 ]; then # there are arguments to the command
 while [ $# -gt 0 ]; do
  case "$1" in
  "-sets")
   DISK_SETS=`echo $2 | tr "[A-Z]" "[a-z]"` ; shift 2 ;;
  "-source_mounted")
   SOURCE_MOUNTED="always" ; shift 1 ;;
  "-ignore_tagfiles")
   ASK="never" ; shift 1 ;;
  "-tagfile")
   USETAG=$2 ; shift 2 ;;
  "-source_dir")
   SOURCE_DIR=$2 ; shift 2 ;;
  "-target_dir")
   TARGET_DIR=$2
   ADM_DIR=$TARGET_DIR/var/log
   shift 2 ;;
  "-source_device")
   SOURCE_DEVICE=$2 ; shift 2 ;;
  esac
 done
else  # there were no arguments, so we'll get the needed information from the
      # user and then go on.
 CMD_START="true"
 rm -f /tmp/SeT*
 while [ 0 ]; do
  dialog --title "Plamo Linuxパッケージツール (pkgtool version 3.3.0)" \
--menu "\nPlamo Linuxパッケージツールへようこそ！\n\
\nどれを選択しますか？\n" 17 74 6 \
"Current" "カレントディレクトリからインストール" \
"Other" "別のディレクトリからインストール" \
"Floppy" "フロッピーからインストール" \
"Remove" "インストールされているパッケージを消去" \
"View" "パッケージの中のファイルの一覧を見る" \
"Exit" "パッケージツールを終了" 2> /tmp/reply
  if [ $? = 1 -o $? = 255 ]; then
   rm -f /tmp/reply
   exit
  fi
  REPLY="`cat /tmp/reply`"
  rm -f /tmp/reply
  if [ "$REPLY" = "Exit" ]; then
   exit
  fi
  if [ "$REPLY" = "View" ]; then
   dialog --title "スキャン中" --infobox "パッケージツールはインストールされているパッケージを調べ、リストを\n\
作るためにシステムをスキャンしています。これには\n\
1.`date +"%S"`E+`date +"%M"` BogoMipSeconds掛かります。" 7 70
   echo 'dialog --menu "見たいパッケージを選択してください。" 15 64 8 \' > /tmp/viewscr
   ls $ADM_DIR/packages | sed -e 's/.*/"&" "" \\/' >> /tmp/viewscr
   echo "2> /tmp/return" >> /tmp/viewscr
   while [ 0 ]; do
    . /tmp/viewscr
    if [ ! "`cat /tmp/return`" = "" ]; then
     dialog --title "パッケージの内容: `cat /tmp/return`" --textbox "$ADM_DIR/packages/`cat /tmp/return`" \
     22 74 2> /dev/null
    else
     break 
    fi
   done
   rm -f /tmp/return /tmp/viewscr /tmp/tmpmsg
   chmod 755 /
   chmod 1777 /tmp
   continue
  fi  
  if [ "$REPLY" = "Remove" ]; then
   dialog --title "スキャン中" --infobox "パッケージツールはインストールされたパッケージを調べ、\n\
リストを作成するためにシステムをスキャンしています。\n\
これに3.`date +"%S"`E+`date +"%M"`BogoMipSecondsかかります。" 7 64
   cat << EOF > $TMP/rmscript

dialog --title "消去するパッケージの選択" --checklist "消去したいパッケージを選択してください。\n\
パッケージを選択するにはスペースキーを押してください。\n\
上下のカーソルキーを使用すると、スクロールしてすべての\n\
リストを見ることができます。" 22 60 13 \\
EOF
   for name in `ls $ADM_DIR/packages` ; do
    BLURB="`sed -n \"/$name:/{s/\\"//g;p;q;}\" $ADM_DIR/packages/$name | cut -b10-45`"
    echo " \"$name\" \"$BLURB\" off \\" >> $TMP/rmscript
   done 
   echo "2> /tmp/return" >> $TMP/rmscript
   cat /dev/null > $LOG
   chmod 700 $TMP/rmscript
   export ADM_DIR;
   $TMP/rmscript
   remove_packages `cat /tmp/return | tr -d "\042"`
   if [ "`cat $TMP/PKGTOOL.REMOVED`" = "" ]; then
    rm -f $TMP/PKGTOOL.REMOVED
   else
    dialog --title "パッケージの消去完了" --msgbox "
指定のパッケージは消去されました。消去されたファイルの記録は、\n\
$TMP: PKGTOOL.REMOVEDに作られています。パッケージツールは\n\
空のディレクトリを消去しませんので、御自分で消去してください。" 8 70
   fi
   rm -f $TMP/rmscript /tmp/return /tmp/tmpmsg /tmp/SeT*
   chmod 755 /
   chmod 1777 /tmp
   dialog --clear
   exit
  elif [ "$REPLY" = "Floppy" ]; then
   dialog --title "フロッピードライブの選択" --menu "どのフロッピードライブからインストールしますか？" \
11 70 4 \
"/dev/fd0u1440" "1.44 MB １台目のドライブ" \
"/dev/fd1u1440" "1.44 MB ２台目のドライブ" \
"/dev/fd0h1200" "1.2 MB １台目のドライブ" \
"/dev/fd1h1200" "1.2 MB ２台目のドライブ" 2> /tmp/wdrive
   if [ $? = 1 ]; then
    dialog --clear
    exit
   fi
   SOURCE_DEVICE="`cat /tmp/wdrive`"
   rm -f /tmp/wdrive 
   cat << EOF > /tmp/tmpmsg

インストールするディスクセットの名前を入力してください。
複数指定する場合は、スペースで区切ってください。例： a b oi x

１枚のディスクからインストールするには、何も打たずにENTERキー
を押してください。

EOF
   dialog --title "ソフトウェアの選択" --inputbox "`cat /tmp/tmpmsg`" 13 70 2> /tmp/sets 
   DISK_SETS="`cat /tmp/sets`"
   rm -f /tmp/sets
   if [ "$DISK_SETS" = "" ]; then
    DISK_SETS="disk"
   else
    DISK_SETS=`echo $DISK_SETS | sed 's/ /#/g'`
    DISK_SETS="#$DISK_SETS"
   fi
   break;
  elif [ "$REPLY" = "Other" ]; then
   dialog --title "インストール元ディレクトリの選択" --inputbox "インストール元のディレクトリ名を入力してください：" 10 60 2> /tmp/pkgdir
   if [ $? = 1 ]; then
    rm -f /tmp/pkgdir /tmp/SeT*
    exit
   fi 
   SOURCE_DIR="`cat /tmp/pkgdir`"
   SOURCE_MOUNTED="always"
   DISK_SETS="disk" 
   chmod 755 $TARGET_DIR
   chmod 1777 $TARGET_DIR/tmp
   rm -f /tmp/pkgdir
   if [ ! -d $SOURCE_DIR ]; then
    dialog --title "ディレクトリが見つかりません" --msgbox "
指定されたディレクトリ($SOURCE_DIR)が見つかりません。\n\
確認して再挑戦してください。" \
10 70
    exit
   fi
   break;
  else # installing from current directory
   SOURCE_MOUNTED="always"
   SOURCE_DIR="$PWD"
   DISK_SETS="disk" 
   chmod 755 $TARGET_DIR
   chmod 1777 $TARGET_DIR/tmp
   break;
  fi 
 done
fi
if [ "$DISK_SETS" = "disk" ]; then
 ASK="always"
fi

for DIR in $ADM_DIR $ADM_DIR/packages $ADM_DIR/scripts $ADM_DIR/disk_contents
do
 if [ ! -d $DIR ]; then mkdir -p $DIR ; chmod 755 $DIR ; fi
done

if [ ! -d $ADM_DIR/mount -a ! -L $ADM_DIR/mount ]; then
 mkdir -p $ADM_DIR/mount ; chmod 755 $ADM_DIR/mount
fi

mount_the_source() {
 # is the source supposed to be mounted already?
 if [ "$SOURCE_MOUNTED" = "always" ]; then
  # The source should already be mounted, so we test it
  if [ ! -d $SOURCE_DIR ]; then # the directory is missing
   cat << EOF > /tmp/tmpmsg

指定されたインストール元のデバイスにアクセスできません。

/var/adm/mountにデバイスがマウントされているか、また
$SOURCE_DIRと指定されたディレクトリのサブディレクトリに、
Plamo Linuxのディスクセットの内容が存在しているか、確認
してください。

EOF
   dialog --title "マウントエラー" --msgbox "`cat /tmp/tmpmsg`" 11 67
   rm -f /tmp/tmpmsg
   exit 1;
  fi
  return 0;
 fi
 dialog --title "ディスクの挿入" --menu "ディスク$1を挿入し、ENTERキーを押してください。" \
11 60 3 \
"Continue" "インストールを続行します" \
"Skip" "このセットのインストールをスキップします" \
"Quit" "インストール作業を中止します" 2> /tmp/reply
 if [ $? = 1 -o $? = 255 ]; then
  REPLY="Quit"
 else
  REPLY="`cat /tmp/reply`"
 fi
 rm -f /tmp/reply
 if [ "$REPLY" = "Skip" ]; then
  return 1;
 fi
 if [ "$REPLY" = "Quit" ]; then
   dialog --title "中止" --msgbox "ソフトウェアのインストールを中止します。" 5 50
   chmod 755 $TARGET_DIR
   chmod 1777 $TARGET_DIR/tmp
   exit 1;
 fi;
 # Old line:
 # mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
 # New ones: (thanks to Andy Schwierskott!)
 go_on=y
 not_successfull_mounted=1
 while [ "$go_on" = y -a "$not_successfull_mounted" = 1 ]; do
  mount -r -t vfat $SOURCE_DEVICE $SOURCE_DIR
  not_successfull_mounted=$?
  if [ "$not_successfull_mounted" = 1 ]; then
   mount_answer=x
   while [ "$mount_answer" != "y" -a "$mount_answer" != "q" ] ; do
    dialog --title "マウント失敗" --menu "メディアが正常にマウントできませんでした！\n\
再試行しますか？中止しますか？" 10 70 2 \
"Yes" "もう一度マウントしてみる" \
"No" "いいや、中止" 2> /tmp/mntans
    mount_answer="`cat /tmp/mntans`"
    rm -f /tmp/mntans
    if [ "$mount_answer" = "Yes" ]; then
     mount_answer="y"
    else
     mount_answer="q"
    fi
   done
   go_on=$mount_answer
  fi
 done
 test $not_successfull_mounted = 0
}
umount_the_source() {
 if [ ! "$SOURCE_MOUNTED" = "always" ]; then
#  umount $SOURCE_DEVICE 1> /dev/null 2>&1
   umount $SOURCE_DIR 1> /dev/null 2>&1
 fi;
}
# The function below installs the package with the name $CURRENT_PACKAGE_NAME
# and with the DOS file extension .tgz
install_the_current_package() {
 rm -f $ADM_DIR/removed_packages/$CURRENT_PACKAGE_NAME
 rm -f $ADM_DIR/removed_scripts/$CURRENT_PACKAGE_NAME
 echo "パッケージ名:     $CURRENT_PACKAGE_NAME" > $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
 echo "圧縮時のパッケージのサイズ:     $COMPRESSED" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
 echo "非圧縮時のパッケージのサイズ:     $UNCOMPRESSED" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
 BASE_DISK_NAME=`basename $PACKAGE_DIR/disk*`
 echo "パッケージの所在: $BASE_DISK_NAME" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
# echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
# if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
#  grep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$BASE_DISK_NAME | uniq >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
# fi
# pshort=`basename $PACKAGE_DIR`
 for index_file in $PACKAGE_DIR/disk* $PACKAGE_DIR/package_descriptions ; do
  if [ ! "$index_file" = "$PACKAGE_DIR/disk??*" ]; then
   if [ -r "$index_file" ]; then
    echo "パッケージの内容:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
    if cat $index_file | uniq | grep "$CURRENT_PACKAGE_NAME:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null ; then
     break;
    fi
   fi
  fi
 done
 echo "FILE LIST:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
 # Pat's new-new pre-install cleanup routine.
 if [ -r $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME -a ! -d $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME ]; then
  cat $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME | grep 'rm -rf' | sort -u > $TMP/del_link_list
  if [ ! -d $ADM_DIR/removed_scripts ]; then
   mkdir $ADM_DIR/removed_scripts
  fi
  mv $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME $ADM_DIR/removed_scripts 1> /dev/null 2>&1
  cat $ADM_DIR/scripts/* | grep 'rm -rf' | sort -u > $TMP/required_links
  comm -12 $TMP/del_link_list $TMP/required_links | keep_links
  comm -23 $TMP/del_link_list $TMP/required_links | delete_links
  comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
  ( cd $TARGET_DIR ; sh $TMP/delscript )
  rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
 fi
 # Install the package:
 >$TMP/tar-error
 (cd $TARGET_DIR; tar --overwrite -xzvf - ) < $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> $TMP/tar-error
 if [ ! "`filesize $TMP/tar-error`" = "0" ]; then # Package may be corrupt
  dialog --title "パッケージインストール中にエラー \
$PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz" \
   --msgbox "\n\
このパッケージをインストール中にエラーが発生しました。とり\n\
あえずこのまま続けますが、あとあと「重大なエラー」を引き起こす\n\
かもしれません。パッケージが壊れていないか確認した後、再イン\n\
ストールした方がよいでしょう。パッケージをFTP経由で入手する\n\
場合は、ダウンロードの際に'binary'モードを指定しなければなり\n\
ません。\n\
\n\
エラーメッセージです。（ないかもしれません）：\n\
`cat $TMP/tar-error` \n" 19 70
 fi
 chmod 644 $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
 if [ -f $TARGET_DIR/install/doinst.sh ]; then
  # Executing installation script for package $CURRENT_PACKAGE_NAME... 
  (cd $TARGET_DIR; sh $TARGET_DIR/install/doinst.sh -install; )
  cp $TARGET_DIR/install/doinst.sh $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
  chmod 755 $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
  # Clean up the mess...
  if [ -d $TARGET_DIR/install ]; then
   (cd $TARGET_DIR/install ; rm -r -f doin* 1> /dev/null 2>&1 )
   rmdir $TARGET_DIR/install 1> /dev/null 2>&1
  fi
 fi
 # Now we reload the shell hash table in case we've added something useful
 # to the command path:
 hash -r
 # Done installing package $CURRENT_PACKAGE_NAME.
}
install_disk() {
 mount_the_source $1
 if [ $? = 1 ]; then
  umount_the_source;
  return 1;
 fi
 CURRENT_DISK_NAME="$1"
 PACKAGE_DIR=$SOURCE_DIR
 if [ "$SOURCE_MOUNTED" = "always" -a ! "$DISK_SETS" = "disk" ]; then
   PACKAGE_DIR=$PACKAGE_DIR/$1
 fi

 #
 # look for tagfile for this series and copy into $TMP/tagfile
 #
 touch $TMP/tagfile
 if [ ! "$DISK_SETS" = "disk" ]; then
  if [ -r /tmp/SeTtagext ]; then
   if [ -r $PACKAGE_DIR/tagfile`cat /tmp/SeTtagext` ]; then
    cat $PACKAGE_DIR/tagfile`cat /tmp/SeTtagext` >> $TMP/tagfile
   else
    if [ -r $PACKAGE_DIR/tagfile ]; then
     cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
    fi
   fi

  #
  # Do we need to follow a custom path to the tagfiles?
  #
  elif [ -r /tmp/SeTtagpath ]; then
   custom_path=`cat /tmp/SeTtagpath`
   short_path=`basename $PACKAGE_DIR`

   # If tagfile exists at the specified custom path, copy it over.
   if [ -r $custom_path/$short_path/tagfile ]; then
    cat $custom_path/$short_path/tagfile >> $TMP/tagfile

   else # well, I guess we'll use the default one then.
    if [ -r $PACKAGE_DIR/tagfile ]; then
     cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
    fi
   fi
  #
  # We seem to be testing for this too often... maybe this code should
  # be optimized a little...
  # 
  elif [ -r $PACKAGE_DIR/tagfile ]; then
   cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
  fi

  #
  # Execute menus if in QUICK mode:
  #
  if [ -r /tmp/SeTQUICK -a -r $PACKAGE_DIR/maketag ]; then
   if [ ! "$MAKETAG" = "" -a -r $PACKAGE_DIR/$MAKETAG ]; then # use alternate maketag
	# pshort=`basename $PACKAGE_DIR`
    sh $PACKAGE_DIR/$MAKETAG
   else    
    sh $PACKAGE_DIR/maketag
   fi
   if [ -r /tmp/SeTnewtag ]; then
    mv /tmp/SeTnewtag $TMP/tagfile
   fi
  fi

  #
  # Protect tagfile from hacker attack:
  #
  if [ -r $TMP/tagfile ]; then
   chmod 600 $TMP/tagfile
  fi

 fi #  ! "$DISK_SETS" = "disk" 

 # It's possible that the tagfile was specified on the command line.  If that's
 # the case, then we'll just override whatever we figured out up above.
 if [ ! "$USETAG" = "" ]; then
   cat $USETAG > $TMP/tagfile
 fi

 if [ "$1" = "single_disk" -o -r $PACKAGE_DIR/disk$1 ]; then
  CATALOG_FILE=`basename $PACKAGE_DIR/disk*`;
  if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
   if grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE 1> /dev/null 2>&1 ; then
    # First we check for missing packages...
    for PKGTEST in `grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10- 2> /dev/null` ; do
     if [ ! -r $PACKAGE_DIR/$PKGTEST.tgz ]; then
      cat << EOF > /tmp/tmpmsg

警告!!!

インデックスファイル($CATALOG_FILE)を調べていたら、本来
このディスク(ディスク$1)にあるべきパッケージ($PKGTEST.tgz)
が存在しないことがわかりました。このままインストールを
続けることも可能ですが、これが重要なファイルであったりする
と、次回マシンがブートできるか保証できません。

EOF
      dialog --title "ファイルの不足" --msgbox \
"`cat /tmp/tmpmsg`" 15 73
     fi
    done # checking for missing packages
    # Now we test for extra packages
    ALLOWED="`grep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10- 2> /dev/null`" 
    for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do
     BASE="`basename $PACKAGE_FILENAME .tgz`"
     if echo $ALLOWED | grep $BASE 1> /dev/null 2>&1 ; then
      GOOD="yup yup"
     else
      cat << EOF > /tmp/tmpmsg

警告!!!

インデックスファイル($CATALOG_FILE)を調べていたところ、
内容不明のパッケージ($BASE.tgz)が見つかりました。
このパッケージが本来ここにあるべきものなのかどうか、また
Slackwareの古いバージョンに由来するものでないか確認して
ください。時々アーカイブサイトではこういうことが起こりえます。

EOF
      dialog --title "余分なファイルが見つかりました" \
--msgbox "`cat /tmp/tmpmsg`" 15 67 
      rm -f /tmp/tmpmsg
     fi
    done 
   fi
   cat $PACKAGE_DIR/$CATALOG_FILE > $ADM_DIR/disk_contents/$CATALOG_FILE
   chmod 644 $ADM_DIR/disk_contents/$CATALOG_FILE
  fi
  for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do
   if [ "$PACKAGE_FILENAME" = "$PACKAGE_DIR/*.tgz" ]; then
    continue;
   fi
   CURRENT_PACKAGE_NAME=`basename $PACKAGE_FILENAME .tgz`
   AddKey=""
   SkipKey=""
   if [ "$ASK" = "tagfiles" ]; then # -a ! "$DISK_SETS" = "disk" ]; then
    if grep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | grep ADD 1> /dev/null 2>&1 ; then
     AddKey="ADD"
    fi
    if grep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | grep SKP 1> /dev/null 2>&1 ; then
     SkipKey="SKIP"
    fi
   elif [ "$ASK" = "never" ]; then
    AddKey="ADD"
   else # ASK must equal always
    ASK="always"
    fi  
   if [ ! "$DISK_SETS" = "disk" ]; then
    if grep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | grep ADD > /dev/null 2> /dev/null ; then
     PRIORITY="[required]"
    elif grep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | grep REC > /dev/null 2> /dev/null ; then
     PRIORITY="[recommended]"
    elif grep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | grep OPT > /dev/null 2> /dev/null ; then
     PRIORITY="[optional]"
    elif grep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | grep SKP > /dev/null 2> /dev/null ; then
     PRIORITY="[skip]"
    else
     PRIORITY="[unknown]"
    fi
   fi
   PACKAGE_SIZE=`filesize $PACKAGE_FILENAME`
   if [ "$AddKey" = "ADD" ]; then
    # echo "Auto-installing package ==>$CURRENT_PACKAGE_NAME<==  Priority: $PRIORITY" > /tmp/tmpmsg
    echo > /tmp/tmpmsg
    # Print out the description text:
    CATALOG_FILE=`basename $PACKAGE_DIR/disk*`;
#    if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
#     grep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$CATALOG_FILE | cut -b11- 1>> /tmp/tmpmsg 2> /dev/null ;
#    else
#	 pshort=`basename $PACKAGE_DIR`
    for index_file in $PACKAGE_DIR/disk* $PACKAGE_DIR/package_descriptions ; do
     if [ ! "$index_file" = "$PACKAGE_DIR/disk??*" ]; then
      if [ -r "$index_file" ]; then
       cat $index_file | grep "$CURRENT_PACKAGE_NAME:" | cut -b11- 1>> /tmp/tmpmsg 2> /dev/null 
      fi
     fi
    done
#    fi
    COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
    UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
    COMPRESSED="`expr $COMPBYTES / 1024` K"
    UNCOMPRESSED="`expr $UNCOMPBYTES / 1024` K"
    echo "サイズ: 圧縮時: $COMPRESSED, 非圧縮時: $UNCOMPRESSED." >> /tmp/tmpmsg
    if [ ! "$PRIORITY" = "" ]; then
     PMSG="  Priority: $PRIORITY"
    else
     PMSG=""
    fi
    dialog --title "自動インストールするパッケージ ==>$CURRENT_PACKAGE_NAME<==$PMSG" --infobox "`cat /tmp/tmpmsg`" 15 75
    rm -f /tmp/tmpmsg
    install_the_current_package;
   elif [ "$SkipKey" != "SKIP" ]; then
    # echo "Package Name: ==>$CURRENT_PACKAGE_NAME<==  Priority: $PRIORITY" > /tmp/tmpmsg
    echo > /tmp/tmpmsg
    CATALOG_FILE=`basename $PACKAGE_DIR/disk*`;
    if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
#    pshort=`basename $PACKAGE_DIR`
     grep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$CATALOG_FILE | cut -b11- 1>> /tmp/tmpmsg 2> /dev/null ;
    fi
    COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
    UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
    COMPRESSED="`expr $COMPBYTES / 1024` K"
    UNCOMPRESSED="`expr $UNCOMPBYTES / 1024` K"
    echo "サイズ: 圧縮時: $COMPRESSED, 非圧縮時: $UNCOMPRESSED." >> /tmp/tmpmsg
    echo >> /tmp/tmpmsg
    echo "パッケージ$CURRENT_PACKAGE_NAMEをインストールしますか？ " >> /tmp/tmpmsg
    if [ ! "$PRIORITY" = "" ]; then
     PMSG="  Priority: $PRIORITY"
    else
     PMSG=""
    fi
    dialog --title "パッケージ名: ==>$CURRENT_PACKAGE_NAME<==$PMSG" --menu "`cat /tmp/tmpmsg`" 22 75 1 \
"Yes" "$CURRENT_PACKAGE_NAMEをインストール" \
"No" "$CURRENT_PACKAGE_NAME はインストールしません" \
"Quit" "ソフトウェアインストールを中止" 2> /tmp/reply
    if [ $? = 1 -o $? = 255 ]; then
     echo "No  " > /tmp/reply
    fi
    REPLY="`cat /tmp/reply`"
    rm -f /tmp/reply /tmp/tmpmsg
    if [ "$REPLY" = "Yes" ]; then
     dialog --title "インストール中" --infobox "$CURRENT_PACKAGE_NAMEをインストール中" 3 50
     install_the_current_package;
    elif [ "$REPLY" = "Quit" ]; then
     umount_the_source;
     chmod 755 $TARGET_DIR
     chmod 1777 $TARGET_DIR/tmp
     exit 1;
    elif [ "$REPLY" = "No" ]; then
     dialog --title "スキップ中" --infobox "$CURRENT_PACKAGE_NAMEをスキップしています。" 3 50
    fi
   fi
  done
  OUTTAHERE="false"
  if [ -r $PACKAGE_DIR/install.end ]; then
   OUTTAHERE="true"
  fi
  umount_the_source;
  if [ "$OUTTAHERE" = "true" ]; then
   return 1;
  fi
 else
  umount_the_source;
  if [ ! "$SOURCE_MOUNTED" = "always" ]; then
   cat << EOF > /tmp/tmpmsg

ディスクが違います。正しいディスク($1)であるか確認した後、再挑戦
することもできますし、このディスクセットをスキップすることもでき
ます。

EOF
   dialog --title "ディスクが違います" --menu "`cat /tmp/tmpmsg`" 15 70 2 \
"Retry" "ディスク$1を再度マウントしてみます" \
"Skip" "このディスクセットをスキップします" 2> /tmp/reply
   if [ $? = 1 -o $? = 255 ]; then
    rm -f /tmp/reply /tmp/tmpmsg
    exit
   fi
   REPLY="`cat /tmp/reply`"
   rm -f /tmp/reply /tmp/tmpmsg
   if [ "$REPLY" = "Skip" ]; then
    return 1;
   else
    install_disk $1;
   fi
  else
   cat << EOF > /tmp/tmpmsg
警告:

インストール元ディレクトリにディスクセット$SERIES_NAMEが
見つかりません。スキップします。

EOF
   dialog --title "ディスクセットが見つかりません" --msgbox "`cat /tmp/tmpmsg`" 10 65
   rm -f /tmp/tmpmsg
   return 1; 
  fi 
 fi;
}
install_disk_set() { # accepts one argument: the series name in lowercase.
 SERIES_NAME=$1
 CURRENT_DISK_NUMBER="1";
 while [ 0 ]; do
  install_disk $SERIES_NAME$CURRENT_DISK_NUMBER;
  if [ $? = 1 -o $? = 255 ]; then # install.end was found, or the user chose
        # to quit installing packages.
   return 0;
  fi
  CURRENT_DISK_NUMBER=`expr $CURRENT_DISK_NUMBER + 1`
 done;
}
if [ "$DISK_SETS" = "disk" ]; then
 install_disk single_disk;
 ASK="always"
else
 touch $TMP/tagfile
 chmod 600 $TMP/tagfile
 if echo $DISK_SETS | grep "#a#" 1> /dev/null 2>&1; then
  A_IS_NEEDED="true"
 else
  A_IS_NEEDED="false"
 fi
 while [ 0 ];
 do
  while [ 0 ]; # strip leading '#'s
  do
   if [ "`echo $DISK_SETS | cut -b1`" = "#" ]; then
    DISK_SETS="`echo $DISK_SETS | cut -b2-`"
   else
    break;
   fi
  done
  if [ "$A_IS_NEEDED" = "true" ]; then
   if [ "$TARGET_DIR" = "/" ]; then
    dialog --title "警告：重大なトラブル発生" \
--menu " *** 警告！ システム実行中にディスクセット A をインストールし直す\
のは賢明ではありません。おやめになってください。"\
11 70 3 \
"Abort" "ソフトウェアのインストールを中断" \
"Ignore" "警告を無視し、とにかくセットAをインストールする" \
"Skip" "セットAはスキップするが、他のソフトのインストールは継続する" 2> /tmp/skip
    if [ $? = 1 -o $? = 255 ]; then
     exit
    fi
    WHATDO="`cat /tmp/skip`" 
    rm -f /tmp/skip
    if [ "$WHATDO" = "Abort" ]; then
     dialog --msgbox "中止..." 5 30
     A_IS_NEEDED="false"
     DISK_SETS=""
     continue;
    elif [ "$WHATDO" = "Skip" ]; then
     dialog --msgbox "セットAをスキップ..." 5 30
     A_IS_NEEDED="false"
     continue;
    elif [ ! "$WHATDO" = "Ignore" ]; then
     continue; # unknown response
    fi
   fi
   cat << EOF > /tmp/tmpmsg

--- Installing disk series ==>a<==

EOF
   dialog --infobox "`cat /tmp/tmpmsg`" 5 45
   sleep 1
   rm -f /tmp/tmpmsg
   install_disk_set a;
   A_IS_NEEDED="false"
  fi
  count="1"
  if [ "`echo $DISK_SETS | cut -b$count`" = "" ]; then
   break; # we be done here :^)
  else
   count="2"
   while [ 0 ]; do
    if [ "`echo $DISK_SETS | cut -b$count`" = "" -o "`echo $DISK_SETS | cut -b$count`" = "#" ]; then
     count="`expr $count - 1`"
     break;
    else
     count="`expr $count + 1`"
    fi 
   done
  fi 
  diskset="`echo $DISK_SETS | cut -b1-$count`"
  count="`expr $count + 1`"
  DISK_SETS="`echo $DISK_SETS | cut -b$count-`"
  if [ "$diskset" = "a" ]; then
   continue; # we expect this to be done elsewhere
  fi

  if [ -r /tmp/SeTnewtag ]; then
      mv /tmp/SeTnewtag $TMP/tagfile
  fi

  # Protect tagfile from hacker attack:
  #
  # if [ -r $TMP/tagfile ]; then
  #   chmod 600 $TMP/tagfile
  # fi
  # install_disk_set xs;

  cat << EOF > /tmp/tmpmsg

Installing disk series ==>$diskset<==

EOF
  dialog --infobox "`cat /tmp/tmpmsg`" 5 45
  sleep 1
  rm -f /tmp/tmpmsg
  install_disk_set $diskset; 
 done
fi

if [ "$DISK_SETS" = "disk" -o "$CMD_START" = "true" ]; then
 if [ -r $TMP/tagfile ]; then
  rm $TMP/tagfile
 fi
fi
chmod 755 $TARGET_DIR $TARGET_DIR/var $TARGET_DIR/usr
chmod 1777 $TARGET_DIR/tmp
