cdesktopenv/cde/programs/dtinfo/dtinfogen/install/Librarian

771 lines
17 KiB
Bash
Executable File

#!/bin/sh
set -h
###############################################################################
#
# Set up shell traps
#
###############################################################################
USERPATH=$PATH
PATH=/bin:/usr/bin:/usr/sbin
RETCODE=0
trap '\
RETCODE=${RETCODE:-$?} ;\
/bin/rm -rf $BogusInfoLibDir ;\
/bin/rm -f $SRCLIBPATH/$MMDBMAP.1.$$ ;\
/bin/rm -f $SRCLIBPATH/$MMDBMAP.2.$$ ;\
exit $RETCODE \
' 0 1 2 3 4 5 6 7 8 10 12 15
###############################################################################
ECHOCMD="echo"
ECHOSUF='\\c'
if [ -n "`eval $ECHOCMD $ECHOSUF`" ]; then
ECHOCMD="echo -n"
ECHOSUF=""
fi
echo_f() {
eval $ECHOCMD "$1$ECHOSUF"
}
###############################################################################
confirm_f() {
YorN=
echo ""
echo_f "\ \ \ \ Is \[$1] correct? \[ynq\]\ "
read YorN
if [ "$YorN" = "q" -o "$YorN" = "Q" ] ; then
exit 0
fi
if [ -z "$YorN" -o "$YorN" = "y" -o "$YorN" = "Y" ] ; then
return 1
else
return 0
fi
}
###############################################################################
read_f() {
ANSWER=
read ANSWER
if [ "$ANSWER" = "q" -o "$ANSWER" = "Q" ] ; then
exit 0
fi
}
###############################################################################
DisplayMenu() {
clear
echo "
1) List bookcases in a library
2) Copy a bookcase from another library
3) Rename a bookcase
4) Rearrange bookcases in a library
5) Remove a bookcase
6) Exit
"
echo_f "Please enter your choice \[1-6\]\ "
}
###############################################################################
### Listing of all bookcases available in $1
ListCatalog () {
# list all the bookcases available in the infolib parameter
echo "
The bookcases available in [$1] are:
"
awk 'BEGIN { FS="\t" }
{ if (NR > 1) printf (" %d) %s\t[%s]\n", NR-1, $1, $2 ) }' \
< $1/$MMDBMAP
}
###############################################################################
MoveCatalog () {
# list all the bookcases available in the infolib parameter
echo "
The order of the bookcase(s) without [$BOOKCASENAME1] is:
"
awk 'BEGIN { FS="\t" }
{ if (NR > 1) printf (" %d) %s\t[%s]\n", NR-1, $1, $2 ) }' \
< $1
}
###############################################################################
ValidateInfolibPath () {
INFOLIB=$1
if [ -z "$INFOLIB" -o ! -d $INFOLIB ] ; then
echo "(ERROR) $INFOLIB is not a valid information library" >&2
INFOLIB=""
return
fi
cd $INFOLIB
INFOLIB=`pwd`
cd $CURDIR
}
###############################################################################
ListLibrary() {
SRCLIBPATH=
while [ -z "$SRCLIBPATH" ] ; do
echo "
Enter the path for the library to view.
This can be a relative or absolute path, or to exit, type 'q'."
echo_f "\ \ \ \ --\>\ "
read_f
ValidateInfolibPath $ANSWER
SRCLIBPATH=$INFOLIB
done
### prompt for name of bookcase that is going to be installed ###
LIBDESC=`awk 'BEGIN { FS="\t" }
{ if (NR == 1) print ($1) }' \
< $SRCLIBPATH/$MMDBMAP`
echo ""
echo " Description: [$LIBDESC]"
ListCatalog $SRCLIBPATH
if [ $? -ne 0 ] ; then
exit 1
fi
echo ""
echo_f "\ \ \ \ Hit any key to continue or type 'q' to quit\ "
read_f
}
###############################################################################
CopyBookcase() {
### prompt for infolib and bookcase ###
SRCLIBPATH=
while [ -z "$SRCLIBPATH" ] ; do
echo "
Enter the path for the library from which you want to copy a bookcase.
This can be a relative or absolute path, or to exit, type 'q'."
echo_f "\ \ \ \ --\>\ "
read_f
SRCLIBPATH=$ANSWER
ValidateInfolibPath $SRCLIBPATH
SRCLIBPATH=$INFOLIB
done
BOOKCASENAME=
while [ -z "$BOOKCASENAME" ] ; do
### prompt for name of bookcase that is going to be installed ###
ListCatalog $SRCLIBPATH
if [ $? -ne 0 ] ; then
exit 1
fi
SRCBOOKCASELIST=`awk '{ if (NR > 1) print $1 }' < $SRCLIBPATH/$MMDBMAP `
NUMPOS=`awk 'END { print NR-1 }' < $SRCLIBPATH/$MMDBMAP `
if [ $? -ne 0 ] ; then
echo "(ERROR) Cannot display bookcase #" >&2
exit 1
fi
echo ""
echo_f "\ \ \ \ Enter the number of the bookcase to copy \[1-$NUMPOS\]\ "
read_f
POSITION=$ANSWER
if [ -z "$POSITION" ] ; then
continue
fi
if [ "$POSITION" -lt 1 -o "$POSITION" -gt "$NUMPOS" ]; then
echo "(ERROR) Invalid choice [$POSITION], please try again"
sleep 2
continue
fi
### Confirm the selection with the user
BOOKCASENAME=`awk '{
if ( NR == position+1 ) { print $1 }
}' position=$POSITION < $SRCLIBPATH/$MMDBMAP`
confirm_f "$BOOKCASENAME"
if [ $? -eq 0 ] ; then
BOOKCASENAME=""
fi
done
DESTLIBPATH=
while [ -z "$DESTLIBPATH" ] ; do
echo "
Enter the path for the destination library.
This can be a relative or absolute path, or to exit, type 'q'."
echo_f "\ \ \ \ --\>\ "
read_f
DESTLIBPATH=$ANSWER
ValidateInfolibPath $DESTLIBPATH
DESTLIBPATH=$INFOLIB
### Check if BookCaseName already exists ###
TSTSTRING=
TSTSTRING=`awk '{
if ( $1 == bcname ) { print $1 }
}' bcname=$BOOKCASENAME < $DESTLIBPATH/$MMDBMAP`
if [ -n "$TSTSTRING" ] ; then
echo "\ \ \ \ $BOOKCASENAME already exists in $DESTLIBPATH"
echo_f "\ \ \ \ Do you want to override it? \[ynq\]\ "
read_f
RESPONSE=$ANSWER
OVERRIDE=
if [ "$RESPONSE" = "y" ] ; then
OVERRIDE=-i
DeInstallBase $BOOKCASENAME $DESTLIBPATH
if [ $? -ne 0 ] ; then
echo "(ERROR) Unable to remove $BOOKCASENAME from $DESTLIBPATH"
exit 1
fi
elif [ "$RESPONSE" = "n" ]; then
break
fi
fi
done
### Prompt for parameter verification ###
echo "
You specified this information.
Copy [$BOOKCASENAME] from: $SRCLIBPATH
to : $DESTLIBPATH
"
echo_f "\ \ \ \ Is this correct? [ynq]\ "
read_f
echo ""
RESPONSE=$ANSWER
if [ "$RESPONSE" = "n" ]; then
return
fi
### Grab the bookcase entry line
BCENTRY=`awk '{
if ( NR > 1 && $1 == bookcasename ) { print $0 }
}' bookcasename=$BOOKCASENAME $SRCLIBPATH/$MMDBMAP`
if [ -z "$BCENTRY" ]; then
echo "(ERROR) $BOOKCASENAME does not exist in $SRCLIBPATH"
exit 1
fi
if [ ! -d $BogusInfoLibDir ]; then
mkdir -p $BogusInfoLibDir
else
echo "(ERROR) $BogusInfoLibDir already exists, cannot proceed" >&2
exit 1
fi
cd $BogusInfoLibDir
MMDB_PATH=$BogusInfoLibDir
### set up the bogus link to fool MMDB into believing that
### it is an info-lib
DESTBCLIST=`awk '{ if (NR > 1) print $1 }' < $DESTLIBPATH/$MMDBMAP `
for CurBookCase in $DESTBCLIST; do
ln -s $DESTLIBPATH/$CurBookCase $CurBookCase
done
if [ $? -ne 0 ]; then
echo "(ERROR) Failed to link bookcases from $DESTLIBPATH" >&2
exit 1
fi
### Link the new bookcase to be installed ###
ln -s $SRCLIBPATH/$BOOKCASENAME $BOOKCASENAME
cp $DESTLIBPATH/$MMDBMAP $MMDBMAP
### Update the new $MMDBMAP file with the new entry
echo "$BCENTRY" >> $MMDBMAP
### actually perform the validation ###
echo " Validating bookcases...please wait"
### Generate the BookCaseList ###
BookCaseList=`awk '{if (NR > 1) print $1 }' < $MMDBMAP`
for CurBookCase in $BookCaseList; do
if [ "$BOOKCASENAME" != "$CurBookCase" ]; then
echo " ...Validating $BOOKCASENAME against $CurBookCase"
valBase $BOOKCASENAME $CurBookCase
fi
if [ $? -ne 0 ]; then
echo "(ERROR) No copying is performed because of errors found in validation" >&2
rm -rf $BogusInfoLibDir
sleep 2
return
fi
done
echo " Validation complete."
### clean up the bogus infolib directory ###
cd $CURDIR
rm -r $BogusInfoLibDir
echo "
Copying bookcase... please wait
"
cd $DESTLIBPATH
(cd $SRCLIBPATH ; tar cf - $BOOKCASENAME) | tar xpf -
if [ $? -ne 0 ]; then
echo "(ERROR) Copying failed" >&2
exit 1
fi
echo "$BCENTRY" >> $MMDBMAP
echo " Bookcase copied."
echo ""
echo_f "\ \ \ \ Hit any key to continue or type 'q' to quit\ "
read_f
}
###############################################################################
RenameBookcase() {
### prompt for bookcase to be renamed ###
SRCLIBPATH=
while [ -z "$SRCLIBPATH" ] ; do
echo "
Enter the path for the library to modify.
This can be a relative or absolute path, or to exit, type 'q'."
echo_f "\ \ \ \ --\>\ "
read_f
ValidateInfolibPath $ANSWER
SRCLIBPATH=$INFOLIB
done
BOOKCASENAME=
while [ -z "$BOOKCASENAME" ] ; do
### prompt for name of bookcase that is going to be installed ###
ListCatalog $SRCLIBPATH
if [ $? -ne 0 ] ; then
exit 1
fi
SRCBOOKCASELIST=`awk '{ if (NR > 1) print $1 }' < $SRCLIBPATH/$MMDBMAP `
NUMPOS=`awk 'END { print NR-1 }' < $SRCLIBPATH/$MMDBMAP `
if [ $? -ne 0 ] ; then
echo "(ERROR) Cannot display bookcase #" >&2
exit 1
fi
echo ""
echo_f "\ \ \ \ Enter the number of the bookcase to rename \[1-$NUMPOS\]\ "
read_f
POSITION=$ANSWER
if [ -z "$POSITION" ] ; then
continue
fi
if [ "$POSITION" -lt 1 -o "$POSITION" -gt "$NUMPOS" ]; then
echo "(ERROR) Invalid choice [$POSITION], please try again"
sleep 2
continue
fi
### Confirm the selection with the user
BOOKCASENAME=`awk '{
if ( NR == position+1 ) { print $1 }
}' position=$POSITION < $SRCLIBPATH/$MMDBMAP`
confirm_f "$BOOKCASENAME"
if [ $? -eq 0 ] ; then
BOOKCASENAME=""
fi
done
BookCaseTitle=""
while [ -z "$BookCaseTitle" ] ; do
echo "
Enter the new description for $BOOKCASENAME, or type 'q' to quit."
echo_f "\ \ \ \ --\>\ "
read_f
BookCaseTitle=$ANSWER
### Confirm the title with the user ###
confirm_f "$BookCaseTitle"
if [ $? -eq 0 ] ; then
BOOKCASENAME=""
continue
fi
ChangeCaseTitle $SRCLIBPATH $BOOKCASENAME "$BookCaseTitle"
if [ $? -ne 0 ]; then
exit 1
fi
done
echo " Bookcase renamed."
echo ""
echo_f "\ \ \ \ Hit any key to continue or type 'q' to quit\ "
read_f
}
###############################################################################
RearrangeBookcase() {
### prompt for source information library ###
SRCLIBPATH=
while [ -z "$SRCLIBPATH" ] ; do
echo "
Enter the path for the library to modify.
This can be a relative or absolute path, or to exit, type 'q'."
echo_f "\ \ \ \ --\>\ "
read_f
ValidateInfolibPath $ANSWER
SRCLIBPATH=$INFOLIB
done
BOOKCASENAME1=
while [ -z "$BOOKCASENAME1" ] ; do
SRCBOOKCASELIST=`awk '{ if (NR > 1) print $1 }' < $SRCLIBPATH/$MMDBMAP `
NUMPOS=`awk 'END { print NR-1 }' < $SRCLIBPATH/$MMDBMAP `
if [ $NUMPOS -lt 2 ] ; then
echo " No bookcases to rearrange only $NUMPOS available."
sleep 2
return
fi
### prompt for name of bookcase that is going to be moved ###
ListCatalog $SRCLIBPATH
if [ $? -ne 0 ] ; then
exit 1
fi
echo ""
echo_f "\ \ \ \ Enter the number of the bookcase to move \[1-$NUMPOS\]\ "
read_f
POSITION=$ANSWER
if [ -z "$POSITION" ] ; then
continue
fi
if [ "$POSITION" -lt 1 -o "$POSITION" -gt "$NUMPOS" ]; then
echo "(ERROR) Invalid choice [$POSITION], please try again"
sleep 2
continue
fi
### Confirm the selection with the user
BOOKCASENAME1=`awk '{
if ( NR == position+1 ) { print $1 }
}' position=$POSITION < $SRCLIBPATH/$MMDBMAP`
confirm_f "$BOOKCASENAME1"
if [ $? -eq 0 ] ; then
BOOKCASENAME1=""
fi
done
### Grab the entry line for the bookcase
BCENTRY=`awk '{
if ( NR > 1 && $1 == bookcasename ) { print $0 }
}' bookcasename=$BOOKCASENAME1 $SRCLIBPATH/$MMDBMAP`
if [ -z "$BCENTRY" ]; then
echo "(ERROR) $BOOKCASENAME1 does not exist in $SRCLIBPATH"
exit 1
fi
### Prepare $MMDBMAP for rearrangement ###
awk '{
if ( NR == 1 || $1 != BookCaseName ) { print $0 }
}' BookCaseName=$BOOKCASENAME1 \
< $SRCLIBPATH/$MMDBMAP > $SRCLIBPATH/$MMDBMAP.1.$$
POSITION=
while [ -z "$POSITION" ] ; do
MoveCatalog $SRCLIBPATH/$MMDBMAP.1.$$
echo "
Enter the number corresponding to the position you want [$BOOKCASENAME1]
to occupy. If another bookcase already occupies the position you
choose, the bookcase you are moving takes its place, and the original
bookcase moves one place down in the list."
echo_f "\ \ \ \ Default is $NUMPOS, or type 'q' to quit. \[1-$NUMPOS\]\ "
read_f
POSITION=$ANSWER
if [ -z "$POSITION" ] ; then
POSITION=$NUMPOS
fi
if [ $POSITION -lt 1 -o $POSITION -gt $NUMPOS ]; then
echo "(ERROR) Invalid choice [$POSITION], try again"
continue
fi
### Prompt for parameter verification ###
echo "
You specified this order for the bookcases :
"
if [ "$POSITION" != "$NUMPOS" ]; then
awk ' {
if ( NR != POSITION+1 ) { print $0 }
if ( NR == POSITION+1 ) { print BookCaseEntry; print $0 }
}' POSITION="$POSITION" BookCaseEntry="$BCENTRY" < \
$SRCLIBPATH/$MMDBMAP.1.$$ > $SRCLIBPATH/$MMDBMAP.2.$$
else
cp $SRCLIBPATH/$MMDBMAP.1.$$ $SRCLIBPATH/$MMDBMAP.2.$$
echo "$BCENTRY" >> $SRCLIBPATH/$MMDBMAP.2.$$
fi
awk 'BEGIN { FS="\t" }
{ if (NR > 1) {printf(" %d) %s\t[%s]\n", NR-1, $1, $2); }}
' < $SRCLIBPATH/$MMDBMAP.2.$$
echo ""
echo_f "\ \ \ \ Is this correct? \[ynq\]\ "
read_f
Response=$ANSWER
if [ "$Response" = "n" ]; then
POSITION=
continue
fi
## move the file with new order to $MMDBMAP ###
mv $SRCLIBPATH/$MMDBMAP.2.$$ $SRCLIBPATH/$MMDBMAP
rm -f $SRCLIBPATH/$MMDBMAP.1.$$
done
echo " Bookcase rearranged."
echo ""
echo_f "\ \ \ \ Hit any key to continue or type 'q' to quit\ "
read_f
}
###############################################################################
RemoveBookcase() {
### prompt for bookcase to be removed ###
SRCLIBPATH=
while [ -z "$SRCLIBPATH" ] ; do
echo "
Enter the path for the library to modify.
This can be a relative or absolute path, or to exit, type 'q'."
echo_f "\ \ \ \ --\>\ "
read_f
ValidateInfolibPath $ANSWER
SRCLIBPATH=$INFOLIB
done
BOOKCASENAME=
while [ -z "$BOOKCASENAME" ] ; do
### prompt for name of bookcase that is going to be installed ###
ListCatalog $SRCLIBPATH
if [ $? -ne 0 ] ; then
exit 1
fi
SRCBOOKCASELIST=`awk '{ if (NR > 1) print $1 }' < $SRCLIBPATH/$MMDBMAP `
NUMPOS=`awk 'END { print NR-1 }' < $SRCLIBPATH/$MMDBMAP `
if [ $? -ne 0 ] ; then
echo "(ERROR) Cannot display bookcase #" >&2
exit 1
fi
echo ""
echo_f "\ \ \ \ Enter the number of the bookcase to remove \[1-$NUMPOS\]\ "
read_f
POSITION=$ANSWER
if [ -z "$POSITION" ] ; then
continue
fi
if [ "$POSITION" -lt 1 -o "$POSITION" -gt "$NUMPOS" ]; then
echo "(ERROR) Invalid choice [$POSITION], please try again"
sleep 2
continue
fi
### Confirm the selection with the user
BOOKCASENAME=`awk '{
if ( NR == position+1 ) { print $1 }
}' position=$POSITION < $SRCLIBPATH/$MMDBMAP`
confirm_f "$BOOKCASENAME"
if [ $? -eq 0 ] ; then
BOOKCASENAME=""
fi
done
### Actually perform the de-installation ###
echo " Removing $BOOKCASENAME...please wait"
DeInstallBase $BOOKCASENAME $SRCLIBPATH
if [ $? -ne 0 ]; then
echo "(ERROR) Bookcase is not removed because of errors found in De-Installation utility" >&2
exit 1
fi
echo " Bookcase removed."
echo ""
echo_f "\ \ \ \ Hit any key to continue or type 'q' to quit\ "
read_f
}
###############################################################################
CURDIR=`pwd`
if [ -z "$OLIASDDKBIN" ]; then
NewDir=`dirname $0`
cd $NewDir
OLIASDDKBIN=`pwd`
cd $CURDIR
fi
export MMDB_PATH PATH TMPDIR
TMPDIR=${TMPDIR:-/usr/tmp}
PATH=/bin:/usr/bin:/usr/sbin:${OLIASDDKBIN}
MMDBMAP=bookcase.map
### set up bogus info-lib directory for validation
BogusInfoLibDir=$TMPDIR/infolib$$
###############################################################################
## Get the task option ###
CHOICE=
while [ -z "$CHOICE" ] ; do
DisplayMenu
read CHOICE
case "$CHOICE" in
1)
ListLibrary
;;
2)
CopyBookcase
;;
3)
RenameBookcase
;;
4)
RearrangeBookcase
;;
5)
RemoveBookcase
;;
q|Q|6)
exit 0
;;
*)
echo "
*** Invalid choice, please try again ***
" >&2
sleep 2
;;
esac
cd $CURDIR
CHOICE=
done