diff -r 71503088f51b -r f880f219c566 openpkg/etc.wrapbin.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openpkg/etc.wrapbin.sh Tue Jul 31 12:23:42 2012 +0200 @@ -0,0 +1,267 @@ +#!/bin/sh +#![OpenPKG] +## +## OpenPKG Binary Bootstrap Package (self-extracting shell script) +## Copyright (c) 2000-2012 OpenPKG GmbH +## +## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. +## All rights reserved. Licenses which grant limited permission to use, +## copy, modify and distribute this software are available from the +## OpenPKG GmbH. +## +## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR +## CONTRIBUTORS 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. +## + +# configuration +l_me="$0" +o_help=no +o_version=no +o_tar=no +l_prefix='@l_prefix@' +l_musr='@MUSR@' +l_mgrp='@MGRP@' +l_platform="@l_platform@" +l_release="@l_release@" +l_version="@l_version@" +l_unprivileged="@l_unprivileged@" + +# establish standard environment +PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin" +LC_CTYPE=C +export LC_CTYPE +umask 022 + +# parse command line options +for opt +do + case $opt in + -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; + *) arg='' ;; + esac + case $opt in + -h | --help ) o_help=yes ;; + -v | --version ) o_version=yes ;; + -t | --tar ) o_tar=yes ;; + --prefix=* ) l_prefix=$arg ;; + * ) o_help=yes ;; + esac +done +if [ ".$o_version" = .no -a ".$l_prefix" = . ]; then + o_help=yes +fi +if [ ".$o_help" = .yes ]; then + echo "Usage: sh $l_me" 2>&1 + echo " [--prefix=] [-t|--tar]" 2>&1 + echo " [-h|--help] [-v|--version]" 2>&1 + exit 1 +fi + +# make sure all essential installation tools are available +for tool in sed mkdir dd tar chown chgrp; do + found=no + case $tool in + /* ) + if [ -f $tool ]; then + found=yes + fi + ;; + * ) + for p in `IFS=:; echo $PATH`; do + if [ -f "$p/$tool" ]; then + found=yes + break + fi + done + ;; + esac + if [ ".$found" = .no ]; then + echo "$l_me:ERROR: unable to find installation tool \"$tool\"" 1>&2 + exit 1 + fi +done + +# optionally extract the embedded tarball only +if [ ".$o_tar" = .yes ]; then + tmpdir="${TMPDIR-/tmp}/openpkg.$$" + ( umask 077 && mkdir $tmpdir) || exit 1 + dd if=$l_me bs=8192 skip=8 2>/dev/null |\ + ( cd $tmpdir || exit 1 + tar xf - 2>/dev/null || exit 1 + ./openpkg.bzip2 -d -c openpkg.tar.bz2 + ) || exit 1 + rm -rf $tmpdir + exit 0 +fi + +# display version and copyright header +echo "OpenPKG ${l_release} Binary Bootstrap Package, version ${l_version}" +echo "Built for prefix ${l_prefix} on target platform ${l_platform}" +if [ ".$o_version" = .yes ]; then + exit 0 +fi + +# determine current username +cusr=`(id -un) 2>/dev/null ||\ + (id | sed -e 's;^[^(]*(\([^)]*\)).*;\1;') 2>/dev/null ||\ + (whoami) 2>/dev/null ||\ + (who am i | cut "-d " -f1) 2>/dev/null ||\ + echo ${LOGNAME-"NN"}` + +# running the embedded %pre script for hooking into the system environment +echo "++ hooking OpenPKG instance into system environment" +prefix="$l_prefix" +susr='@SUSR@'; sgrp='@SGRP@' +musr='@MUSR@'; mgrp='@MGRP@' +rusr='@RUSR@'; rgrp='@RGRP@' +nusr='@NUSR@'; ngrp='@NGRP@' +suid='@SUID@'; sgid='@SGID@' +muid='@MUID@'; mgid='@MGID@' +ruid='@RUID@'; rgid='@RGID@' +nuid='@NUID@'; ngid='@NGID@' +unprivileged="$l_unprivileged" +set -- 1 # emulate RPM's $1 when executing scripts +# ---- BEGIN EMBEDDED %pre SCRIPT ---- +@PRE@ +# ---- END EMBEDDED %pre SCRIPT ---- + +# make sure prefix/root directory exists +# and has correct permissions and owner/group +if [ ! -d $l_prefix ]; then + # create prefix/root directory from scratch + echo "++ creating OpenPKG instance root directory \"$l_prefix\"" + d='' + for c in `IFS=/; echo $l_prefix`; do + d="$d/$c" + if [ ! -d $d ]; then + mkdir $d || exit 1 + chmod 755 $d || exit 1 + if [ ".$cusr" = .root ]; then + chown $musr $d >/dev/null 2>&1 || true + chgrp $mgrp $d >/dev/null 2>&1 || true + fi + fi + done +else + # adjust already existing prefix/root directory + echo "++ fixating OpenPKG instance root directory \"$l_prefix\"" + ( cd $l_prefix || exit 1 + chmod 755 . || exit 1 + if [ ".$cusr" = .root ]; then + chown $musr . >/dev/null 2>&1 || true + chgrp $mgrp . >/dev/null 2>&1 || true + fi + ) || exit 1 +fi + +# extract and install binary distribution files +echo "++ extracting OpenPKG binary distribution" +dd if=$l_me bs=8192 skip=8 2>/dev/null |\ + (cd $l_prefix; tar xf - 2>/dev/null) +echo "++ installing OpenPKG binary distribution" +( cd $l_prefix || exit 1 + ./openpkg.bzip2 -d -c openpkg.tar.bz2 | ./openpkg.tar xf - 2>/dev/null + rm -f openpkg.tar openpkg.bzip2 openpkg.tar.bz2 >/dev/null 2>&1 || true +) || exit 1 + +# immediately activate BOOT license to let the +# following early RPM usage already work correctly +echo "BOOT" >$l_prefix/etc/openpkg/license + +# fixate installation files +# (ATTENTION: order of chgrp/chown and chmod is important because of "set-UID" bits) +echo "++ fixating OpenPKG instance filesystem hierarchy" +( echo 'fixate () {' + echo ' chgrp "$3" "$4"' + echo ' chown "$2" "$4"' + echo ' chmod "$1" "$4"' + echo '}' + cd / && $l_prefix/bin/openpkg --keep-privileges rpm -q openpkg \ + --qf '[fixate %7.7{FILEMODES:octal} %{FILEUSERNAME:shescape} %{FILEGROUPNAME:shescape} ::%{FILENAMES:shescape}\n]' |\ + grep -v '(none)' | sed 's/^fixate .../fixate /' | sed -e "s; ::\\(.\\)@l_prefix@; \\1$l_prefix;" +) | sh 2>/dev/null || true + +# running the embedded %post script +echo "++ post-processing OpenPKG bootstrap installation" +prefix="$l_prefix" +susr='@SUSR@'; sgrp='@SGRP@' +musr='@MUSR@'; mgrp='@MGRP@' +rusr='@RUSR@'; rgrp='@RGRP@' +nusr='@NUSR@'; ngrp='@NGRP@' +suid='@SUID@'; sgid='@SGID@' +muid='@MUID@'; mgid='@MGID@' +ruid='@RUID@'; rgid='@RGID@' +nuid='@NUID@'; ngid='@NGID@' +unprivileged="$l_unprivileged" +set -- 1 # emulate RPM's $1 when executing scripts +# ---- BEGIN EMBEDDED %post SCRIPT ---- +@POST@ +# ---- END EMBEDDED %post SCRIPT ---- + +# display final information +( echo "Congratulations!" + echo "" + echo "You have successfully installed an OpenPKG ${l_release} instance" + echo "under prefix ${l_prefix} on target platform ${l_platform}." + echo "" + echo "For details about this OpenPKG instance, run any of the" + echo "following typical OpenPKG RPM query commands:" + echo "" + echo " \$ ${l_prefix}/bin/openpkg rpm -qa" + echo " \$ ${l_prefix}/bin/openpkg rpm -qi openpkg" + echo " \$ ${l_prefix}/bin/openpkg rpm -qlv openpkg" + echo "" + echo "To check the integrity of the entire OpenPKG instance," + echo "run the following OpenPKG RPM verify command:" + echo "" + echo " \$ ${l_prefix}/bin/openpkg rpm -Va" + echo "" + echo "To install software packages into this OpenPKG instance, run" + echo "the following two OpenPKG RPM build commands for each package:" + echo "" + echo " \$ ${l_prefix}/bin/openpkg rpm --rebuild /path/to/foo-*.src.rpm" + echo " \$ ${l_prefix}/bin/openpkg rpm -Uvh ${l_prefix}/RPM/PKG/foo-*.rpm" + echo "" + echo "To leverage from remote indexes on download.openpkg.org and" + echo "conveniently generate a shell script for all-in-one downloading" + echo "(openpkg curl), building (openpkg rpm --rebuild) and installing" + echo "(openpkg rpm -Uvh) one or more OpenPKG RPM packages, including all" + echo "their transitive dependencies, in topologically correct order:" + echo "" + echo " \$ ${l_prefix}/bin/openpkg build foo bar quux | sh" + echo "" + echo "To remove a software package later, just run:" + echo "" + echo " \$ ${l_prefix}/bin/openpkg rpm -e foo" + echo "" + echo "To remove the whole OpenPKG instance under prefix ${l_prefix}," + echo "just remove every package as shown above. As you finally" + echo "remove the package \"openpkg\", the OpenPKG instance itself" + echo "will be unlinked from the system and removed as well." + echo "" + echo "Thank you for flying OpenPKG..." + echo " Ralf S. Engelschall" + echo " OpenPKG GmbH" + echo " openpkg.com" +) | $l_prefix/lib/openpkg/rpmtool msg -b -t info + +# die explicitly just before the shell would discover +# that we carry mega-bytes of data with us... ;-) +exit 0 + +# the distribution tarball is appended in raw format directly to the +# end of this script, just leaded by padding whitespaces which make +# sure that the tarball data starts at the pre-defined offset of 64KB. +# This allows us to unpack the tarball by just skipping the leading +# 64KB (= 8192*8, see above). +