#!/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 1台目のドライブ" \ "/dev/fd1u1440" "1.44 MB 2台目のドライブ" \ "/dev/fd0h1200" "1.2 MB 1台目のドライブ" \ "/dev/fd1h1200" "1.2 MB 2台目のドライブ" 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 1枚のディスクからインストールするには、何も打たずに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