| #!/bin/bash |
| # ************************************************************* |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| # ************************************************************* |
| |
| ADD="no" |
| LINK="no" |
| UPDATE="ask" |
| UNPACKDIR="" |
| USAGE="Usage: $0 [-a,--add] [-l,--link] [-U,--update] [-h,--help] <rpm-source-dir> <office-installation-dir>" |
| |
| help() |
| { |
| echo |
| echo "User Mode Installation script for developer and knowledgeable early access tester" |
| echo |
| echo "This installation method is not intended for use in a production environment!" |
| echo "Using this script is unsupported and completely at your own risk" |
| echo |
| echo "Usage:" $0 [-lU] "<rpm-source-dir> <office-installation-dir>" |
| echo " <rpm-source-dir>: directory *only* containing the Linux rpm packages to be installed" |
| echo " or language pack shell script containing the rpm packages" |
| echo " <office-installation-dir>: directory to where the office will get installed into" |
| echo |
| echo "Optional Parameter:" |
| echo " -a,--add: add to an existing <office-installation-dir>" |
| echo " -l,--link: create a link \"soffice\" in $HOME" |
| echo " -U,--update: update without asking" |
| echo " -h,--help: output this help" |
| echo |
| } |
| |
| try_to_unpack_languagepack_file() |
| { |
| FILENAME=$PACKAGE_PATH |
| |
| # Checking, if $FILENAME is a language pack. |
| # String "language package" has to exist in the shell script file. |
| # If this is no language pack, the installation is not supported |
| |
| SEARCHSTRING=`head --lines=10 $FILENAME | grep "language package"` |
| |
| if [ ! -z "$SEARCHSTRING" ] |
| then |
| echo "First parameter $FILENAME is a language pack"; |
| else |
| printf "\nERROR: First parameter $FILENAME is a file, but no language pack shell script.\n" |
| echo $USAGE |
| exit 2 |
| fi |
| |
| echo "Unpacking shell script $FILENAME" |
| TAILLINE=`head --lines=20 $FILENAME | sed --quiet 's/linenum=//p'` |
| |
| UNPACKDIR=/var/tmp/install_$$ |
| mkdir $UNPACKDIR |
| # UNPACKDIR=`mktemp -d` |
| tail -n +$TAILLINE $FILENAME | gunzip | (cd $UNPACKDIR; tar xvf -) |
| |
| # Setting the new package path, in which the packages exist |
| PACKAGE_PATH=$UNPACKDIR |
| |
| # Setting variable UPDATE, because an Office installation has to exist, if a language pack shall be installed |
| UPDATE="yes" |
| } |
| |
| # |
| # this script is for userland not for root |
| # |
| |
| if [ $UID -eq 0 ] |
| then |
| printf "\nThis script is for installation without administrative rights only\nPlease use rpm to install as root\n" |
| help |
| exit 2 |
| fi |
| |
| set -- `getopt -u -o 'alhU' -l 'add,link,help,update' -- $*` |
| |
| if [ $? != 0 ] |
| then |
| echo $USAGE |
| exit 2 |
| fi |
| |
| for i in $* |
| do |
| case $i in |
| -a|--add) ADD="yes"; shift;; |
| -h|--help) help; exit 0;; |
| -l|--link) LINK="yes"; shift;; |
| -U|--update) UPDATE="yes"; shift;; |
| --) shift; break;; |
| esac |
| done |
| |
| if [ $# != 2 ] |
| then |
| echo $USAGE |
| exit 2 |
| fi |
| |
| PACKAGE_PATH=$1 |
| |
| # |
| # If the first parameter is a shell script (download installation set), the packages have to |
| # be unpacked into temp directory |
| # |
| |
| if [ -f "$PACKAGE_PATH" ] |
| then |
| try_to_unpack_languagepack_file |
| fi |
| |
| # |
| # Check and get the list of packages to install |
| # |
| |
| RPMLIST=`find $PACKAGE_PATH -maxdepth 2 -type f -name "*.rpm" ! -name "*-menus-*" ! -name "*-desktop-integration-*" ! -name "jre*" ! -name "*-userland-*" -print` |
| |
| if [ -z "$RPMLIST" ] |
| then |
| printf "\n$0: No packages found in $PACKAGE_PATH\n" |
| exit 2 |
| fi |
| |
| # #163256# check if we are on a debian system... |
| if rpm --help | grep debian >/dev/null; |
| then |
| DEBIAN_FLAGS="--force-debian --nodeps" |
| else |
| DEBIAN_FLAGS= |
| fi |
| |
| # |
| # Determine whether this should be an update or a fresh install |
| # |
| |
| INSTALLDIR=$2 |
| RPM_DB_PATH=${INSTALLDIR}/var/lib/rpm |
| |
| # Check for versionrc |
| if [ -f ${INSTALLDIR}/program/versionrc ]; then VERSIONRC=versionrc; fi |
| |
| if [ "$UPDATE" = "ask" ] |
| then |
| PRODUCT=`sed --silent -e " |
| /^buildid=/ { |
| s/buildid=\(.*\)/ [\1]/ |
| h |
| } |
| /^ProductKey=/ { |
| s/ProductKey=// |
| G |
| p |
| }" ${INSTALLDIR}/program/${VERSIONRC:-bootstraprc} 2>/dev/null | tr -d "\012"` |
| |
| if [ ! -z "$PRODUCT" ] |
| then |
| echo |
| echo "Found an installation of $PRODUCT in $INSTALLDIR" |
| echo |
| while [ "$UPDATE" != "yes" ] |
| do |
| read -a UPDATE -p "Do you want to update this installation (yes/no)? " |
| if [ "$UPDATE" = "no" ] |
| then |
| exit 2 |
| fi |
| done |
| elif [ -d $RPM_DB_PATH -a "$ADD" = "no" ] |
| then |
| echo |
| echo "The following packages are already installed in $INSTALLDIR" |
| echo |
| rpm --dbpath `cd $RPM_DB_PATH; pwd` --query --all |
| echo |
| while [ "$UPDATE" != "yes" ] |
| do |
| read -a UPDATE -p "Do you want to continue with this installation (yes/no)? " |
| if [ "$UPDATE" = "no" ] |
| then |
| exit 2 |
| fi |
| done |
| else |
| UPDATE="no" |
| fi |
| fi |
| |
| # |
| # Check/Create installation directory |
| # |
| |
| if [ "$UPDATE" = "yes" ] |
| then |
| # restore original bootstraprc |
| mv -f ${INSTALLDIR}/program/bootstraprc.orig ${INSTALLDIR}/program/bootstraprc 2>/dev/null |
| |
| # the RPM_DB_PATH must be absolute |
| if [ ! "${RPM_DB_PATH:0:1}" = "/" ]; then |
| RPM_DB_PATH=`cd ${RPM_DB_PATH}; pwd` |
| fi |
| |
| # we should use --freshen for updates to not add languages with patches, but this will break |
| # language packs, so leave it for now .. |
| # RPMCMD="--freshen" |
| RPMCMD="--upgrade" |
| else |
| rmdir ${INSTALLDIR} 2>/dev/null |
| |
| if [ -d ${INSTALLDIR} -a "$ADD" = "no" ] |
| then |
| printf "\n$0: ${INSTALLDIR} exists and is not empty.\n" |
| exit 2 |
| fi |
| |
| mkdir -p $RPM_DB_PATH || exit 2 |
| # XXX why ? XXX |
| chmod 700 $RPM_DB_PATH |
| |
| # the RPM_DB_PATH must be absolute |
| if [ ! "${RPM_DB_PATH:0:1}" = "/" ]; then |
| RPM_DB_PATH=`cd ${RPM_DB_PATH}; pwd` |
| fi |
| |
| # Creating RPM database and initializing |
| if [ "$ADD" = "no" ]; then |
| rpm --initdb --dbpath $RPM_DB_PATH |
| fi |
| |
| # Default install command |
| RPMCMD="--install" |
| fi |
| |
| # populate the private rpm database with the dependencies needed |
| FAKEDBRPM=/tmp/fake-db-1.0-$$.noarch.rpm |
| linenum=??? |
| tail -n +$linenum $0 > $FAKEDBRPM |
| |
| rpm ${DEBIAN_FLAGS} --upgrade --ignoresize --dbpath $RPM_DB_PATH $FAKEDBRPM |
| |
| rm -f $FAKEDBRPM |
| |
| echo "Packages found:" |
| for i in $RPMLIST ; do |
| echo `basename $i` |
| done |
| |
| # |
| # Perform the installation |
| # |
| |
| echo |
| echo "####################################################################" |
| echo "# Installation of the found packages #" |
| echo "####################################################################" |
| echo |
| echo "Path to the database: " $RPM_DB_PATH |
| echo "Path to the packages: " $PACKAGE_PATH |
| echo "Path to the installation: " $INSTALLDIR |
| echo |
| echo "Installing the RPMs" |
| |
| ABSROOT=`cd ${INSTALLDIR}; pwd` |
| RELOCATIONS=`rpm -qp --qf "--relocate %{PREFIXES}=${ABSROOT}%{PREFIXES} \n" $RPMLIST | sort -u | tr -d "\012"` |
| UserInstallation=\$OOO_BASE_DIR/../UserInstallation rpm ${DEBIAN_FLAGS} $RPMCMD --ignoresize -vh $RELOCATIONS --dbpath $RPM_DB_PATH $RPMLIST |
| |
| # |
| # Create a link into the users home directory |
| # |
| |
| if [ "$LINK" = "yes" ] |
| then |
| find `cd "$INSTALLDIR" && pwd` -name soffice -type f -perm /u+x -exec /bin/bash -ce 'ln -sf "$0" "$HOME/soffice" && echo "Creating link from $0 to $HOME/soffice"' {} \; |
| fi |
| |
| if [ "$UPDATE" = "yes" -a ! -f $INSTALLDIR/program/bootstraprc ] |
| then |
| echo |
| echo "Update failed due to a bug in RPM, uninstalling .." |
| rpm ${DEBIAN_FLAGS} --erase -v --nodeps --dbpath $RPM_DB_PATH `rpm --query --queryformat "%{NAME} " --package $RPMLIST --dbpath $RPM_DB_PATH` |
| echo |
| echo "Now re-installing new packages .." |
| echo |
| rpm ${DEBIAN_FLAGS} --install --nodeps --ignoresize -vh $RELOCATIONS --dbpath $RPM_DB_PATH $RPMLIST |
| echo |
| fi |
| |
| # patch the "bootstraprc" to create a self-containing installation |
| find "$INSTALLDIR" -type f -name bootstraprc -exec /bin/bash -ce 'test ! -e "$0".orig && mv "$0" "$0".orig && sed '\''s,^UserInstallation=$SYSUSERCONFIG.*,UserInstallation=$OOO_BASE_DIR/../UserInstallation,'\'' "$0".orig > "$0"' {} \; |
| |
| # if an unpack directory exists, it can be removed now |
| if [ ! -z "$UNPACKDIR" ] |
| then |
| rm $UNPACKDIR/*.rpm |
| rmdir $UNPACKDIR |
| echo "Removed temporary directory $UNPACKDIR" |
| fi |
| |
| echo |
| echo "Installation done ..." |
| |
| exit 0 |