Mon, 20 Apr 2009 19:23:01 +0200
Add fingerprints config for client certificate based authentication.
michael@13 | 1 | #!/bin/sh |
michael@13 | 2 | ## |
michael@13 | 3 | ## openpkg.boot -- OpenPKG bootstrap procedure (look Ma, without hands ;) |
michael@13 | 4 | ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> |
michael@13 | 5 | ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> |
michael@13 | 6 | ## |
michael@13 | 7 | ## Permission to use, copy, modify, and distribute this software for |
michael@13 | 8 | ## any purpose with or without fee is hereby granted, provided that |
michael@13 | 9 | ## the above copyright notice and this permission notice appear in all |
michael@13 | 10 | ## copies. |
michael@13 | 11 | ## |
michael@13 | 12 | ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
michael@13 | 13 | ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
michael@13 | 14 | ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
michael@13 | 15 | ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
michael@13 | 16 | ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
michael@13 | 17 | ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
michael@13 | 18 | ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
michael@13 | 19 | ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
michael@13 | 20 | ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
michael@13 | 21 | ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
michael@13 | 22 | ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
michael@13 | 23 | ## SUCH DAMAGE. |
michael@13 | 24 | ## |
michael@13 | 25 | |
michael@13 | 26 | # This is a very tricky procedure for building the OpenPKG bootstrap |
michael@13 | 27 | # package via the RPM specification openpkg.spec, but without |
michael@13 | 28 | # requiring that OpenPKG's RPM already exists. For this the |
michael@13 | 29 | # openpkg.spec file is manually executed here in order to build |
michael@13 | 30 | # OpenPKG RPM the first time (that is, we emulate a sufficient |
michael@13 | 31 | # subset of the RPM functionality), followed by a second round over |
michael@13 | 32 | # openpkg.spec with the real (and then existing) OpenPKG RPM tool. |
michael@13 | 33 | # Also keep in mind that lots of tricks are played here in order to |
michael@13 | 34 | # perform all the steps without having to touch the real installation |
michael@13 | 35 | # location. That is the whole procedure can (and should) be performed |
michael@13 | 36 | # by a non-privileged user and no access to the real installation |
michael@13 | 37 | # location filesystem location. |
michael@13 | 38 | |
michael@13 | 39 | me="openpkg.boot" |
michael@13 | 40 | |
michael@13 | 41 | ## |
michael@13 | 42 | ## command line handling |
michael@13 | 43 | ## |
michael@13 | 44 | |
michael@13 | 45 | # command line parameters (defaults) |
michael@13 | 46 | help=0 |
michael@13 | 47 | verbose='' |
michael@13 | 48 | prefix='' |
michael@13 | 49 | tag='' |
michael@13 | 50 | usr=''; grp='' |
michael@13 | 51 | susr=''; sgrp='' |
michael@13 | 52 | musr=''; mgrp='' |
michael@13 | 53 | rusr=''; rgrp='' |
michael@13 | 54 | nusr=''; ngrp='' |
michael@13 | 55 | suid=''; sgid='' |
michael@13 | 56 | muid=''; mgid='' |
michael@13 | 57 | ruid=''; rgid='' |
michael@13 | 58 | nuid=''; ngid='' |
michael@13 | 59 | use_tar=''; use_make=''; use_cc=''; use_ar=''; use_ld=''; use_as=''; use_strip='' |
michael@13 | 60 | bs=0 |
michael@13 | 61 | |
michael@13 | 62 | # parse command line options |
michael@13 | 63 | for opt |
michael@13 | 64 | do |
michael@13 | 65 | case $opt in |
michael@13 | 66 | -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; |
michael@13 | 67 | *) arg='' ;; |
michael@13 | 68 | esac |
michael@13 | 69 | case $opt in |
michael@13 | 70 | -h | --help ) help=1 ;; |
michael@13 | 71 | -v | --verbose ) verbose=v ;; |
michael@13 | 72 | --prefix=* ) prefix=$arg ;; |
michael@13 | 73 | --tag=* ) tag=$arg ;; |
michael@13 | 74 | --usr=* | --user=* ) usr=$arg ;; |
michael@13 | 75 | --grp=* | --group=* ) grp=$arg ;; |
michael@13 | 76 | --susr=* ) susr=$arg ;; |
michael@13 | 77 | --sgrp=* ) sgrp=$arg ;; |
michael@13 | 78 | --musr=* ) musr=$arg ;; |
michael@13 | 79 | --mgrp=* ) mgrp=$arg ;; |
michael@13 | 80 | --rusr=* ) rusr=$arg ;; |
michael@13 | 81 | --rgrp=* ) rgrp=$arg ;; |
michael@13 | 82 | --nusr=* ) nusr=$arg ;; |
michael@13 | 83 | --ngrp=* ) ngrp=$arg ;; |
michael@13 | 84 | --suid=* ) suid=$arg ;; |
michael@13 | 85 | --sgid=* ) sgid=$arg ;; |
michael@13 | 86 | --muid=* ) muid=$arg ;; |
michael@13 | 87 | --mgid=* ) mgid=$arg ;; |
michael@13 | 88 | --ruid=* ) ruid=$arg ;; |
michael@13 | 89 | --rgid=* ) rgid=$arg ;; |
michael@13 | 90 | --nuid=* ) nuid=$arg ;; |
michael@13 | 91 | --ngid=* ) ngid=$arg ;; |
michael@13 | 92 | --use_tar=* ) use_tar=$arg ;; |
michael@13 | 93 | --use_make=* ) use_make=$arg ;; |
michael@13 | 94 | --use_cc=* ) use_cc=$arg ;; |
michael@13 | 95 | --use_ar=* ) use_ar=$arg ;; |
michael@13 | 96 | --use_ld=* ) use_ld=$arg ;; |
michael@13 | 97 | --use_as=* ) use_as=$arg ;; |
michael@13 | 98 | --use_strip=* ) use_strip=$arg ;; |
michael@13 | 99 | -bs | -s ) bs=1 ;; |
michael@13 | 100 | * ) help=1 ;; |
michael@13 | 101 | esac |
michael@13 | 102 | done |
michael@13 | 103 | if [ ".$bs" = .0 -a ".$prefix" = . ]; then |
michael@13 | 104 | help=1 |
michael@13 | 105 | fi |
michael@13 | 106 | if [ ".$help" = .1 ]; then |
michael@13 | 107 | echo "Usage: sh $me" 2>&1 |
michael@13 | 108 | echo " [--prefix=<prefix>] [--tag=<str>]" 2>&1 |
michael@13 | 109 | echo " [--user=<usr>] [--group=<grp>]" 2>&1 |
michael@13 | 110 | echo " [--{s,m,r,n}usr=<usr>] [--{s,m,r,n}grp=<grp>]" 2>&1 |
michael@13 | 111 | echo " [--{s,m,r,n}uid=<uid>] [--{s,m,r,n}gid=<gid>]" 2>&1 |
michael@13 | 112 | echo " [--use_tar=<tar>] [--use_make=<make>] [--use_cc=<cc>]" 2>&1 |
michael@13 | 113 | echo " [--use_ar=<ar>] [--use_ld=<ld>] [--use_as=<as>] [--use_strip=<strip>]" 2>&1 |
michael@13 | 114 | echo " [-t|--tar] [-h|--help] [-v|--version]" 2>&1 |
michael@13 | 115 | exit 1 |
michael@13 | 116 | fi |
michael@13 | 117 | |
michael@13 | 118 | # determine missing parameters |
michael@13 | 119 | eval `sh aux.usrgrp.sh \ |
michael@13 | 120 | --usr="$usr" --grp="$grp" \ |
michael@13 | 121 | --susr="$susr" --sgrp="$sgrp" \ |
michael@13 | 122 | --musr="$musr" --mgrp="$mgrp" \ |
michael@13 | 123 | --rusr="$rusr" --rgrp="$rgrp" \ |
michael@13 | 124 | --nusr="$nusr" --ngrp="$ngrp" \ |
michael@13 | 125 | --suid="$suid" --sgid="$sgid" \ |
michael@13 | 126 | --muid="$muid" --mgid="$mgid" \ |
michael@13 | 127 | --ruid="$ruid" --rgid="$rgid" \ |
michael@13 | 128 | --nuid="$nuid" --ngid="$ngid"` |
michael@13 | 129 | |
michael@13 | 130 | # canonicalize prefix |
michael@13 | 131 | prefix=`echo "$prefix" | sed -e 's;//*;/;g' -e 's;/$;;'` |
michael@13 | 132 | |
michael@13 | 133 | # provide default package tag |
michael@13 | 134 | if [ ".$tag" = . ]; then |
michael@13 | 135 | tag="<loc>" |
michael@13 | 136 | fi |
michael@13 | 137 | |
michael@13 | 138 | ## |
michael@13 | 139 | ## determine package information |
michael@13 | 140 | ## |
michael@13 | 141 | |
michael@13 | 142 | name="openpkg" |
michael@13 | 143 | spec="$name.spec" |
michael@13 | 144 | version=`grep V_openpkg $spec | sed -e 'q' | awk '{ printf("%s", $3); }'` |
michael@13 | 145 | release="$version" |
michael@13 | 146 | |
michael@13 | 147 | ## |
michael@13 | 148 | ## display headline |
michael@13 | 149 | ## |
michael@13 | 150 | |
michael@13 | 151 | sh ./shtool echo -e "%BOpenPKG Bootstrap Procedure%b" |
michael@13 | 152 | echo "++ bootstrap version: $version-$release" |
michael@13 | 153 | echo "++ user/group pairs: $susr/$sgrp $musr/$mgrp $rusr/$rgrp $nusr/$ngrp" |
michael@13 | 154 | |
michael@13 | 155 | ## |
michael@13 | 156 | ## optionally roll just a bootstrap source package |
michael@13 | 157 | ## |
michael@13 | 158 | |
michael@13 | 159 | if [ ".$bs" = .1 ]; then |
michael@13 | 160 | srcdir=. |
michael@13 | 161 | if [ -d ../../dst ]; then |
michael@13 | 162 | dstdir=../../dst/openpkg |
michael@13 | 163 | else |
michael@13 | 164 | dstdir=. |
michael@13 | 165 | fi |
michael@13 | 166 | tmpdir="/tmp/$me.$$.d" |
michael@13 | 167 | if [ -d ../PKG/SRC ]; then |
michael@13 | 168 | pkgdir=../PKG/SRC |
michael@13 | 169 | elif [ -d ../PKG ]; then |
michael@13 | 170 | pkgdir=../PKG |
michael@13 | 171 | elif [ -d ../../PKG/SRC ]; then |
michael@13 | 172 | pkgdir=../../PKG/SRC |
michael@13 | 173 | elif [ -d ../../PKG ]; then |
michael@13 | 174 | pkgdir=../../PKG |
michael@13 | 175 | elif [ -d ../../pkg/src ]; then |
michael@13 | 176 | pkgdir=../../pkg/src |
michael@13 | 177 | elif [ -d ../../pkg ]; then |
michael@13 | 178 | pkgdir=../../pkg |
michael@13 | 179 | else |
michael@13 | 180 | pkgdir=.. |
michael@13 | 181 | fi |
michael@13 | 182 | echo "** rolling source bootstrap package:" |
michael@13 | 183 | echo " $pkgdir/$name-$version-$release.src.sh" |
michael@13 | 184 | rm -rf $tmpdir |
michael@13 | 185 | mkdir $tmpdir |
michael@13 | 186 | ( echo "dstdir=$dstdir" |
michael@13 | 187 | echo "srcdir=$srcdir" |
michael@13 | 188 | echo "tmpdir=$tmpdir" |
michael@13 | 189 | grep '^%define' $spec | sed -e 's:^%define *\([^ ]*\) *\(.*\):\1="\2":' |
michael@13 | 190 | grep '^Source' $spec | sed -e 's;^Source[0-9]*: *;;' -e 's;^.*/;$dstdir/;' \ |
michael@13 | 191 | -e 's;^\([^/]*\)$;$srcdir/\1;' -e 's;%;$;g' \ |
michael@13 | 192 | -e 's;^\(.*\)$;cp \1 $tmpdir/;' |
michael@13 | 193 | echo "cp -p $spec $tmpdir/" |
michael@13 | 194 | ) >$tmpdir/.sh |
michael@13 | 195 | sh $tmpdir/.sh |
michael@13 | 196 | rm -f $tmpdir/.sh |
michael@13 | 197 | l_version="$release" |
michael@13 | 198 | l_release=`sh ./release.sh -r "${l_version}" -F "%t"` |
michael@13 | 199 | sed <$srcdir/aux.wrapsrc.sh >$tmpdir/openpkg.boot.tmp \ |
michael@13 | 200 | -e "s;@l_dir@;$name-$version-$release.src;" \ |
michael@13 | 201 | -e "s;@l_release@;$l_release;" \ |
michael@13 | 202 | -e "s;@l_version@;$l_version;" |
michael@13 | 203 | echo . | awk '{ |
michael@13 | 204 | for (i = 0; i < 8192; i++) { |
michael@13 | 205 | printf(" "); |
michael@13 | 206 | } |
michael@13 | 207 | }' >>$tmpdir/openpkg.boot.tmp |
michael@13 | 208 | dd if=$tmpdir/openpkg.boot.tmp bs=8192 count=8 \ |
michael@13 | 209 | of=$pkgdir/$name-$version-$release.src.sh 2>/dev/null |
michael@13 | 210 | rm -f $tmpdir/openpkg.boot.tmp |
michael@13 | 211 | (cd $tmpdir && tar cf - *) >>$pkgdir/$name-$version-$release.src.sh |
michael@13 | 212 | rm -rf $tmpdir |
michael@13 | 213 | exit 0 |
michael@13 | 214 | fi |
michael@13 | 215 | |
michael@13 | 216 | ## |
michael@13 | 217 | ## determine distribution directory |
michael@13 | 218 | ## |
michael@13 | 219 | |
michael@13 | 220 | V_rpm=`grep V_rpm $spec | sed -e 'q' | awk '{ printf("%s", $3); }'` |
michael@13 | 221 | if [ -f "../../dst/openpkg/rpm-${V_rpm}.tar.gz" ]; then |
michael@13 | 222 | distdir="`cd ../../dst/openpkg; pwd`" # developer only |
michael@13 | 223 | else |
michael@13 | 224 | distdir="`pwd`" |
michael@13 | 225 | fi |
michael@13 | 226 | echo "++ distribution directory: $distdir" |
michael@13 | 227 | |
michael@13 | 228 | ## |
michael@13 | 229 | ## perform prerequisite checks |
michael@13 | 230 | ## |
michael@13 | 231 | |
michael@13 | 232 | sh ./aux.prereq.sh source || exit $? |
michael@13 | 233 | |
michael@13 | 234 | ## |
michael@13 | 235 | ## find reasonable run-time paths and tools |
michael@13 | 236 | ## |
michael@13 | 237 | |
michael@13 | 238 | # find reasonable temporary directory |
michael@13 | 239 | tmpdir="${TMPDIR-/tmp}" |
michael@13 | 240 | |
michael@13 | 241 | # find reasonable safe program path |
michael@13 | 242 | test ".$PATH" = . && PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin" |
michael@13 | 243 | for dir in /usr/ccs/bin /usr/xpg4/bin; do |
michael@13 | 244 | test -d $dir && PATH="$PATH:$dir" |
michael@13 | 245 | done |
michael@13 | 246 | export PATH |
michael@13 | 247 | |
michael@13 | 248 | # make environment at least partly sane |
michael@13 | 249 | umask 022 |
michael@13 | 250 | unset ls rm mv cp sed grep awk >/dev/null 2>&1 || true |
michael@13 | 251 | |
michael@13 | 252 | ## |
michael@13 | 253 | ## execute the spec file manually by emulating |
michael@13 | 254 | ## the behaviour of the OpenPKG RPM tool. |
michael@13 | 255 | ## |
michael@13 | 256 | |
michael@13 | 257 | # create script prolog |
michael@13 | 258 | prolog="$tmpdir/openpkg.boot.prolog.sh" |
michael@13 | 259 | cp /dev/null $prolog |
michael@13 | 260 | ( |
michael@13 | 261 | echo "_specdir=`pwd`" |
michael@13 | 262 | echo "_sourcedir=$distdir" |
michael@13 | 263 | echo "_tmppath=$tmpdir" |
michael@13 | 264 | echo "_builddir=$tmpdir" |
michael@13 | 265 | echo "l_prefix=$prefix" |
michael@13 | 266 | echo "l_tag_fmt=\"$tag\"" |
michael@13 | 267 | echo "l_buildroot=$tmpdir/$name-$version-root" |
michael@13 | 268 | echo "l_susr=$susr" |
michael@13 | 269 | echo "l_sgrp=$sgrp" |
michael@13 | 270 | echo "l_musr=$musr" |
michael@13 | 271 | echo "l_mgrp=$mgrp" |
michael@13 | 272 | echo "l_rusr=$rusr" |
michael@13 | 273 | echo "l_rgrp=$rgrp" |
michael@13 | 274 | echo "l_nusr=$nusr" |
michael@13 | 275 | echo "l_ngrp=$ngrp" |
michael@13 | 276 | echo "l_suid=$suid" |
michael@13 | 277 | echo "l_sgid=$sgid" |
michael@13 | 278 | echo "l_muid=$muid" |
michael@13 | 279 | echo "l_mgid=$mgid" |
michael@13 | 280 | echo "l_ruid=$ruid" |
michael@13 | 281 | echo "l_rgid=$rgid" |
michael@13 | 282 | echo "l_nuid=$nuid" |
michael@13 | 283 | echo "l_ngid=$ngid" |
michael@13 | 284 | echo "use_tar=$use_tar" |
michael@13 | 285 | echo "use_make=$use_make" |
michael@13 | 286 | echo "use_cc=$use_cc" |
michael@13 | 287 | echo "use_ar=$use_ar" |
michael@13 | 288 | echo "use_ld=$use_ld" |
michael@13 | 289 | echo "use_as=$use_as" |
michael@13 | 290 | echo "use_strip=$use_strip" |
michael@13 | 291 | grep '%define' $spec | \ |
michael@13 | 292 | sed \ |
michael@13 | 293 | -e 's:^%define *\([^ ]*\) *\(.*\):\1="\2":' |
michael@13 | 294 | grep "^[A-Za-z0-9]*: *" $spec | \ |
michael@13 | 295 | sed \ |
michael@13 | 296 | -e 's;^\([A-Za-z0-9]*\): *\(.*\)$;\1="\2";' \ |
michael@13 | 297 | -e 's;^A;a;' -e 's;^B;b;' -e 's;^C;c;' -e 's;^D;d;' -e 's;^E;e;' \ |
michael@13 | 298 | -e 's;^F;f;' -e 's;^G;g;' -e 's;^H;h;' -e 's;^I;i;' -e 's;^J;j;' \ |
michael@13 | 299 | -e 's;^K;k;' -e 's;^L;l;' -e 's;^M;m;' -e 's;^N;n;' -e 's;^O;o;' \ |
michael@13 | 300 | -e 's;^P;p;' -e 's;^Q;q;' -e 's;^R;r;' -e 's;^S;s;' -e 's;^T;t;' \ |
michael@13 | 301 | -e 's;^U;u;' -e 's;^V;v;' -e 's;^W;w;' -e 's;^X;x;' -e 's;^Y;y;' \ |
michael@13 | 302 | -e 's;^Z;z;' -e 's;^buildRoot;buildroot;' |
michael@13 | 303 | echo "RPM_BUILD_ROOT=\"%{buildroot}\"" |
michael@13 | 304 | echo "RPM_BUILD_DIR=\"%{_builddir}\"" |
michael@13 | 305 | echo "RPM_SOURCE_DIR=\"$distdir\"" |
michael@13 | 306 | echo "export RPM_BUILD_ROOT" |
michael@13 | 307 | echo "export RPM_BUILD_DIR" |
michael@13 | 308 | echo "export RPM_SOURCE_DIR" |
michael@13 | 309 | echo "set -x" |
michael@13 | 310 | echo "umask 022" |
michael@13 | 311 | echo "cd \$RPM_BUILD_DIR" |
michael@13 | 312 | ) | sed -e 's;%{\([^}]*\)};${\1};g' >$prolog |
michael@13 | 313 | |
michael@13 | 314 | # install package via RPM spec file by faking a |
michael@13 | 315 | # sufficiently enough RPM run-time environment |
michael@13 | 316 | runscript () { |
michael@13 | 317 | step=$1 |
michael@13 | 318 | script="$tmpdir/openpkg.boot.$step.sh" |
michael@13 | 319 | echo ". $prolog" >$script |
michael@13 | 320 | sed -e "/^%$step/,/^%/ p" -e 'd' <$spec | \ |
michael@13 | 321 | sed -e '/^%/d' | \ |
michael@13 | 322 | sed -e 's;%{SOURCE \([^ ]*\.tar[^ ]*\)};${RPM_DIST_DIR}/\1;g' \ |
michael@13 | 323 | -e 's;%{SOURCE \([^ ]*\)};${RPM_SOURCE_DIR}/\1;g' | \ |
michael@13 | 324 | sed -e 's;%{[?]\([^:}]*\):\([^}]*\)};${\1+\2};g' \ |
michael@13 | 325 | -e 's;%{![?]\([^:}]*\):\([^}]*\)};${\1-\2};g' \ |
michael@13 | 326 | -e 's;%{[?]\([^:}]*\)};${\1+""};g' \ |
michael@13 | 327 | -e 's;%{![?]\([^:}]*\)};${\1-""};g' \ |
michael@13 | 328 | -e 's;%{\([^}]*\)};${\1};g' >>$script |
michael@13 | 329 | echo "++ executing(%$step): sh $script" |
michael@13 | 330 | sh $script |
michael@13 | 331 | if [ $? -ne 0 ]; then |
michael@13 | 332 | rm -f $script |
michael@13 | 333 | echo "$0:ERROR: script returned non-null value" |
michael@13 | 334 | exit 1 |
michael@13 | 335 | fi |
michael@13 | 336 | rm -f $script |
michael@13 | 337 | } |
michael@13 | 338 | runscript prep |
michael@13 | 339 | runscript build |
michael@13 | 340 | runscript install |
michael@13 | 341 | |
michael@13 | 342 | ## |
michael@13 | 343 | ## adjust build environment so that the installed |
michael@13 | 344 | ## "rpm" is actually useable, although it still resides in |
michael@13 | 345 | ## the temporary location instead of the real location. |
michael@13 | 346 | ## |
michael@13 | 347 | |
michael@13 | 348 | # suck in prolog in order to get variables from the spec file |
michael@13 | 349 | cwd=`pwd` |
michael@13 | 350 | . $prolog |
michael@13 | 351 | cd $cwd |
michael@13 | 352 | |
michael@13 | 353 | # suck in buildenv script in order to get musr/mgrp |
michael@13 | 354 | . $tmpdir/openpkg-*/.buildenv |
michael@13 | 355 | |
michael@13 | 356 | # create a custom "rpm" command |
michael@13 | 357 | echo "++ creating custom RPM command" |
michael@13 | 358 | rm -f $tmpdir/rpm >/dev/null 2>&1 |
michael@13 | 359 | rmdir $tmpdir/rpm >/dev/null 2>&1 |
michael@13 | 360 | if [ -d "$tmpdir/rpm" ]; then |
michael@13 | 361 | echo "$0:ERROR: directory $tmpdir/rpm exists, cannot create file with same name" |
michael@13 | 362 | exit 1 |
michael@13 | 363 | fi |
michael@13 | 364 | if [ -f "$tmpdir/rpm" ]; then |
michael@13 | 365 | echo "$0:ERROR: file $tmpdir/rpm exists, cannot override" |
michael@13 | 366 | exit 1 |
michael@13 | 367 | fi |
michael@13 | 368 | ( echo "#!/bin/sh" |
michael@13 | 369 | echo "exec $RPM_BUILD_ROOT$prefix/lib/openpkg/rpm \\" |
michael@13 | 370 | echo " --rcfile \"$tmpdir/rpm.1\" \\" |
michael@13 | 371 | echo " --define \"__platform $RPM_BUILD_ROOT$prefix/etc/openpkg/platform\" \\" |
michael@13 | 372 | echo " \"\$@\"" |
michael@13 | 373 | ) >$tmpdir/rpm |
michael@13 | 374 | chmod a+x $tmpdir/rpm |
michael@13 | 375 | |
michael@13 | 376 | # direct our own "rpm" tool to adjusted macro sets |
michael@13 | 377 | sed <`SOURCE rpmrc` >$tmpdir/rpm.1 \ |
michael@13 | 378 | -e "s;^\\(macrofiles:\\) .*;\\1 $tmpdir/rpm.2:$tmpdir/rpm.3;" |
michael@13 | 379 | |
michael@13 | 380 | # use an adjusted vendor macro set |
michael@13 | 381 | sed <$RPM_BUILD_ROOT$prefix/lib/openpkg/macros >$tmpdir/rpm.2 \ |
michael@13 | 382 | -e "s;$prefix;$RPM_BUILD_ROOT$prefix;g" |
michael@13 | 383 | |
michael@13 | 384 | # override the vendor macro set |
michael@13 | 385 | sed <`SOURCE rpmmacros` >$tmpdir/rpm.3 \ |
michael@13 | 386 | -e "s;@SUSR@;$susr;" \ |
michael@13 | 387 | -e "s;@SGRP@;$sgrp;" \ |
michael@13 | 388 | -e "s;@MUSR@;$musr;" \ |
michael@13 | 389 | -e "s;@MGRP@;$mgrp;" \ |
michael@13 | 390 | -e "s;@RUSR@;$rusr;" \ |
michael@13 | 391 | -e "s;@RGRP@;$rgrp;" \ |
michael@13 | 392 | -e "s;@NUSR@;$nusr;" \ |
michael@13 | 393 | -e "s;@NGRP@;$ngrp;" \ |
michael@13 | 394 | -e "s;@TAG@;$tag;" \ |
michael@13 | 395 | -e "s;\\(%{l_prefix}/lib/openpkg/rpmtool\\);%{l_bash} \\1;g" \ |
michael@13 | 396 | -e "s;@l_prefix_static@;$prefix;g" \ |
michael@13 | 397 | -e "s;@l_prefix@;$RPM_BUILD_ROOT$prefix;g" \ |
michael@13 | 398 | -e "s;%l_prefix\\([^_]\\);%l_prefix_INTERNAL\\1;g" \ |
michael@13 | 399 | -e "s;%{l_prefix};%{l_prefix_INTERNAL};g" \ |
michael@13 | 400 | -e "s;^\\(%_specdir *\\).*;\\1 `pwd`;" \ |
michael@13 | 401 | -e "s;^\\(%_sourcedir *\\).*;\\1 $distdir;" \ |
michael@13 | 402 | -e "s;^\\(%_builddir *\\).*;\\1 $tmpdir;" \ |
michael@13 | 403 | -e "s;^\\(%_tmppath *\\).*;\\1 $tmpdir;" \ |
michael@13 | 404 | -e "s;^\\(%_buildshell *\\).*;\\1 env -i OPENPKG_BOOT=1 %{l_build_shell_cmd} %{l_build_shell_opt};" \ |
michael@13 | 405 | -e "s;@l_build_path@;/bin:/sbin:/usr/bin:/usr/sbin;g" \ |
michael@13 | 406 | -e "s;@l_build_ldlp@;/usr/lib;g" \ |
michael@13 | 407 | -e "s;@l_build_ulim@;:;g" |
michael@13 | 408 | echo "%l_prefix $prefix" >>$tmpdir/rpm.3 |
michael@13 | 409 | |
michael@13 | 410 | # use an own $HOME/.popt in order to make sure the "rpm" |
michael@13 | 411 | # tool is able to execute its sub-tools "rpm<x>". |
michael@13 | 412 | V_rpm=`grep V_rpm $spec | sed -e 'q' | awk '{ printf("%s", $3); }'` |
michael@13 | 413 | sed <$RPM_BUILD_ROOT$prefix/lib/openpkg/rpmpopt >$tmpdir/.popt \ |
michael@13 | 414 | -e "s;^\\(rpm.*exec.*\\)\\(rpm[bdieukvq]*\\);\\1$RPM_BUILD_ROOT$prefix/lib/openpkg/\\2;" |
michael@13 | 415 | |
michael@13 | 416 | # activate the .popt file |
michael@13 | 417 | HOME=$tmpdir |
michael@13 | 418 | export HOME |
michael@13 | 419 | |
michael@13 | 420 | ## |
michael@13 | 421 | ## now initialize the RPM database under the temporary install location |
michael@13 | 422 | ## |
michael@13 | 423 | |
michael@13 | 424 | echo "++ initializing RPM database" |
michael@13 | 425 | $RPM_BUILD_ROOT$prefix/lib/openpkg/bash \ |
michael@13 | 426 | $RPM_BUILD_ROOT$prefix/lib/openpkg/rpmdb \ |
michael@13 | 427 | --prefix=$RPM_BUILD_ROOT$prefix \ |
michael@13 | 428 | --dbpath=$RPM_BUILD_ROOT$prefix/RPM/DB \ |
michael@13 | 429 | --rpm=$tmpdir/rpm \ |
michael@13 | 430 | --build --quiet |
michael@13 | 431 | |
michael@13 | 432 | ## |
michael@13 | 433 | ## now turn over and re-iterate over the RPM spec, but this time |
michael@13 | 434 | ## with the real RPM tool. |
michael@13 | 435 | ## |
michael@13 | 436 | |
michael@13 | 437 | echo "++ re-iterating over RPM specification procedures" |
michael@13 | 438 | $tmpdir/rpm -bb $spec |
michael@13 | 439 | |
michael@13 | 440 | ## |
michael@13 | 441 | ## and finally overwrite the installation again, but this time by |
michael@13 | 442 | ## installing officially through the "rpm" tool. This way we achieve |
michael@13 | 443 | ## that RPM is remembered as an RPM package in its own database. We |
michael@13 | 444 | ## just have to make sure the package is relocated while installing. |
michael@13 | 445 | ## For this we could use --prefix=$RPM_BUILD_ROOT$prefix, but this |
michael@13 | 446 | ## would create an incorrect filelist for "rpm" in the database. |
michael@13 | 447 | ## Instead we use the --justdb option which means "rpm" behaves as it |
michael@13 | 448 | ## would install into the real location, but does not actually install |
michael@13 | 449 | ## anything. But as a side-effect, the database is now correct. |
michael@13 | 450 | ## |
michael@13 | 451 | |
michael@13 | 452 | echo "++ overwriting RPM installation by installing via RPM itself" |
michael@13 | 453 | $tmpdir/rpm --install --justdb --force --noscripts --notriggers --ignoresize \ |
michael@13 | 454 | $RPM_BUILD_ROOT$prefix/RPM/PKG/openpkg-*.rpm |
michael@13 | 455 | |
michael@13 | 456 | ## Puhhhh!!! what a tricky bootstrapping procedure. But now we are |
michael@13 | 457 | ## mostly finished. All we finally have to do is to roll a bootstrap |
michael@13 | 458 | ## tarball in addition to the binary RPM and save the stuff in a |
michael@13 | 459 | ## permanent location. |
michael@13 | 460 | |
michael@13 | 461 | v="$version-$release" |
michael@13 | 462 | t="`$tmpdir/rpm --eval '%{l_platform -p}-%{l_tag}'`" |
michael@13 | 463 | |
michael@13 | 464 | # find a reasonable destination directory for packages |
michael@13 | 465 | if [ -d ../PKG/BIN ]; then |
michael@13 | 466 | dstdir=../PKG/BIN |
michael@13 | 467 | elif [ -d ../PKG ]; then |
michael@13 | 468 | dstdir=../PKG |
michael@13 | 469 | elif [ -d ../../PKG/BIN ]; then |
michael@13 | 470 | dstdir=../../PKG/BIN |
michael@13 | 471 | elif [ -d ../../PKG ]; then |
michael@13 | 472 | dstdir=../../PKG |
michael@13 | 473 | else |
michael@13 | 474 | dstdir=.. |
michael@13 | 475 | fi |
michael@13 | 476 | |
michael@13 | 477 | # create Source-RPM file |
michael@13 | 478 | echo "++ creating bootstrap source RPM file" |
michael@13 | 479 | $tmpdir/rpm -bs --nodeps $spec |
michael@13 | 480 | cp $RPM_BUILD_ROOT$prefix/RPM/PKG/openpkg-$v.src.rpm $dstdir/ |
michael@13 | 481 | rm -f $RPM_BUILD_ROOT$prefix/RPM/PKG/openpkg-$v.src.rpm |
michael@13 | 482 | |
michael@13 | 483 | # create Binary-RPM file |
michael@13 | 484 | echo "++ creating bootstrap binary RPM file" |
michael@13 | 485 | cp $RPM_BUILD_ROOT$prefix/RPM/PKG/openpkg-$v.$t.rpm $dstdir/ |
michael@13 | 486 | rm -f $RPM_BUILD_ROOT$prefix/RPM/PKG/openpkg-$v.$t.rpm |
michael@13 | 487 | |
michael@13 | 488 | # create Binary-Bootstrap file |
michael@13 | 489 | echo "++ creating bootstrap binary shell script" |
michael@13 | 490 | files=`cat $spec |\ |
michael@13 | 491 | sed -e '1,/%files/d' -e '/%clean/,$d' |\ |
michael@13 | 492 | grep -v '^ *$' | grep -v '%defattr' |\ |
michael@13 | 493 | sed -e 's;%config(noreplace) *;;' -e 's;%config *;;' -e 's;%ghost *;;' -e 's;%attr([^)]*) *;;' \ |
michael@13 | 494 | -e 's;%dir *;;' -e 's;%{l_prefix}/;;' -e 's;^ *;;' -e "s;%{V_rpm};${V_rpm};"` |
michael@13 | 495 | db_files="" |
michael@13 | 496 | for db_file in \ |
michael@13 | 497 | `$RPM_BUILD_ROOT$prefix/lib/openpkg/bash \ |
michael@13 | 498 | $RPM_BUILD_ROOT$prefix/lib/openpkg/rpmdb \ |
michael@13 | 499 | --prefix=$RPM_BUILD_ROOT$prefix \ |
michael@13 | 500 | --dbpath=$RPM_BUILD_ROOT$prefix/RPM/DB \ |
michael@13 | 501 | --list --quiet`; do |
michael@13 | 502 | db_files="$db_files RPM/DB/$db_file" |
michael@13 | 503 | done |
michael@13 | 504 | chmod 644 $RPM_BUILD_ROOT$prefix/RPM/DB/* |
michael@13 | 505 | files="$files $db_files" |
michael@13 | 506 | ( cd $RPM_BUILD_ROOT$prefix |
michael@13 | 507 | $RPM_BUILD_ROOT$prefix/lib/openpkg/tar --no-recursion -cf - $files |
michael@13 | 508 | ) | $RPM_BUILD_ROOT$prefix/lib/openpkg/bzip2 -9 \ |
michael@13 | 509 | >$RPM_BUILD_ROOT$prefix/openpkg.tar.bz2 |
michael@13 | 510 | cp -p $RPM_BUILD_ROOT$prefix/lib/openpkg/tar \ |
michael@13 | 511 | $RPM_BUILD_ROOT$prefix/openpkg.tar |
michael@13 | 512 | cp -p $RPM_BUILD_ROOT$prefix/lib/openpkg/bzip2 \ |
michael@13 | 513 | $RPM_BUILD_ROOT$prefix/openpkg.bzip2 |
michael@13 | 514 | l_platform=`$tmpdir/rpm --eval '%{l_platform -p}'` |
michael@13 | 515 | l_version=`$tmpdir/rpm -q --qf '%{version}' openpkg` |
michael@13 | 516 | release_sh=`SOURCE release.sh` |
michael@13 | 517 | l_release=`sh $release_sh -r "$l_version" -F "%t"` |
michael@13 | 518 | cat $spec |\ |
michael@13 | 519 | sed -e "/^%pre$/,/^%/ p" -e 'd' |\ |
michael@13 | 520 | sed -e '/^%/d' -e 's/^ //' |\ |
michael@13 | 521 | sed -e 's;%{[?]l_\([^:}]*\):\([^}]*\)};${\1+\2};g' \ |
michael@13 | 522 | -e 's;%{![?]l_\([^:}]*\):\([^}]*\)};${\1-\2};g' \ |
michael@13 | 523 | -e 's;%{[?]l_\([^:}]*\)};${\1+""};g' \ |
michael@13 | 524 | -e 's;%{![?]l_\([^:}]*\)};${\1-""};g' \ |
michael@13 | 525 | -e 's;%{l_\([^}]*\)};${\1};g' \ |
michael@13 | 526 | >$tmpdir/rpm.pre |
michael@13 | 527 | cat $spec |\ |
michael@13 | 528 | sed -e "/^%post$/,/^%/ p" -e 'd' |\ |
michael@13 | 529 | sed -e '/^%/d' -e 's/^ //' |\ |
michael@13 | 530 | sed -e 's;%{[?]l_\([^:}]*\):\([^}]*\)};${\1+\2};g' \ |
michael@13 | 531 | -e 's;%{![?]l_\([^:}]*\):\([^}]*\)};${\1-\2};g' \ |
michael@13 | 532 | -e 's;%{[?]l_\([^:}]*\)};${\1+""};g' \ |
michael@13 | 533 | -e 's;%{![?]l_\([^:}]*\)};${\1-""};g' \ |
michael@13 | 534 | -e 's;%{l_\([^}]*\)};${\1};g' \ |
michael@13 | 535 | >$tmpdir/rpm.post |
michael@13 | 536 | sed <`SOURCE aux.wrapbin.sh` \ |
michael@13 | 537 | -e "s;@SUSR@;$susr;" -e "s;@SGRP@;$sgrp;" \ |
michael@13 | 538 | -e "s;@MUSR@;$musr;" -e "s;@MGRP@;$mgrp;" \ |
michael@13 | 539 | -e "s;@RUSR@;$rusr;" -e "s;@RGRP@;$rgrp;" \ |
michael@13 | 540 | -e "s;@NUSR@;$nusr;" -e "s;@NGRP@;$ngrp;" \ |
michael@13 | 541 | -e "s;@SUID@;$suid;" -e "s;@SGID@;$sgid;" \ |
michael@13 | 542 | -e "s;@MUID@;$muid;" -e "s;@MGID@;$mgid;" \ |
michael@13 | 543 | -e "s;@RUID@;$ruid;" -e "s;@RGID@;$rgid;" \ |
michael@13 | 544 | -e "s;@NUID@;$nuid;" -e "s;@NGID@;$ngid;" \ |
michael@13 | 545 | -e "s;@l_prefix@;$prefix;" \ |
michael@13 | 546 | -e "s;@l_platform@;$l_platform;" \ |
michael@13 | 547 | -e "s;@l_release@;$l_release;" \ |
michael@13 | 548 | -e "s;@l_version@;$l_version;" \ |
michael@13 | 549 | -e "/^@PRE@/r $tmpdir/rpm.pre" \ |
michael@13 | 550 | -e "/^@POST@/r $tmpdir/rpm.post" |\ |
michael@13 | 551 | sed -e '/^@PRE@/d' -e '/^@POST@/d' >$tmpdir/openpkg.boot.tmp |
michael@13 | 552 | echo . | awk '{ |
michael@13 | 553 | for (i = 0; i < 8192; i++) { |
michael@13 | 554 | printf(" "); |
michael@13 | 555 | } |
michael@13 | 556 | }' >>$tmpdir/openpkg.boot.tmp |
michael@13 | 557 | rm -f $dstdir/openpkg-$v.$t.sh |
michael@13 | 558 | dd if=$tmpdir/openpkg.boot.tmp bs=8192 count=8 \ |
michael@13 | 559 | of=$dstdir/openpkg-$v.$t.sh 2>/dev/null |
michael@13 | 560 | rm -f $tmpdir/openpkg.boot.tmp |
michael@13 | 561 | ( cd $RPM_BUILD_ROOT$prefix |
michael@13 | 562 | $RPM_BUILD_ROOT$prefix/lib/openpkg/tar --no-recursion -cf - \ |
michael@13 | 563 | openpkg.tar openpkg.bzip2 openpkg.tar.bz2 |
michael@13 | 564 | ) >>$dstdir/openpkg-$v.$t.sh |
michael@13 | 565 | |
michael@13 | 566 | # cleanup |
michael@13 | 567 | echo "++ cleaning up" |
michael@13 | 568 | cp `SOURCE rpmtool` $tmpdir/rpmtool |
michael@13 | 569 | rm -rf $RPM_BUILD_ROOT |
michael@13 | 570 | rm -rf $tmpdir/$name-$version |
michael@13 | 571 | rm -f $tmpdir/rpm $tmpdir/rpm.[123] $tmpdir/.popt $tmpdir/rpm.pre $tmpdir/rpm.post |
michael@13 | 572 | rm -f $prolog |
michael@13 | 573 | |
michael@13 | 574 | # final hint about results |
michael@13 | 575 | echo "++ resulting OpenPKG bootstrap package files:" |
michael@13 | 576 | (cd $dstdir; ls -l openpkg-$v.$t.sh openpkg-$v.$t.rpm openpkg-$v.src.rpm) |
michael@13 | 577 | set +x |
michael@13 | 578 | ( echo "You have successfully built the OpenPKG Package from scratch" |
michael@13 | 579 | echo "for prefix $prefix on target platform $l_platform. The input" |
michael@13 | 580 | echo "was the OpenPKG Source Bootstrap Package in file:" |
michael@13 | 581 | echo "" |
michael@13 | 582 | echo " openpkg-$v.src.sh" |
michael@13 | 583 | echo "" |
michael@13 | 584 | echo "The results are the following three files:" |
michael@13 | 585 | echo "" |
michael@13 | 586 | echo " openpkg-$v.src.rpm" |
michael@13 | 587 | echo " openpkg-$v.$t.rpm" |
michael@13 | 588 | echo " openpkg-$v.$t.sh" |
michael@13 | 589 | echo "" |
michael@13 | 590 | echo "The first result file is the OpenPKG Source RPM Package," |
michael@13 | 591 | echo "containing just the same contents than the OpenPKG Source" |
michael@13 | 592 | echo "Bootstrap Package, but now in RPM format. Optionally use this" |
michael@13 | 593 | echo "after the installation of the OpenPKG Binary Bootstrap Package" |
michael@13 | 594 | echo "if you want to rebuild from source again (but then with RPM" |
michael@13 | 595 | echo "available)." |
michael@13 | 596 | echo "" |
michael@13 | 597 | echo "The second result file is the OpenPKG Binary RPM Package," |
michael@13 | 598 | echo "containing the installation files in RPM format for the OpenPKG" |
michael@13 | 599 | echo "instance $prefix. Optionally use this after the installation of" |
michael@13 | 600 | echo "the OpenPKG Binary Bootstrap Package if you want (usually for" |
michael@13 | 601 | echo "fixing something) to reinstall (but then with RPM available)." |
michael@13 | 602 | echo "" |
michael@13 | 603 | echo "The third result file is the OpenPKG Binary Bootstrap Package," |
michael@13 | 604 | echo "containing the installation files as a self-extracting shell" |
michael@13 | 605 | echo "script for the OpenPKG instance $prefix. Use this in YOUR NEXT" |
michael@13 | 606 | echo "STEP to initially create the OpenPKG instance from scratch." |
michael@13 | 607 | echo "Hence, proceed now by running the following command:" |
michael@13 | 608 | echo "" |
michael@13 | 609 | cusr=`(id -un) 2>/dev/null ||\ |
michael@13 | 610 | (id | sed -e 's;^[^(]*(\([^)]*\)).*;\1;') 2>/dev/null ||\ |
michael@13 | 611 | (whoami) 2>/dev/null ||\ |
michael@13 | 612 | (who am i | cut "-d " -f1) 2>/dev/null ||\ |
michael@13 | 613 | echo $LOGNAME` |
michael@13 | 614 | if [ ".$musr.$rusr.$nusr" = ".$cusr.$cusr.$cusr" -o ".$cusr" = ".root" ]; then |
michael@13 | 615 | echo " \$ sh openpkg-$v.$t.sh" |
michael@13 | 616 | else |
michael@13 | 617 | echo " \$ su root -c \"sh openpkg-$v.$t.sh\"" |
michael@13 | 618 | fi |
michael@13 | 619 | ) | sh $tmpdir/rpmtool msg -b -t info |
michael@13 | 620 | rm -f $tmpdir/rpmtool |
michael@13 | 621 |