|
1 #!/bin/sh |
|
2 #![OpenPKG] |
|
3 ## |
|
4 ## OpenPKG Binary Bootstrap Package (self-extracting shell script) |
|
5 ## Copyright (c) 2000-2012 OpenPKG GmbH <http://openpkg.com/> |
|
6 ## |
|
7 ## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. |
|
8 ## All rights reserved. Licenses which grant limited permission to use, |
|
9 ## copy, modify and distribute this software are available from the |
|
10 ## OpenPKG GmbH. |
|
11 ## |
|
12 ## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED |
|
13 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|
14 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|
15 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
|
16 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
17 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
18 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
|
19 ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|
20 ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
|
21 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
|
22 ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
23 ## SUCH DAMAGE. |
|
24 ## |
|
25 |
|
26 # configuration |
|
27 l_me="$0" |
|
28 o_help=no |
|
29 o_version=no |
|
30 o_tar=no |
|
31 l_prefix='@l_prefix@' |
|
32 l_musr='@MUSR@' |
|
33 l_mgrp='@MGRP@' |
|
34 l_platform="@l_platform@" |
|
35 l_release="@l_release@" |
|
36 l_version="@l_version@" |
|
37 l_unprivileged="@l_unprivileged@" |
|
38 |
|
39 # establish standard environment |
|
40 PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin" |
|
41 LC_CTYPE=C |
|
42 export LC_CTYPE |
|
43 umask 022 |
|
44 |
|
45 # parse command line options |
|
46 for opt |
|
47 do |
|
48 case $opt in |
|
49 -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; |
|
50 *) arg='' ;; |
|
51 esac |
|
52 case $opt in |
|
53 -h | --help ) o_help=yes ;; |
|
54 -v | --version ) o_version=yes ;; |
|
55 -t | --tar ) o_tar=yes ;; |
|
56 --prefix=* ) l_prefix=$arg ;; |
|
57 * ) o_help=yes ;; |
|
58 esac |
|
59 done |
|
60 if [ ".$o_version" = .no -a ".$l_prefix" = . ]; then |
|
61 o_help=yes |
|
62 fi |
|
63 if [ ".$o_help" = .yes ]; then |
|
64 echo "Usage: sh $l_me" 2>&1 |
|
65 echo " [--prefix=<prefix>] [-t|--tar]" 2>&1 |
|
66 echo " [-h|--help] [-v|--version]" 2>&1 |
|
67 exit 1 |
|
68 fi |
|
69 |
|
70 # make sure all essential installation tools are available |
|
71 for tool in sed mkdir dd tar chown chgrp; do |
|
72 found=no |
|
73 case $tool in |
|
74 /* ) |
|
75 if [ -f $tool ]; then |
|
76 found=yes |
|
77 fi |
|
78 ;; |
|
79 * ) |
|
80 for p in `IFS=:; echo $PATH`; do |
|
81 if [ -f "$p/$tool" ]; then |
|
82 found=yes |
|
83 break |
|
84 fi |
|
85 done |
|
86 ;; |
|
87 esac |
|
88 if [ ".$found" = .no ]; then |
|
89 echo "$l_me:ERROR: unable to find installation tool \"$tool\"" 1>&2 |
|
90 exit 1 |
|
91 fi |
|
92 done |
|
93 |
|
94 # optionally extract the embedded tarball only |
|
95 if [ ".$o_tar" = .yes ]; then |
|
96 tmpdir="${TMPDIR-/tmp}/openpkg.$$" |
|
97 ( umask 077 && mkdir $tmpdir) || exit 1 |
|
98 dd if=$l_me bs=8192 skip=8 2>/dev/null |\ |
|
99 ( cd $tmpdir || exit 1 |
|
100 tar xf - 2>/dev/null || exit 1 |
|
101 ./openpkg.bzip2 -d -c openpkg.tar.bz2 |
|
102 ) || exit 1 |
|
103 rm -rf $tmpdir |
|
104 exit 0 |
|
105 fi |
|
106 |
|
107 # display version and copyright header |
|
108 echo "OpenPKG ${l_release} Binary Bootstrap Package, version ${l_version}" |
|
109 echo "Built for prefix ${l_prefix} on target platform ${l_platform}" |
|
110 if [ ".$o_version" = .yes ]; then |
|
111 exit 0 |
|
112 fi |
|
113 |
|
114 # determine current username |
|
115 cusr=`(id -un) 2>/dev/null ||\ |
|
116 (id | sed -e 's;^[^(]*(\([^)]*\)).*;\1;') 2>/dev/null ||\ |
|
117 (whoami) 2>/dev/null ||\ |
|
118 (who am i | cut "-d " -f1) 2>/dev/null ||\ |
|
119 echo ${LOGNAME-"NN"}` |
|
120 |
|
121 # running the embedded %pre script for hooking into the system environment |
|
122 echo "++ hooking OpenPKG instance into system environment" |
|
123 prefix="$l_prefix" |
|
124 susr='@SUSR@'; sgrp='@SGRP@' |
|
125 musr='@MUSR@'; mgrp='@MGRP@' |
|
126 rusr='@RUSR@'; rgrp='@RGRP@' |
|
127 nusr='@NUSR@'; ngrp='@NGRP@' |
|
128 suid='@SUID@'; sgid='@SGID@' |
|
129 muid='@MUID@'; mgid='@MGID@' |
|
130 ruid='@RUID@'; rgid='@RGID@' |
|
131 nuid='@NUID@'; ngid='@NGID@' |
|
132 unprivileged="$l_unprivileged" |
|
133 set -- 1 # emulate RPM's $1 when executing scripts |
|
134 # ---- BEGIN EMBEDDED %pre SCRIPT ---- |
|
135 @PRE@ |
|
136 # ---- END EMBEDDED %pre SCRIPT ---- |
|
137 |
|
138 # make sure prefix/root directory exists |
|
139 # and has correct permissions and owner/group |
|
140 if [ ! -d $l_prefix ]; then |
|
141 # create prefix/root directory from scratch |
|
142 echo "++ creating OpenPKG instance root directory \"$l_prefix\"" |
|
143 d='' |
|
144 for c in `IFS=/; echo $l_prefix`; do |
|
145 d="$d/$c" |
|
146 if [ ! -d $d ]; then |
|
147 mkdir $d || exit 1 |
|
148 chmod 755 $d || exit 1 |
|
149 if [ ".$cusr" = .root ]; then |
|
150 chown $musr $d >/dev/null 2>&1 || true |
|
151 chgrp $mgrp $d >/dev/null 2>&1 || true |
|
152 fi |
|
153 fi |
|
154 done |
|
155 else |
|
156 # adjust already existing prefix/root directory |
|
157 echo "++ fixating OpenPKG instance root directory \"$l_prefix\"" |
|
158 ( cd $l_prefix || exit 1 |
|
159 chmod 755 . || exit 1 |
|
160 if [ ".$cusr" = .root ]; then |
|
161 chown $musr . >/dev/null 2>&1 || true |
|
162 chgrp $mgrp . >/dev/null 2>&1 || true |
|
163 fi |
|
164 ) || exit 1 |
|
165 fi |
|
166 |
|
167 # extract and install binary distribution files |
|
168 echo "++ extracting OpenPKG binary distribution" |
|
169 dd if=$l_me bs=8192 skip=8 2>/dev/null |\ |
|
170 (cd $l_prefix; tar xf - 2>/dev/null) |
|
171 echo "++ installing OpenPKG binary distribution" |
|
172 ( cd $l_prefix || exit 1 |
|
173 ./openpkg.bzip2 -d -c openpkg.tar.bz2 | ./openpkg.tar xf - 2>/dev/null |
|
174 rm -f openpkg.tar openpkg.bzip2 openpkg.tar.bz2 >/dev/null 2>&1 || true |
|
175 ) || exit 1 |
|
176 |
|
177 # immediately activate BOOT license to let the |
|
178 # following early RPM usage already work correctly |
|
179 echo "BOOT" >$l_prefix/etc/openpkg/license |
|
180 |
|
181 # fixate installation files |
|
182 # (ATTENTION: order of chgrp/chown and chmod is important because of "set-UID" bits) |
|
183 echo "++ fixating OpenPKG instance filesystem hierarchy" |
|
184 ( echo 'fixate () {' |
|
185 echo ' chgrp "$3" "$4"' |
|
186 echo ' chown "$2" "$4"' |
|
187 echo ' chmod "$1" "$4"' |
|
188 echo '}' |
|
189 cd / && $l_prefix/bin/openpkg --keep-privileges rpm -q openpkg \ |
|
190 --qf '[fixate %7.7{FILEMODES:octal} %{FILEUSERNAME:shescape} %{FILEGROUPNAME:shescape} ::%{FILENAMES:shescape}\n]' |\ |
|
191 grep -v '(none)' | sed 's/^fixate .../fixate /' | sed -e "s; ::\\(.\\)@l_prefix@; \\1$l_prefix;" |
|
192 ) | sh 2>/dev/null || true |
|
193 |
|
194 # running the embedded %post script |
|
195 echo "++ post-processing OpenPKG bootstrap installation" |
|
196 prefix="$l_prefix" |
|
197 susr='@SUSR@'; sgrp='@SGRP@' |
|
198 musr='@MUSR@'; mgrp='@MGRP@' |
|
199 rusr='@RUSR@'; rgrp='@RGRP@' |
|
200 nusr='@NUSR@'; ngrp='@NGRP@' |
|
201 suid='@SUID@'; sgid='@SGID@' |
|
202 muid='@MUID@'; mgid='@MGID@' |
|
203 ruid='@RUID@'; rgid='@RGID@' |
|
204 nuid='@NUID@'; ngid='@NGID@' |
|
205 unprivileged="$l_unprivileged" |
|
206 set -- 1 # emulate RPM's $1 when executing scripts |
|
207 # ---- BEGIN EMBEDDED %post SCRIPT ---- |
|
208 @POST@ |
|
209 # ---- END EMBEDDED %post SCRIPT ---- |
|
210 |
|
211 # display final information |
|
212 ( echo "Congratulations!" |
|
213 echo "" |
|
214 echo "You have successfully installed an OpenPKG ${l_release} instance" |
|
215 echo "under prefix ${l_prefix} on target platform ${l_platform}." |
|
216 echo "" |
|
217 echo "For details about this OpenPKG instance, run any of the" |
|
218 echo "following typical OpenPKG RPM query commands:" |
|
219 echo "" |
|
220 echo " \$ ${l_prefix}/bin/openpkg rpm -qa" |
|
221 echo " \$ ${l_prefix}/bin/openpkg rpm -qi openpkg" |
|
222 echo " \$ ${l_prefix}/bin/openpkg rpm -qlv openpkg" |
|
223 echo "" |
|
224 echo "To check the integrity of the entire OpenPKG instance," |
|
225 echo "run the following OpenPKG RPM verify command:" |
|
226 echo "" |
|
227 echo " \$ ${l_prefix}/bin/openpkg rpm -Va" |
|
228 echo "" |
|
229 echo "To install software packages into this OpenPKG instance, run" |
|
230 echo "the following two OpenPKG RPM build commands for each package:" |
|
231 echo "" |
|
232 echo " \$ ${l_prefix}/bin/openpkg rpm --rebuild /path/to/foo-*.src.rpm" |
|
233 echo " \$ ${l_prefix}/bin/openpkg rpm -Uvh ${l_prefix}/RPM/PKG/foo-*.rpm" |
|
234 echo "" |
|
235 echo "To leverage from remote indexes on download.openpkg.org and" |
|
236 echo "conveniently generate a shell script for all-in-one downloading" |
|
237 echo "(openpkg curl), building (openpkg rpm --rebuild) and installing" |
|
238 echo "(openpkg rpm -Uvh) one or more OpenPKG RPM packages, including all" |
|
239 echo "their transitive dependencies, in topologically correct order:" |
|
240 echo "" |
|
241 echo " \$ ${l_prefix}/bin/openpkg build foo bar quux | sh" |
|
242 echo "" |
|
243 echo "To remove a software package later, just run:" |
|
244 echo "" |
|
245 echo " \$ ${l_prefix}/bin/openpkg rpm -e foo" |
|
246 echo "" |
|
247 echo "To remove the whole OpenPKG instance under prefix ${l_prefix}," |
|
248 echo "just remove every package as shown above. As you finally" |
|
249 echo "remove the package \"openpkg\", the OpenPKG instance itself" |
|
250 echo "will be unlinked from the system and removed as well." |
|
251 echo "" |
|
252 echo "Thank you for flying OpenPKG..." |
|
253 echo " Ralf S. Engelschall" |
|
254 echo " OpenPKG GmbH" |
|
255 echo " openpkg.com" |
|
256 ) | $l_prefix/lib/openpkg/rpmtool msg -b -t info |
|
257 |
|
258 # die explicitly just before the shell would discover |
|
259 # that we carry mega-bytes of data with us... ;-) |
|
260 exit 0 |
|
261 |
|
262 # the distribution tarball is appended in raw format directly to the |
|
263 # end of this script, just leaded by padding whitespaces which make |
|
264 # sure that the tarball data starts at the pre-defined offset of 64KB. |
|
265 # This allows us to unpack the tarball by just skipping the leading |
|
266 # 64KB (= 8192*8, see above). |
|
267 |