1*cdf0e10cSrcweir#!/bin/bash 2*cdf0e10cSrcweir 3*cdf0e10cSrcweirADD="no" 4*cdf0e10cSrcweirLINK="no" 5*cdf0e10cSrcweirUPDATE="no" 6*cdf0e10cSrcweirUSAGE="Usage: $0 [-a] [-l] [-h] <pkg-source-dir> <office-installation-dir>" 7*cdf0e10cSrcweir 8*cdf0e10cSrcweirhelp() 9*cdf0e10cSrcweir{ 10*cdf0e10cSrcweir echo 11*cdf0e10cSrcweir echo "User Mode Installation script for developer and knowledgeable early access tester" 12*cdf0e10cSrcweir echo 13*cdf0e10cSrcweir echo "This installation method is not intended for use in a production environment!" 14*cdf0e10cSrcweir echo "Using this script is unsupported and completely at your own risk" 15*cdf0e10cSrcweir echo 16*cdf0e10cSrcweir echo "Usage:" $0 "<pkg-source-dir> <office-installation-dir> [-l]" 17*cdf0e10cSrcweir echo " <pkg-source-dir>: directory *only* containing the Solaris pkg packages to be installed" 18*cdf0e10cSrcweir echo " or language pack shell script containing the Solaris pkg packages" 19*cdf0e10cSrcweir echo " <office-installation-dir>: directory to where the office and the pkg database will get installed into" 20*cdf0e10cSrcweir echo 21*cdf0e10cSrcweir echo "Optional Parameter:" 22*cdf0e10cSrcweir echo " -a : add to an existing <office-installation-dir>" 23*cdf0e10cSrcweir echo " -l : create a link \"soffice\" in $HOME" 24*cdf0e10cSrcweir echo " -h : output this help" 25*cdf0e10cSrcweir} 26*cdf0e10cSrcweir 27*cdf0e10cSrcweirtry_to_unpack_languagepack_file() 28*cdf0e10cSrcweir{ 29*cdf0e10cSrcweir FILENAME=$PACKAGE_PATH 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir # Checking, if $FILENAME is a language pack. 32*cdf0e10cSrcweir # String "language package" has to exist in the shell script file. 33*cdf0e10cSrcweir # If this is no language pack, the installation is not supported 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir SEARCHSTRING=`head -n 10 $FILENAME | grep "language package"` 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir if [ ! -z "$SEARCHSTRING" ] 38*cdf0e10cSrcweir then 39*cdf0e10cSrcweir echo "First parameter $FILENAME is a language pack"; 40*cdf0e10cSrcweir else 41*cdf0e10cSrcweir printf "\nERROR: First parameter $FILENAME is a file, but no language pack shell script.\n" 42*cdf0e10cSrcweir echo $USAGE 43*cdf0e10cSrcweir exit 2 44*cdf0e10cSrcweir fi 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir echo "Unpacking shell script $FILENAME" 47*cdf0e10cSrcweir # TAILLINE=`head -n 20 $FILENAME | sed --quiet 's/linenum=//p'` 48*cdf0e10cSrcweir TAILLINE=`head -n 20 $FILENAME | sed -n 's/linenum=//p'` 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir if [ -x "/usr/bin/mktemp" ] # available in Solaris 10 51*cdf0e10cSrcweir then 52*cdf0e10cSrcweir UNPACKDIR=`mktemp -d` 53*cdf0e10cSrcweir else 54*cdf0e10cSrcweir UNPACKDIR=/var/tmp/install_$$ 55*cdf0e10cSrcweir mkdir $UNPACKDIR 56*cdf0e10cSrcweir fi 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir echo $UNPACKDIR 59*cdf0e10cSrcweir tail +$TAILLINE $FILENAME | gunzip | (cd $UNPACKDIR; tar xvf -) 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir # Setting the new package path, in which the packages exist 62*cdf0e10cSrcweir PACKAGE_PATH=$UNPACKDIR 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir # Setting variable UPDATE, because an Office installation has to exist, if a language pack shall be installed 65*cdf0e10cSrcweir UPDATE="yes" 66*cdf0e10cSrcweir} 67*cdf0e10cSrcweir 68*cdf0e10cSrcweirpkg_error() 69*cdf0e10cSrcweir{ 70*cdf0e10cSrcweir # pkg command failed, check for admin log and report help 71*cdf0e10cSrcweir if [ -f /tmp/.ai.pkg.zone.lock-afdb66cf-1dd1-11b2-a049-000d560ddc3e ] 72*cdf0e10cSrcweir then 73*cdf0e10cSrcweir echo "####################################################################" 74*cdf0e10cSrcweir echo "# Installation failed due to stale administrative lock #" 75*cdf0e10cSrcweir echo "####################################################################" 76*cdf0e10cSrcweir printf "\nERROR: please remove the following file first:\n" 77*cdf0e10cSrcweir ls -l /tmp/.ai.pkg.zone.lock-afdb66cf-1dd1-11b2-a049-000d560ddc3e 78*cdf0e10cSrcweir fi 79*cdf0e10cSrcweir rm -f $GETUID_SO 80*cdf0e10cSrcweir exit 1 81*cdf0e10cSrcweir} 82*cdf0e10cSrcweir 83*cdf0e10cSrcweirget_pkg_list() 84*cdf0e10cSrcweir{ 85*cdf0e10cSrcweir cd $1; ls -1 86*cdf0e10cSrcweir} 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir# 89*cdf0e10cSrcweir# this script is for userland not for root 90*cdf0e10cSrcweir# 91*cdf0e10cSrcweir 92*cdf0e10cSrcweirif [ $UID -eq 0 ] 93*cdf0e10cSrcweirthen 94*cdf0e10cSrcweir printf "\nThis script is for installation without administrative rights only\nPlease use pkgadd/patchadd to install as root\n" 95*cdf0e10cSrcweir help 96*cdf0e10cSrcweir exit 2 97*cdf0e10cSrcweirfi 98*cdf0e10cSrcweir 99*cdf0e10cSrcweirwhile getopts "alh" VALUE 100*cdf0e10cSrcweirdo 101*cdf0e10cSrcweir echo $VALUE 102*cdf0e10cSrcweir case $VALUE in 103*cdf0e10cSrcweir a) ADD="yes"; break;; 104*cdf0e10cSrcweir h) help; exit 0;; 105*cdf0e10cSrcweir l) LINK="yes"; break;; 106*cdf0e10cSrcweir ?) echo $USAGE; exit 2;; 107*cdf0e10cSrcweir esac 108*cdf0e10cSrcweirdone 109*cdf0e10cSrcweirshift `expr $OPTIND - 1` 110*cdf0e10cSrcweir 111*cdf0e10cSrcweirif [ $# != 2 ] 112*cdf0e10cSrcweirthen 113*cdf0e10cSrcweir echo $USAGE 114*cdf0e10cSrcweir exit 2 115*cdf0e10cSrcweirfi 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir# Determine whether this is a patch or a regular install set .. 118*cdf0e10cSrcweir/bin/bash -c "ls $1/*/patchinfo >/dev/null 2>&1" 119*cdf0e10cSrcweirif [ "$?" = 0 ] 120*cdf0e10cSrcweirthen 121*cdf0e10cSrcweir UPDATE="yes" 122*cdf0e10cSrcweir PATCH_PATH="$1" 123*cdf0e10cSrcweir PATCH_INFO_LIST=`/bin/bash -c "cd $1; ls */patchinfo"` 124*cdf0e10cSrcweir PATCH_LIST=`for i in ${PATCH_INFO_LIST}; do dirname $i; done` 125*cdf0e10cSrcweirelif [ -f "$1/patchinfo" ] 126*cdf0e10cSrcweirthen 127*cdf0e10cSrcweir UPDATE="yes" 128*cdf0e10cSrcweir PATCH_PATH=`dirname "$1"` 129*cdf0e10cSrcweir PATCH_LIST=`basename "$1"` 130*cdf0e10cSrcweirelse 131*cdf0e10cSrcweir if [ -d "$1/packages" ] 132*cdf0e10cSrcweir then 133*cdf0e10cSrcweir PACKAGE_PATH="$1/packages" 134*cdf0e10cSrcweir else 135*cdf0e10cSrcweir PACKAGE_PATH=$1 136*cdf0e10cSrcweir fi 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir # 139*cdf0e10cSrcweir # If the first parameter is a shell script (download installation set), the packages have to 140*cdf0e10cSrcweir # be unpacked into temp directory 141*cdf0e10cSrcweir # 142*cdf0e10cSrcweir if [ -f "$PACKAGE_PATH" ] 143*cdf0e10cSrcweir then 144*cdf0e10cSrcweir try_to_unpack_languagepack_file 145*cdf0e10cSrcweir fi 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir # 148*cdf0e10cSrcweir # Create sed filter script for unwanted packages 149*cdf0e10cSrcweir # 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir cat > /tmp/userinstall_filer.$$ << EOF 152*cdf0e10cSrcweir/SUNWadabas/d 153*cdf0e10cSrcweir/^SUNWj[0-9]/d 154*cdf0e10cSrcweir/-desktop-int/d 155*cdf0e10cSrcweir/-shared-mime-info/d 156*cdf0e10cSrcweir/-cde/d 157*cdf0e10cSrcweirEOF 158*cdf0e10cSrcweir 159*cdf0e10cSrcweir # Do not install gnome-integration package on systems without GNOME 160*cdf0e10cSrcweir pkginfo -q SUNWgnome-vfs 161*cdf0e10cSrcweir if [ $? -ne 0 ] 162*cdf0e10cSrcweir then 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir echo '/-gnome/d' >> /tmp/userinstall_filer.$$ 165*cdf0e10cSrcweir fi 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir # pkgdep sorts the packages based on their dependencies 168*cdf0e10cSrcweir PKGDEP="`dirname $0`/pkgdep" 169*cdf0e10cSrcweir if [ ! -x $PKGDEP ]; then 170*cdf0e10cSrcweir PKGDEP="get_pkg_list" 171*cdf0e10cSrcweir fi 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir # 174*cdf0e10cSrcweir # Get the list of packages to install 175*cdf0e10cSrcweir # 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir PKG_LIST=`$PKGDEP $PACKAGE_PATH | sed -f /tmp/userinstall_filer.$$` 178*cdf0e10cSrcweir rm -f /tmp/userinstall_filer.$$ 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir if [ -z "$PKG_LIST" ] 181*cdf0e10cSrcweir then 182*cdf0e10cSrcweir printf "\n$0: No packages found in $PACKAGE_PATH\n" 183*cdf0e10cSrcweir exit 2 184*cdf0e10cSrcweir fi 185*cdf0e10cSrcweir 186*cdf0e10cSrcweir echo "Packages found:" 187*cdf0e10cSrcweir for i in $PKG_LIST ; do 188*cdf0e10cSrcweir echo $i 189*cdf0e10cSrcweir done 190*cdf0e10cSrcweirfi 191*cdf0e10cSrcweir 192*cdf0e10cSrcweirINSTALL_ROOT=$2 193*cdf0e10cSrcweirif [ "$UPDATE" = "yes" ] 194*cdf0e10cSrcweirthen 195*cdf0e10cSrcweir if [ ! -d ${INSTALL_ROOT}/var/sadm/install/admin ] 196*cdf0e10cSrcweir then 197*cdf0e10cSrcweir printf "\n$0: No package database in ${INSTALL_ROOT}.\n" 198*cdf0e10cSrcweir exit 2 199*cdf0e10cSrcweir fi 200*cdf0e10cSrcweirelse 201*cdf0e10cSrcweir if [ "$ADD" = "no" ] 202*cdf0e10cSrcweir then 203*cdf0e10cSrcweir rmdir ${INSTALL_ROOT} 2>/dev/null 204*cdf0e10cSrcweir if [ -d ${INSTALL_ROOT} ] 205*cdf0e10cSrcweir then 206*cdf0e10cSrcweir printf "\n$0: ${INSTALL_ROOT} exists and is not empty.\n" 207*cdf0e10cSrcweir exit 2 208*cdf0e10cSrcweir fi 209*cdf0e10cSrcweir fi 210*cdf0e10cSrcweir mkdir -p ${INSTALL_ROOT}/var/sadm/install/admin 211*cdf0e10cSrcweirfi 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir# Previous versions of this script did not write this file 214*cdf0e10cSrcweirif [ ! -f ${INSTALL_ROOT}/var/sadm/install/admin/default ] 215*cdf0e10cSrcweirthen 216*cdf0e10cSrcweir cat > ${INSTALL_ROOT}/var/sadm/install/admin/default << EOF 217*cdf0e10cSrcweiraction=nocheck 218*cdf0e10cSrcweirconflict=nocheck 219*cdf0e10cSrcweirsetuid=nocheck 220*cdf0e10cSrcweiridepend=nocheck 221*cdf0e10cSrcweirmail= 222*cdf0e10cSrcweirEOF 223*cdf0e10cSrcweirfi 224*cdf0e10cSrcweir 225*cdf0e10cSrcweirif [ ! "${INSTALL_ROOT:0:1}" = "/" ]; then 226*cdf0e10cSrcweir INSTALL_ROOT=`cd ${INSTALL_ROOT}; pwd` 227*cdf0e10cSrcweirfi 228*cdf0e10cSrcweir 229*cdf0e10cSrcweir# This script must exist to make extension registration work 230*cdf0e10cSrcweir# always overwrite to get the latest version. 231*cdf0e10cSrcweirmkdir -p ${INSTALL_ROOT}/usr/lib 232*cdf0e10cSrcweircat > ${INSTALL_ROOT}/usr/lib/postrun << \EOF 233*cdf0e10cSrcweir#!/bin/sh 234*cdf0e10cSrcweirset -e 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir# Override UserInstallation in bootstraprc for unopkg .. 237*cdf0e10cSrcweirUserInstallation='$BRAND_BASE_DIR/../UserInstallation' 238*cdf0e10cSrcweirexport UserInstallation 239*cdf0e10cSrcweir 240*cdf0e10cSrcweirif [ -x /usr/bin/mktemp ] 241*cdf0e10cSrcweirthen 242*cdf0e10cSrcweir CMD=`/usr/bin/mktemp /tmp/userinstall.XXXXXX` 243*cdf0e10cSrcweirelse 244*cdf0e10cSrcweir CMD=/tmp/userinstall.$$; echo "" > $CMD 245*cdf0e10cSrcweirfi 246*cdf0e10cSrcweir 247*cdf0e10cSrcweirsed -e 's|/opt/|${PKG_INSTALL_ROOT}/opt/|g' > $CMD 248*cdf0e10cSrcweir/bin/sh -e $CMD 249*cdf0e10cSrcweirrm -f $CMD 250*cdf0e10cSrcweirEOF 251*cdf0e10cSrcweirchmod +x ${INSTALL_ROOT}/usr/lib/postrun 2>/dev/null 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir# create local tmp directory to install on S10 254*cdf0e10cSrcweirLOCAL_TMP= 255*cdf0e10cSrcweirif [ -x /usr/bin/mktemp ] 256*cdf0e10cSrcweirthen 257*cdf0e10cSrcweir LOCAL_TMP=`mktemp -d` 258*cdf0e10cSrcweir rmdir ${INSTALL_ROOT}/tmp 2>/dev/null 259*cdf0e10cSrcweir ln -s ${LOCAL_TMP} ${INSTALL_ROOT}/tmp 260*cdf0e10cSrcweirfi 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir# 263*cdf0e10cSrcweir# the tail of the script contains a shared object for overloading the getuid() 264*cdf0e10cSrcweir# and a few other calls 265*cdf0e10cSrcweir# 266*cdf0e10cSrcweir 267*cdf0e10cSrcweirGETUID_SO=/tmp/getuid.so.$$ 268*cdf0e10cSrcweirlinenum=??? 269*cdf0e10cSrcweirtail +$linenum $0 > $GETUID_SO 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir# 272*cdf0e10cSrcweir# Perform the installation 273*cdf0e10cSrcweir# 274*cdf0e10cSrcweirif [ "$UPDATE" = "yes" ] 275*cdf0e10cSrcweirthen 276*cdf0e10cSrcweir # restore original "bootstraprc" prior to patching 277*cdf0e10cSrcweir for i in ${PKG_LIST}; do 278*cdf0e10cSrcweir my_dir=${INSTALL_ROOT}`pkgparam -d ${PACKAGE_PATH} "$i" BASEDIR` 279*cdf0e10cSrcweir find "$my_dir" -type f -name bootstraprc.orig -exec sh -ce 'mv "$0" `dirname "$0"`/bootstraprc' {} \; 280*cdf0e10cSrcweir done 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir # copy INST_RELEASE file 283*cdf0e10cSrcweir if [ ! -f ${INSTALL_ROOT}/var/sadm/system/admin/INST_RELEASE ] 284*cdf0e10cSrcweir then 285*cdf0e10cSrcweir mkdir -p ${INSTALL_ROOT}/var/sadm/system/admin 2>/dev/null 286*cdf0e10cSrcweir cp -f /var/sadm/system/admin/INST_RELEASE ${INSTALL_ROOT}/var/sadm/system/admin/INST_RELEASE 287*cdf0e10cSrcweir fi 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir # The case UPDATE="yes" is valid for patch installation and for language packs. 290*cdf0e10cSrcweir # For patches the variable PKG_LIST is empty, for language packs it is not empty. 291*cdf0e10cSrcweir # Patches have to be installed with patchadd, language packs with pkgadd 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir if [ -z "${PKG_LIST}" ] 294*cdf0e10cSrcweir then 295*cdf0e10cSrcweir LD_PRELOAD_32=$GETUID_SO /usr/sbin/patchadd -R ${INSTALL_ROOT} -M ${PATCH_PATH} ${PATCH_LIST} 2>&1 | grep -v '/var/sadm/patch' || pkg_error 296*cdf0e10cSrcweir else 297*cdf0e10cSrcweir LD_PRELOAD_32=$GETUID_SO /usr/sbin/pkgadd -d ${PACKAGE_PATH} -R ${INSTALL_ROOT} ${PKG_LIST} >/dev/null || pkg_error 298*cdf0e10cSrcweir fi 299*cdf0e10cSrcweir 300*cdf0e10cSrcweirelse 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir # Create BASEDIR directories to avoid manual user interaction 303*cdf0e10cSrcweir for i in ${PKG_LIST}; do 304*cdf0e10cSrcweir mkdir -m 0755 -p ${INSTALL_ROOT}`pkgparam -d ${PACKAGE_PATH} $i BASEDIR` 2>/dev/null 305*cdf0e10cSrcweir done 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir if [ ! "${INSTALL_ROOT:0:1}" = "/" ]; then 308*cdf0e10cSrcweir INSTALL_ROOT=`cd ${INSTALL_ROOT}; pwd` 309*cdf0e10cSrcweir fi 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir echo "####################################################################" 312*cdf0e10cSrcweir echo "# Installation of the found packages #" 313*cdf0e10cSrcweir echo "####################################################################" 314*cdf0e10cSrcweir echo 315*cdf0e10cSrcweir echo "Path to the packages : " $PACKAGE_PATH 316*cdf0e10cSrcweir echo "Path to the installation : " $INSTALL_ROOT 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir LD_PRELOAD_32=$GETUID_SO /usr/sbin/pkgadd -d ${PACKAGE_PATH} -R ${INSTALL_ROOT} ${PKG_LIST} >/dev/null || pkg_error 319*cdf0e10cSrcweirfi 320*cdf0e10cSrcweir 321*cdf0e10cSrcweirrm -f $GETUID_SO 322*cdf0e10cSrcweirrm -f /tmp/.ai.pkg.zone.lock* 323*cdf0e10cSrcweir 324*cdf0e10cSrcweir# remove local tmp directory 325*cdf0e10cSrcweirif [ ! -z ${LOCAL_TMP} ] 326*cdf0e10cSrcweirthen 327*cdf0e10cSrcweir rm -f ${LOCAL_TMP}/.ai.pkg.zone.lock* 328*cdf0e10cSrcweir rmdir ${LOCAL_TMP} 329*cdf0e10cSrcweir rm -f ${INSTALL_ROOT}/tmp 330*cdf0e10cSrcweir mkdir ${INSTALL_ROOT}/tmp 331*cdf0e10cSrcweirfi 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir# 334*cdf0e10cSrcweir# Create a link into the users home directory 335*cdf0e10cSrcweir# 336*cdf0e10cSrcweir 337*cdf0e10cSrcweirif [ "$LINK" = "yes" ] 338*cdf0e10cSrcweirthen 339*cdf0e10cSrcweir rm -f $HOME/soffice 2>/dev/null 340*cdf0e10cSrcweir find `cd "$INSTALL_ROOT" && pwd` -name soffice -type f -perm -u+x -exec /bin/sh -ce 'ln -sf "$0" "$HOME/soffice" && echo "Creating link from $0 to $HOME/soffice"' {} \; 341*cdf0e10cSrcweirfi 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir# patch the "bootstraprc" to create a self-containing installation 344*cdf0e10cSrcweirfor i in ${PKG_LIST}; do 345*cdf0e10cSrcweir my_dir=${INSTALL_ROOT}`pkgparam -d ${PACKAGE_PATH} "$i" BASEDIR` 346*cdf0e10cSrcweir find "$my_dir" -type f -name bootstraprc -exec sh -ce 'test ! -f "$0".orig && mv "$0" "$0".orig && sed '\''s,^UserInstallation=$SYSUSERCONFIG.*,UserInstallation=$BRAND_BASE_DIR/../UserInstallation,'\'' "$0".orig > "$0"' {} \; 347*cdf0e10cSrcweirdone 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir# if an unpack directory exists, it can be removed now 350*cdf0e10cSrcweirif [ ! -z "$UNPACKDIR" ] 351*cdf0e10cSrcweirthen 352*cdf0e10cSrcweir # for i in ${PKG_LIST}; do 353*cdf0e10cSrcweir # cd $UNPACKDIR; rm -rf $i 354*cdf0e10cSrcweir # done 355*cdf0e10cSrcweir # rmdir $UNPACKDIR 356*cdf0e10cSrcweir 357*cdf0e10cSrcweir rm -rf $UNPACKDIR 358*cdf0e10cSrcweir echo "Removed temporary directory $UNPACKDIR" 359*cdf0e10cSrcweirfi 360*cdf0e10cSrcweir 361*cdf0e10cSrcweirecho 362*cdf0e10cSrcweirecho "Installation done ..." 363*cdf0e10cSrcweirexit 0 364*cdf0e10cSrcweir 365