Home | History | Annotate | Download | only in scripts
      1 #!/bin/bash
      2 
      3 ARCH=`uname -p`
      4 if [ $ARCH != "sparc" ]; then
      5     ARCH=x86
      6 fi
      7 ALL_PRODUCTS="jds=JDS Common Packages
      8 jds-src=Sources for JDS Common Packages
      9 gnome=GNOME 2.17 Desktop
     10 gnome-src=GNOME 2.17 Source
     11 mozilla=Mozilla 1.7 Web Browser
     12 mozilla-src=Mozilla Source
     13 firefox=Firefox Web Browser
     14 firefox-src=Firefox Source
     15 thunderbird=Thunderbird Email and News Client
     16 thunderbird-src=Thunderbird Source
     17 idn
     18 idn-src
     19 evolution=Evolution Email and Calendar
     20 evolution-src=Evolution Source
     21 glow=Integrated Collaboration Environment
     22 jai=Java Advanced Imaging
     23 jai-iio=Java Advanced Imaging
     24 java=Java Runtime Environment
     25 java-src
     26 javaapps=Java Applications
     27 javaapps-src=Java Applications Sources
     28 java3d
     29 jcs
     30 jdk=Java Development Kit
     31 jdic=Java Desktop Integration Components
     32 jdnc=Java Desktop Network Components
     33 jinput=Java Controller API
     34 joal=Java bindings for OpenAL API
     35 jogl=Java bindings for OpenGL API
     36 l10n=Globalization Tools
     37 l10n-src=Globalization Tools Sources
     38 l10nmessages=Localized Messages
     39 iiim=Input Method Switcher
     40 iiim-src=Input Method Switcher Sources
     41 muscle
     42 plugins=Third Party Browser Plugins
     43 plugins-src
     44 scs-client
     45 staroffice=StarOffice office suite
     46 starsuite=StarSuite office suite
     47 so-sdk=StarOffice Software Development Kit
     48 updater
     49 netbeans
     50 javahelp
     51 xserver=X.org server
     52 nodist=Extra packages for JDS developers
     53 nodist-src=Extra sources for JDS developers
     54 apoc-daemon=APOC Daemon
     55 apoc-daemon-src=APOC Daemon Sources
     56 apoc-sol-$ARCH=APOC Configuration Manager
     57 apoc-sol-$ARCH-src=APOC Configuration Manager Sources"
     58 
     59 ALL_PATCHDIRS="patches-xserver=X server patches
     60 patches-mozilla=Patches required for the Mozilla Web browser
     61 patches-gnome=Patches required for the GNOME Desktop"
     62 
     63 PKGADD=/usr/sbin/pkgadd
     64 PATCHADD=/usr/sbin/patchadd
     65 PKGRM=/usr/sbin/pkgrm
     66 PKGINFO=/usr/bin/pkginfo
     67 ADMIN=/tmp/.pkg.$$.admin
     68 ADMIN_CREATED=no
     69 
     70 MYNAME="$0"
     71 MYDIR=`dirname $0`
     72 MYDIR=`( cd $MYDIR; pwd )`
     73 MYNAME=$(basename $0)
     74 MYARGS="$*"
     75 LOGFILE=/var/sadm/install/logs/jds-install.log.$$
     76 INFOFILE=$MYDIR/.pkginfo
     77 SYSTEM=`uname -s`
     78 ARCH=`uname -p`
     79 RELEASE=`uname -r`
     80 KERNELID=`uname -v`
     81 
     82 # ask "question" variable_name "default answer"
     83 ask () {
     84     echo -n "$1"
     85     if [ ! -z $3 ]; then
     86 	echo -n " [$3]: "
     87     else
     88 	echo -n ": "
     89     fi
     90 
     91     read -e val
     92     if [ "x$val" = x ]; then
     93 	eval "$2=\"$3\""
     94     else
     95 	eval "$2=\"$val\""
     96     fi
     97 }
     98 
     99 # ask_yes_no "question" variable_name "default answer"
    100 ask_yes_no () {
    101     yes_no_repeat=yes
    102     while [ $yes_no_repeat = yes ]; do
    103 	yes_no_repeat=no
    104 	ask "${@}"
    105 	eval "the_ans=\"\$$2\""
    106 	echo "$the_ans" | grep -i "^`l10n_print yes`$" > /dev/null
    107 	if [ $? = 0 ]; then
    108 	    eval "$2=yes"
    109 	    return
    110 	fi
    111 	echo "$the_ans" | grep -i "^`l10n_print no`$" > /dev/null
    112 	if [ $? = 0 ]; then
    113 	    eval "$2=no"
    114 	    return
    115 	fi
    116 	l10n_print "Please answer yes or no"
    117 	yes_no_repeat=yes
    118     done
    119 }
    120 
    121 get_req () {
    122     test -r $INFOFILE && \
    123 	grep -i "^$1[ 	]*=[ 	]*" $INFOFILE | cut -f2 -d= | tr -d ' 	'
    124 }
    125 
    126 REQ_SYSTEM=`get_req system`
    127 REQ_ARCH=`get_req arch`
    128 REQ_RELEASE=`get_req release`
    129 REQ_KERNELID=`get_req kernelid`
    130 
    131 version_lower () {
    132     declare -a version1
    133     declare -a version2
    134     
    135     IFS=' '
    136     for n in `echo $1 | sed -e 's/Generic/999999/' | tr -cs "[0-9]" "[ *]"`; do
    137 	version1=(${version1[*]} $n)
    138     done
    139     for n in `echo $2 | sed -e 's/Generic/999999/' | tr -cs "[0-9]" "[ *]"`; do
    140 	version2=(${version2[*]} $n)
    141     done
    142     
    143     typeset -i n=0
    144     while /bin/true; do
    145 	if [ -n "${version1[$n]}" ]; then
    146 	    if [ -n "${version2[$n]}" ]; then
    147 		if [ ${version1[$n]} -lt ${version2[$n]} ]; then
    148 		    return 0
    149 		else
    150 		    if [ ${version1[$n]} -gt ${version2[$n]} ]; then
    151 			return 1
    152 		    fi
    153 		fi
    154 	    else
    155 		return 1
    156 	    fi
    157 	else
    158 	    if [ -n "${version2[$n]}" ]; then
    159 		return 0
    160 	    fi
    161 	    return 1
    162 	fi
    163 	typeset n=$n+1
    164     done
    165 }
    166 
    167 usage () {
    168     echo "%s [options]" "$0"
    169     l10n_print "Install the Java Desktop System, GNOME 2.17, Solaris Edition"
    170     l10n_print "   -h, --help     display this help"
    171     l10n_print "   --quiet, -q    less verbose operation."
    172     l10n_print "   --force, -f    ignore any errors and continue."
    173     l10n_print "   --ignore, -i   ignore file conflicts and continue."
    174     l10n_print "   -n             non-interactive installation."
    175     l10n_print "   -R rootdir     install into an alternative root directory."
    176     l10n_print "   -p prod1,prod2,..."
    177     l10n_print "                  select products for installation"
    178     l10n_print "   -a             install all products"
    179     l10n_print "   --nopatch      don't install OS patches"
    180     l10n_print "   --accept       accept the license terms"
    181     l10n_print "   --tmpdir dir   create temporary files in dir instead of /tmp"
    182     exit 1
    183 }
    184 
    185 QUIET=no
    186 FORCE=no
    187 IGNORE_CONFLICT=no
    188 INTERACTIVE=yes
    189 ROOTDIR=
    190 PRODUCTS=
    191 NO_PATCHES=no
    192 BASE_TEMPDIR=/tmp
    193 LICENSE_ACCEPTED=yes
    194 
    195 process_options () {
    196     while [ $# != 0 ]; do
    197 	case "$1" in
    198 	    --help | -h )
    199 		usage
    200 		;;
    201 	    --quiet | -q )
    202 		QUIET=yes
    203 		;;
    204 	    --force | -f )
    205 		FORCE=yes
    206 		;;
    207 	    --ignore | -i )
    208 		IGNORE_CONFLICT=yes
    209 		;;
    210 	    -R )
    211 		shift
    212 		ROOTDIR=$1
    213 		if [ "x$ROOTDIR" = x ]; then
    214 		    l10n_print "Option %s requires an argument" "-R"
    215 		    usage
    216 		fi
    217 		;;
    218 	    -n )
    219 		INTERACTIVE=no
    220 		;;
    221 	    -a )
    222 		select_all_products
    223 		unselect_all_srcs
    224 		unselect_product nodist
    225 		;;
    226 	    --accept )
    227 		LICENSE_ACCEPTED=yes
    228 		;;
    229 	    -p )
    230 		shift
    231 		PRODUCTS="$1"
    232 		if [ "x$PRODUCTS" = x ]; then
    233 		    l10n_print "Option %s requires an argument" "-R"
    234 		    usage
    235 		fi
    236 		;;
    237 	    --tmpdir )
    238 		shift
    239 		BASE_TEMPDIR="$1"
    240 		if [ "x$BASE_TEMPDIR" = x ]; then
    241 		    l10n_print "Option %s requires an argument" "--tmpdir"
    242 		    usage
    243 		fi
    244 		;;
    245 	    --nopatch )
    246 		NO_PATCHES=yes
    247 		;;
    248 	    * )
    249 		l10n_print "Error: %s: invalid argument" "$1"
    250 		usage
    251 		;;
    252 	esac
    253 	shift
    254     done
    255 }
    256 
    257 logrun () {
    258     status_file=/tmp/.command_status.$$
    259     rm -f $status_file
    260     echo "running $*" >> $LOGFILE
    261     echo "*** command output follows ***" >> $LOGFILE
    262     if [ "x$QUIET" = xno ]; then
    263 	( "${@}" 2>&1 ; echo $? > $status_file ) | tee -a $LOGFILE
    264     else
    265 	( "${@}" 2>&1 ; echo $? > $status_file ) >> $LOGFILE
    266     fi
    267     echo "*** command output ends ***" >> $LOGFILE
    268     status=`cat $status_file`
    269     rm -f $status_file
    270     return $status
    271 }
    272 
    273 backup () {
    274     if [ -e "$1" ]; then
    275 	backup "$1~"
    276 	l10n_print "Saving file %s as %s~" "$1" "$1"
    277 	mv "$1" "$1~" || msg_fatal "Failed to back up file %s" "$1"
    278     fi
    279 }
    280 
    281 clean_up () {
    282     if [ "x$ADMIN_CREATED" = xyes ]; then
    283 	rm -f $ADMIN
    284     fi
    285     cd /
    286     rm -rf $TEMPDIR
    287 }
    288 
    289 clean_up_and_abort () {
    290     clean_up
    291     l10n_print "Interrupted."
    292     exit 1
    293 }
    294 
    295 TEXTDOMAIN=install-jds
    296 l10n_print () {
    297     l10n_msg=`TEXTDOMAINDIR="$MYDIR"/.install gettext -d "$TEXTDOMAIN" "$1"`
    298     shift
    299     printf "$l10n_msg\n" "${@}"
    300 }
    301 
    302 msg_fatal () {
    303     msg_log "${@}"
    304     l10n_print "${@}" 1>&2
    305     clean_up
    306     exit 1
    307 }
    308 
    309 msg_error () {
    310     msg_log "${@}"
    311     l10n_print "${@}" 1>&2
    312     if [ $FORCE = no ]; then
    313 	if [ "x$INTERACTIVE" = xyes ]; then
    314 	    ask_yes_no "`l10n_print 'Would you like to continue?'`" ans \
    315 		`l10n_print "no"`
    316 	    if [ "x$ans" = xno ]; then
    317 		clean_up
    318 		exit 1
    319 	    fi
    320 	    WARNINGS=yes
    321 	else
    322 	    clean_up
    323 	    exit 1
    324 	fi
    325     else
    326 	WARNINGS=yes
    327     fi
    328 }
    329 
    330 msg_log () {
    331     test -f $LOGFILE || return
    332     log_arg1="$1"
    333     shift
    334     printf "$log_arg1\n" "${@}" >> $LOGFILE
    335 }
    336 
    337 WARNINGS=no
    338 msg_warning () {
    339     l10n_print "${@}"
    340     WARNINGS=yes
    341 }
    342 
    343 # check_disk_space directory minsize(kB)
    344 check_disk_space () {
    345     dir_to_check="$ROOTDIR$1"
    346     while [ ! -d $dir_to_check ]; do
    347 	dir_to_check="`dirname $dir_to_check`"
    348     done
    349     freespace=`df -k "$dir_to_check" | awk '!/Filesystem/ {print $4}'`
    350     if [ $freespace -le $2 ]; then
    351 	return 1
    352     fi
    353 
    354     return 0
    355 }
    356 
    357 # so_disk_space_check prodname
    358 so_disk_space_check () {
    359     # Need large tmp area (>=1GB) for StarOffice/StarSuite installation.
    360     check_disk_space $TEMPDIR 1048576 || \
    361         msg_error "Your %s directory has less than 1GB free.\nYou need to specify an alternative temp dir with the --tmpdir switch." "$BASE_TEMPDIR"
    362 }
    363 
    364 init () {
    365     USER_IS_ROOT=0
    366     /usr/bin/id | /usr/bin/grep '^uid=0(' > /dev/null 2>&1
    367 
    368     if [ $? != 0 ]; then
    369 	msg_fatal "Only root can install this product."
    370     fi
    371 
    372     if [ $FORCE = no ]; then
    373 	trap clean_up_and_abort  HUP INT TERM
    374     else
    375 	trap clean_up_and_abort  HUP INT TERM ERR
    376     fi
    377 
    378     trap clean_up  QUIT EXIT
    379 }
    380 
    381 write_admin () {
    382     backup "$ADMIN"
    383     ADMIN_CREATED=yes
    384     cat > $ADMIN << EOF
    385 mail=
    386 instance=unique
    387 runlevel=nocheck
    388 setuid=nocheck
    389 action=nocheck
    390 partial=quit
    391 idepend=nocheck
    392 rdepend=nocheck
    393 space=quit
    394 EOF
    395 
    396     if [ $IGNORE_CONFLICT = no ]; then
    397         cat >> $ADMIN << EOF_2
    398 conflict=quit
    399 EOF_2
    400     else
    401         cat >> $ADMIN << EOF_3
    402 conflict=nocheck
    403 EOF_3
    404     fi
    405 }
    406 
    407 declare -a MOUNT_POINTS
    408 declare -a MP_SUMS
    409 disk_usage_init () {
    410     mps=`df -kl | grep '^/' | awk '{print $6}'  | sort -r`
    411     IFS=" 	
    412 "
    413     typeset -i i=0
    414     for mp in $mps; do
    415 	MOUNT_POINTS[$i]="$mp"
    416 	MP_SUMS[$i]=0
    417 	typeset i=$i+1
    418     done
    419     MOUNT_POINT_COUNT=$i
    420 }
    421 
    422 # disk_usage_add <dir> <size>
    423 disk_usage_add () {
    424     typeset -i i=0
    425     while [ $i -lt $MOUNT_POINT_COUNT ]; do
    426 	mpname=${MOUNT_POINTS[$i]}
    427 	case $1 in
    428 	    ${mpname}* )
    429 		mpsize=${MP_SUMS[$i]}
    430 		mpsize=`expr $mpsize + $2`
    431 		MP_SUMS[$i]=$mpsize
    432 		break
    433 		;;
    434 	esac
    435 	typeset i=$i+1
    436     done
    437 }
    438 
    439 disk_usage_check () {
    440     typeset -i i=0
    441     while [ $i -lt $MOUNT_POINT_COUNT ]; do
    442 	mpname=${MOUNT_POINTS[$i]}
    443 	mpsize=${MP_SUMS[$i]}
    444 	mpsize=`expr $mpsize + $mpsize`
    445 	if [ $mpsize -gt 0 ]; then
    446 	    check_disk_space $mpname $mpsize || \
    447 		msg_error "Your %s filesystem has less than %s kB free\nYou will not be able to install JDS." "$ROOTDIR$mpname" "$mpsize"
    448 	fi
    449 	typeset i=$i+1
    450     done
    451 }
    452 
    453 #install_pkgs <dir>
    454 install_product () {
    455     ORDERFILE=$MYDIR/$1/.pkgorder
    456     if [ -r $ORDERFILE ]; then
    457 	export IFS=' '
    458 	ALL_PKGS=$(echo $(cat $ORDERFILE | sed -e 's/$/.tar.gz/'))
    459     else
    460 	ALL_PKGS=$(cd $MYDIR/$1; find . -name '*.tar.gz' -print -o -name '*.tgz' -print)
    461     fi
    462 
    463     if [ -z "$ALL_PKGS" ]; then
    464 	msg_error "No packages found."
    465 	return
    466     fi
    467 
    468     msg_log "Starting installation of %s at %s" "$1" "`LANG=C LC_ALL=C date`"
    469     IFS=' 
    470 '
    471 
    472     # Remove old Mozilla 1.x packages.
    473     if [ $1 == 'firefox' -o $1 == 'thunderbird' ]; then
    474         moz_pkgs="SUNWmozspell
    475 SUNWmozpsm
    476 SUNWmoznss-devel
    477 SUNWmoznss
    478 SUNWmoznspr-devel
    479 SUNWmozmail
    480 SUNWmozjs-debugger
    481 SUNWmozilla-devel
    482 SUNWmozgm
    483 SUNWmozdom-inspector
    484 SUNWmozchat
    485 SUNWmozilla
    486 SUNWmoznspr
    487 SUNWmoznav
    488 SUNWthunderbird-devel"
    489         for moz_pkg in $moz_pkgs; do
    490             is_installed "$moz_pkg" && remove_pkg "$moz_pkg"
    491         done
    492     fi
    493 
    494     # Remove evolution-socs-connect packages as they are incompatible with
    495     # evolution-jescs (connector for Java Enterprise System Calendar Server)
    496     if [ $1 == 'evolution' ]; then
    497         evo_pkgs="SUNWevolution-socs-connect
    498 SUNWevolution-socs-connect-share"
    499         for evo_pkg in $evo_pkgs; do
    500             is_installed "$evo_pkg" && remove_pkg "$evo_pkg"
    501         done
    502     fi
    503 
    504     logrun mkdir -p $TEMPDIR || \
    505 	msg_fatal "ERROR: Failed to create temporary directory %s" "$TEMPDIR"
    506     cd $TEMPDIR
    507     for pkg in $ALL_PKGS; do
    508 	if [ ! -r $MYDIR/$1/$pkg ]; then
    509 	    msg_error "ERROR: cannot read file %s" "$pkg"
    510 	    continue
    511 	fi
    512 	logrun sh -c "gunzip -c $MYDIR/$1/$pkg | /bin/tar xf -"
    513 	if [ $? != 0 ]; then
    514 	    msg_error "ERROR: Failed to unpack %s" "$pkg"
    515 	    continue
    516 	fi
    517 	pkg0=$(basename $pkg)
    518 	pkg0=$(echo "$pkg0" | sed -e 's/\.tar.gz$//' -e 's/\.tgz$//')
    519 	if [ ! -d $pkg0 ]; then
    520 	    msg_error "ERROR: Package %s not found in %s" "$pkg0" "$pkg"
    521 	    continue
    522 	fi
    523 	if [ "x$QUIET" = xno ]; then
    524 	    l10n_print "Installing package %s" "$pkg0"
    525 	fi
    526 	msg_log "Installing package $pkg0"
    527 	if [ "x$ROOTDIR" != "x" ]; then
    528 	    logrun $PKGADD -R "$ROOTDIR" -a $ADMIN -n -d $TEMPDIR $pkg0 || \
    529 		msg_error "ERROR: Failed to install package %s" "$pkg0"
    530 	else
    531 	    logrun $PKGADD -a $ADMIN -n -d $TEMPDIR $pkg0 || \
    532 		msg_error "ERROR: Failed to install package %s" "$pkg0"
    533 	fi
    534 	logrun rm -rf $TEMPDIR/$pkg0
    535     done
    536 }
    537 
    538 remove_pkg () {
    539     if [ "x$QUIET" = xno ]; then
    540 	l10n_print "Uninstalling %s" "$1"
    541     fi
    542     msg_log "Uninstalling %s" "$1"
    543     if [ "x$ROOTDIR" != x ]; then
    544 	logrun $PKGRM -R "$ROOTDIR" -a $ADMIN -n "$1"'.*' || \
    545 	    msg_error "ERROR: Failed to remove package %s" "$1"
    546     else
    547 	logrun $PKGRM -a $ADMIN -n "$1"'.*' || \
    548 	    msg_error "ERROR: Failed to remove package %s" "$1"
    549     fi
    550 }
    551 
    552 is_installed () {
    553     $PKGINFO -q "$1.*"
    554 }
    555 
    556 remove_always () {
    557     pkgs_to_remove="`cat $MYDIR/$1/.remove-always`"
    558 
    559     IFS=" 	
    560 "
    561     for glob in "$pkgs_to_remove"; do
    562 	pkgs=$(cd $MYDIR/$1; echo $glob)
    563 	for pkg in $pkgs; do
    564 	    pkg=`basename $pkg`
    565 	    pkg=`basename $pkg .tar.gz`
    566 	    pkg=`basename $pkg .tgz`
    567 	    is_installed "$pkg" && remove_pkg "$pkg"
    568 	done
    569     done
    570 }
    571 
    572 remove_if_older () {
    573     pkgs_to_remove="`cat $MYDIR/$1/.remove-if-older`"
    574 
    575     IFS=" 	
    576 "
    577     for glob in $pkgs_to_remove; do
    578 	pkgs=$(cd $MYDIR/$1; echo "$glob")
    579 	for pkg in $pkgs; do
    580 	    pkg=`basename $pkg .tar.gz`
    581 	    pkg=`basename $pkg .tgz`
    582 	    remove_pkg $pkg
    583 	done
    584     done
    585 }
    586 
    587 main_menu () {
    588     while /bin/true; do
    589 	clear
    590 	echo ",--------------------------------------------------------------------------"
    591 	echo "| 1) " `l10n_print "Default Installation"`
    592 	echo "| 2) " `l10n_print "Custom Installation"`
    593         echo "|"
    594 	echo "| X) " `l10n_print "Exit"`
    595 	echo "|"
    596 	ask  '`---> '"`l10n_print 'Please select:'`" "menu_sel" "1"
    597 	case $menu_sel in
    598 	    1)
    599 		if [ "x$PRODUCTS" = x ]; then
    600 		    select_all_products
    601 		    unselect_all_srcs
    602 		    unselect_product nodist
    603 		fi
    604 		do_install || return $?
    605 		break
    606 		;;
    607 	    2)
    608 		custom_menu || return $?
    609 		;;
    610 	    x|X)
    611 		return 2
    612 		;;
    613 	    *)
    614 		l10n_print "Invalid selection"
    615 		sleep 1
    616 	esac
    617     done
    618     return 0
    619 }
    620 
    621 custom_menu () {
    622     while /bin/true; do
    623 	clear
    624 	echo ",--------------------------------------------------------------------------"
    625 	echo "| 1) " `l10n_print "Install All Products"`
    626 	echo "| 2) " `l10n_print "Select Products to Install"`
    627 	if [ ! -z "$PATCHDIRS" ]; then
    628 	    echo "| 3) " `l10n_print "Select Patches to Install"`
    629 	fi
    630         echo "|"
    631 	echo "| I) " `l10n_print "Start Installation"`
    632 	echo "| X) " `l10n_print "Exit"`
    633 	echo "|"
    634 	ask  '`---> '"`l10n_print 'Please select:'`" "menu_sel" "I"
    635 	case $menu_sel in
    636 	    1)
    637 		select_all_products
    638 		unselect_all_srcs
    639 		unselect_product nodist
    640 		select_all_patches
    641 		do_install || return $?
    642 		return 1
    643 		;;
    644 	    2)
    645 		select_product_menu || return $?
    646 		;;
    647 	    3)  
    648 		if [ ! -z "$PATCHDIRS" ]; then
    649 		    select_patchdir_menu || return $?
    650 		else
    651 		    l10n_print "Invalid selection"
    652 		    sleep 1
    653 		fi
    654 		;;
    655 	    i|I)
    656 		do_install || return $?
    657 		return 1
    658 		;;
    659 	    x|X)
    660 		return 2
    661 		;;
    662 	    *)
    663 		l10n_print "Invalid selection"
    664 		sleep 1
    665 	esac
    666     done
    667     return 0
    668 }
    669 
    670 so_menu () {
    671     while /bin/true; do
    672 	clear
    673 	echo ",--------------------------------------------------------------------------"
    674 	echo "| 1) StarOffice"
    675 	echo "| 2) StarSuite"
    676         echo "|"
    677 	echo "| X) " `l10n_print "Exit"`
    678 	echo "|"
    679 	ask  '`---> '"`l10n_print 'Please select:'`" "menu_sel" "1"
    680 	case $menu_sel in
    681 	    1)
    682 		unselect_product starsuite
    683 		return 0
    684 		;;
    685 	    2)
    686 		unselect_product staroffice
    687 		return 0
    688 		;;
    689 	    x|X)
    690 		return 2
    691 		;;
    692 	    *)
    693 		l10n_print "Invalid selection"
    694 		sleep 1
    695 	esac
    696     done
    697     return 0
    698 }
    699 
    700 select_patchdir_menu () {
    701     IFS=,
    702     while /bin/true; do
    703 	clear
    704 	echo ",--------------------------------------------------------------------------"
    705 	typeset -i N=1
    706 	
    707 	for pdir in $PATCHDIRS; do
    708 	    pname=`echo "$ALL_PATCHDIRS" | grep "^$pdir=" | cut -f2- -d= | cut -c-60`
    709 	    n=`echo " $N" | sed -e 's/^.*\(..\)$/\1/'`
    710 	    pn=$(echo $pdir | cut -f2 -d-)
    711 	    eval "plist=\"\$ALL_${pn}_PATCHES\""
    712 	    eval "patch_${N}_list=\"$plist\""
    713 	    patches_are_selected "$plist"
    714 	    res=$?
    715 	    if [ $res = 0 ]; then
    716 		echo "| $n) [x] $pname"
    717 		eval "patch_${N}_selected=1"
    718 	    elif [ $res = 1 ]; then
    719                 echo "| $n) [:] $pname"
    720 		eval "patch_${N}_selected=0"
    721 	    else
    722                 echo "| $n) [ ] $pname"
    723 		eval "patch_${N}_selected=0"
    724 	    fi
    725             typeset N=$N+1
    726 	done
    727         echo "|"
    728 	echo "|  A) " `l10n_print "Select All"`
    729 	echo "|  U) " `l10n_print "Unselect All"`
    730 	echo "|"
    731 	echo "|  S) " `l10n_print "Select individual patches"`
    732 	echo "|  I) " `l10n_print "Start Installation"`
    733 	echo "|  R) " `l10n_print "Return to previous menu"`
    734 	echo "|  X) " `l10n_print "Exit"`
    735 	echo "|"
    736 	ask  '`---> '"`l10n_print 'Enter item to select/unselect:'`" "menu_sel" "R"
    737 	case $menu_sel in
    738 	    i|I)
    739 		do_install || return $?
    740 		return 1
    741 		;;
    742 	    x|X)
    743 		return 2
    744 		;;
    745 	    r|R)
    746 		return 0
    747 		;;
    748 	    a|A)
    749 		select_all_patches
    750 		;;
    751 	    s|S)
    752 		select_patch_menu || return $?
    753 		;;
    754 	    u|U)
    755 		PATCHES=
    756 		;;
    757 	    *)
    758 		eval "the_patches=\$patch_${menu_sel}_list"
    759 		if [ -z "$the_patches" ]; then
    760 		    l10n_print "Invalid selection"
    761 		    sleep 1
    762 		else
    763 		    eval "is_sel=\$patch_${menu_sel}_selected"
    764 		    if [ "x$is_sel" = x1 ]; then
    765 			unselect_patches "$the_patches"
    766 		    else
    767 			select_patches "$the_patches"
    768 		    fi
    769 		fi
    770 	esac
    771     done
    772 }
    773 
    774 PATCH_INFO_LOADED=no
    775 load_patch_info () {
    776     test "x$PATCH_INFO_LOADED" = "xyes" && return
    777     IFS=,
    778     for p in $1; do
    779 	test -z "$p" && continue
    780 	mkdir -p $TEMPDIR/patchdesc
    781 	cd $TEMPDIR/patchdesc
    782 	unzip $MYDIR/$p */README.* > /dev/null 2>&1
    783 	dummy=`basename $p .zip`
    784 	pdesc=`grep '^Synopsis:' */README.* | head -1 | cut -f2- -d:` \
    785 	    > /dev/null 2>&1
    786 	if [ "x$pdesc" = x ]; then
    787 	    pdesc="Patch $dummy"
    788 	fi
    789 	dummy=`echo $dummy | cut -f1 -d-`
    790 	eval "PATCH_DESC_${dummy}=\"$pdesc\""
    791 	cd /
    792 	rm -rf $TEMPDIR/patchdesc
    793 	cd $TEMPDIR
    794     done
    795     PATCH_INFO_LOADED=yes
    796 }
    797 
    798 select_patch_menu () {
    799     load_patch_info "$ALL_PATCHES"
    800     IFS=,
    801     while /bin/true; do
    802 	clear
    803 	echo ",--------------------------------------------------------------------------"
    804 	typeset -i N=1
    805 	
    806 	for ps in $ALL_PATCHES; do
    807 	    test -z "$ps" && continue
    808 	    pbn=`basename $ps`
    809 	    pnum=`basename $pbn .zip`
    810 	    pbn=`echo $pbn | cut -f1 -d-`
    811 	    eval "pname=\$PATCH_DESC_${pbn}"
    812 	    pcat=`echo "$ps" | cut -f1 -d/ | cut -f2 -d-`
    813 	    n=`echo " $N" | sed -e 's/^.*\(..\)$/\1/'`
    814 	    pn=$(echo $pdir | cut -f2 -d-)
    815 	    eval "patch_${N}_name=\"$ps\""
    816 	    patch_is_selected "$ps"
    817 	    res=$?
    818 	    if [ $res = 0 ]; then
    819 		echo "| $n) [x] ($pcat) $pnum: $pname"
    820 		eval "patch_${N}_selected=1"
    821 	    else
    822                 echo "| $n) [ ] ($pcat) $pnum: $pname"
    823 		eval "patch_${N}_selected=0"
    824 	    fi
    825             typeset N=$N+1
    826 	done
    827         echo "|"
    828 	echo "|  A) " `l10n_print "Select All"`
    829 	echo "|  U) " `l10n_print "Unselect All"`
    830 	echo "|"
    831 	echo "|  I) " `l10n_print "Start Installation"`
    832 	echo "|  R) " `l10n_print "Return to previous menu"`
    833 	echo "|  X) " `l10n_print "Exit"`
    834 	echo "|"
    835 	ask  '`---> '"`l10n_print 'Enter item to select/unselect:'`" "menu_sel" "R"
    836 	case $menu_sel in
    837 	    i|I)
    838 		do_install || return $?
    839 		return 1
    840 		;;
    841 	    x|X)
    842 		return 2
    843 		;;
    844 	    r|R)
    845 		return 0
    846 		;;
    847 	    a|A)
    848 		select_all_patches
    849 		;;
    850 	    s|S)
    851 		select_patch_menu || return $?
    852 		;;
    853 	    u|U)
    854 		PATCHES=
    855 		;;
    856 	    *)
    857 		eval "the_patch=\$patch_${menu_sel}_name"
    858 		if [ -z "$the_patch" ]; then
    859 		    l10n_print "Invalid selection"
    860 		    sleep 1
    861 		else
    862 		    eval "is_sel=\$patch_${menu_sel}_selected"
    863 		    if [ "x$is_sel" = x1 ]; then
    864 			unselect_patches "$the_patch"
    865 		    else
    866 			select_patches "$the_patch"
    867 		    fi
    868 		fi
    869 	esac
    870     done
    871 }
    872 
    873 select_product_menu () {
    874     IFS=" 	
    875 "
    876     save_PR="$PRODUCTS"
    877     select_all_products
    878     AP="$PRODUCTS"
    879     PRODUCTS="$save_PR"
    880     while /bin/true; do
    881 	clear
    882 	echo ",--------------------------------------------------------------------------"
    883 	typeset -i N=1
    884 	
    885 	for prod in $AP; do
    886 	    prodname=`echo "$ALL_PRODUCTS" | grep "^$prod=" | cut -f2- -d= | cut -c-60`
    887 	    if [ -z "$prodname" ]; then
    888 		prodname=$prod
    889 	    fi
    890 	    n=`echo " $N" | sed -e 's/^.*\(..\)$/\1/'`
    891 	    eval "prod_${N}_name=\"$prod\""
    892 	    product_is_selected $prod
    893 	    if [ $? = 0 ]; then
    894 		echo "| $n) [x] "`l10n_print "$prodname"`
    895 		eval "prod_${N}_selected=1"
    896 	    else
    897                 echo "| $n) [ ] "`l10n_print "$prodname"`
    898 		eval "prod_${N}_selected=0"
    899 	    fi
    900             typeset N=$N+1
    901 	done
    902         echo "|"
    903 	echo "|  A) " `l10n_print "Select All"`
    904 	echo "|  U) " `l10n_print "Unselect All"`
    905 	echo "|"
    906 	echo "|  I) " `l10n_print "Start Installation"`
    907 	echo "|  R) " `l10n_print "Return to previous menu"`
    908 	echo "|  X) " `l10n_print "Exit"`
    909 	echo "|"
    910 	ask  '`---> '"`l10n_print 'Enter item to select/unselect:'`" "menu_sel" "R"
    911 	case $menu_sel in
    912 	    i|I)
    913 		do_install || return $?
    914 		return 1
    915 		;;
    916 	    x|X)
    917 		return 2
    918 		;;
    919 	    r|R)
    920 		return 0
    921 		;;
    922 	    a|A)
    923 		select_all_products
    924 		;;
    925 	    u|U)
    926 		PRODUCTS=
    927 		;;
    928 	    *)
    929 		eval "the_name=\$prod_${menu_sel}_name"
    930 		if [ -z "$the_name" ]; then
    931 		    l10n_print "Invalid selection"
    932 		    sleep 1
    933 		else
    934 		    eval "is_sel=\$prod_${menu_sel}_selected"
    935 		    if [ "x$is_sel" = x1 ]; then
    936 			unselect_product $the_name
    937 		    else
    938 			select_product $the_name
    939 		    fi
    940 		fi
    941 	esac
    942     done
    943 }
    944 
    945 install_patch () {
    946     mkdir -p $TEMPDIR/patchinst || return 1
    947     rm -rf $TEMPDIR/patchinst/* || return 1
    948     cd $TEMPDIR/patchinst || return 1
    949     unzip $MYDIR/$1 > /dev/null 2>&1 || return 1
    950     if [ "x$QUIET" = xno ]; then
    951 	l10n_print "Installing patch %s" "$1"
    952     fi
    953     IFS=" "
    954     if [ "x$ROOTDIR" = x ]; then
    955 	logrun $PATCHADD * || return 1
    956     else
    957 	logrun $PATCHADD -R "$ROOTDIR" * || return 1
    958     fi
    959     rm -rf $TEMPDIR/patchinst/* || return 1
    960     cd /
    961 }
    962 
    963 do_install_patches () {
    964     IFS=,
    965     if [ ! -z "$PATCHES" ]; then
    966 	l10n_print "Installing required patches..."
    967     fi
    968     for p in $PATCHES; do
    969 	 test -z "$p" && continue
    970          # Skip if patch already applied.
    971          patchnum=`basename $p .zip`
    972          # Remove 'T' t-patch prefix if present. showrev doesn't show it.
    973          patchnum=`echo $patchnum | sed 's/^T//'`
    974          if [ -z "`showrev -p | awk '{print $2}' | /usr/bin/grep -s $patchnum`" ]; then
    975 	     install_patch $p || \
    976 	      msg_error "Failed to install patch %s" "$p"
    977          fi
    978     done
    979 }
    980 
    981 do_install () {
    982     if [ "x$PRODUCTS" = x -a "x$PATCHES" = x ]; then
    983 	msg_fatal "No products selected."
    984     fi
    985     so=ok
    986     product_is_selected staroffice && product_is_selected starsuite && \
    987 	so=not_ok
    988     if [ x$so = xnot_ok ]; then
    989 	if [ "x$INTERACTIVE" = "xyes" ]; then
    990 	    so_menu || return $?
    991 	else
    992 	    msg_fatal "You cannot select both StarOffice and StarSuite"
    993 	fi
    994     fi
    995 
    996     l10n_print "Checking for sufficient disk space..."
    997     disk_usage_init
    998     IFS=,
    999     for prod in $PRODUCTS; do
   1000 	test -z "$prod" && continue
   1001 	if [ ! -r "$prod/.pkgsize" ]; then
   1002 	    msg_warning "WARNING: disk space usage information missing from directory %s" "$prod"
   1003 	    continue
   1004 	fi
   1005 	exec < "$prod/.pkgsize"
   1006 	while read line; do
   1007 	    the_dir=`echo "$line" | cut -f3- -d' '`
   1008 	    the_size=`echo "$line" | cut -f2 -d' '`
   1009 	    disk_usage_add "$ROOTDIR$the_dir" "$the_size"
   1010 	done
   1011 	exec <& 1
   1012     done
   1013 
   1014     clear
   1015     product_is_selected staroffice && so_disk_space_check StarOffice
   1016     product_is_selected starsuite && so_disk_space_check StarSuite
   1017 
   1018     disk_usage_check
   1019 
   1020     l10n_print "Removing older versions of JDS packages..."
   1021 
   1022     l10n_print "Determining package installation order..."
   1023 
   1024     backup $LOGFILE
   1025     echo "JDS Installation Log opened at `LANG=C LC_ALL=C date`" > $LOGFILE
   1026 
   1027     do_install_patches
   1028 
   1029     IFS=,
   1030     for prod in $PRODUCTS; do
   1031 	test -z "$prod" && continue
   1032 	if [ ! -d "$MYDIR/$prod" ]; then
   1033 	    msg_warning "Product %s not found in the install image" "$prod"
   1034 	    continue
   1035 	fi
   1036 	prodname=`echo "$ALL_PRODUCTS" | grep "^$prod=" | cut -f2- -d=`
   1037         if [ -z "$prodname" ]; then
   1038             prodname=$prod
   1039         fi
   1040 	if [ "x$QUIET" = xno ]; then
   1041 	    echo
   1042 	    echo -------------------------------------------------
   1043 	fi
   1044 	lprodname=$(l10n_print "$prodname")
   1045 	l10n_print "Installing Product \"%s\"" "$lprodname"
   1046 	if [ -r "$MYDIR/$prod/.remove-always" ]; then
   1047 	    remove_always $prod
   1048 	fi
   1049 #	if [ -r "$MYDIR/$prod/.remove-if-older" ]; then
   1050 #	    remove_if_older $prod
   1051 #	fi
   1052 	install_product $prod
   1053     done
   1054 }
   1055 
   1056 product_is_selected () {
   1057     echo ",$PRODUCTS," | grep ",$1," > /dev/null 2>&1
   1058 }
   1059 
   1060 # Examine LANG variable to determine whether to select StarOffice or StarSuite.
   1061 staroffice_or_starsuite() {
   1062     if [ -n "$LANG" ]
   1063     then
   1064         # Japan, China, Taiwan and Korean get StarSuite.
   1065         case `echo $LANG | cut -c1,2` in
   1066             ja|zh|tw|ko) return 0;;
   1067         esac
   1068     fi
   1069 
   1070     # If not set assume it is not Asian and therefore use StarOffice.
   1071     return 1
   1072 }
   1073 
   1074 select_product () {
   1075     test -z "$1" && return 1
   1076     product