openpkg/stack.sh

changeset 428
f880f219c566
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/openpkg/stack.sh	Tue Jul 31 12:23:42 2012 +0200
     1.3 @@ -0,0 +1,967 @@
     1.4 +##
     1.5 +##  OpenPKG Software Stack Generation
     1.6 +##  Copyright (c) 2010-2012 OpenPKG GmbH <http://openpkg.com/>
     1.7 +##
     1.8 +##  This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
     1.9 +##  All rights reserved. Licenses which grant limited permission to use,
    1.10 +##  copy, modify and distribute this software are available from the
    1.11 +##  OpenPKG GmbH.
    1.12 +##
    1.13 +##  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
    1.14 +##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    1.15 +##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    1.16 +##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    1.17 +##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    1.18 +##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    1.19 +##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    1.20 +##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    1.21 +##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    1.22 +##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    1.23 +##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    1.24 +##  SUCH DAMAGE.
    1.25 +##
    1.26 +
    1.27 +#   configuration
    1.28 +openpkg="${OPENPKG_PREFIX}/bin/openpkg"
    1.29 +curl="${OPENPKG_PREFIX}/bin/openpkg curl"
    1.30 +shtool="${OPENPKG_PREFIX}/lib/openpkg/shtool"
    1.31 +
    1.32 +##
    1.33 +##  COMMAND LINE PARSING
    1.34 +##
    1.35 +
    1.36 +str_usage="[-h|--help] [-v|--verbose <level>] [-o|--output <dir>] [-D|--define <name>=<value> ...] [-u|--unversioned] [-q|--query] <name>.stk"
    1.37 +arg_spec="1="
    1.38 +opt_spec="h.v:o:D+u.q."
    1.39 +opt_alias="h:help,v:verbose,o:output,D:define,u:unversioned,q:query"
    1.40 +opt_h=no
    1.41 +opt_v=4
    1.42 +opt_o="."
    1.43 +opt_D=""
    1.44 +opt_u=no
    1.45 +opt_q=no
    1.46 +
    1.47 +#   parse argument specification string
    1.48 +eval `echo $arg_spec |\
    1.49 +      sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
    1.50 +
    1.51 +#   parse option specification string
    1.52 +eval `echo $opt_spec |\
    1.53 +      sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
    1.54 +
    1.55 +#   parse option alias string
    1.56 +eval `echo $opt_alias |\
    1.57 +      sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`
    1.58 +
    1.59 +#   interate over argument line
    1.60 +opt_PREV=''
    1.61 +while [ $# -gt 0 ]; do
    1.62 +    #   special option stops processing
    1.63 +    if [ ".$1" = ".--" ]; then
    1.64 +        shift
    1.65 +        break
    1.66 +    fi
    1.67 +
    1.68 +    #   determine option and argument
    1.69 +    opt_ARG_OK=no
    1.70 +    if [ ".$opt_PREV" != . ]; then
    1.71 +        #   merge previous seen option with argument
    1.72 +        opt_OPT="$opt_PREV"
    1.73 +        opt_ARG="$1"
    1.74 +        opt_ARG_OK=yes
    1.75 +        opt_PREV=''
    1.76 +    else
    1.77 +        #   split argument into option and argument
    1.78 +        case "$1" in
    1.79 +            --[a-zA-Z0-9]*=*)
    1.80 +                eval `echo "x$1" |\
    1.81 +                      sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`
    1.82 +                opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
    1.83 +                eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
    1.84 +                ;;
    1.85 +            --[a-zA-Z0-9]*)
    1.86 +                opt_OPT=`echo "x$1" | cut -c4-`
    1.87 +                opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
    1.88 +                eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
    1.89 +                opt_ARG=''
    1.90 +                ;;
    1.91 +            -[a-zA-Z0-9]*)
    1.92 +                eval `echo "x$1" |\
    1.93 +                      sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
    1.94 +                          -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
    1.95 +                ;;
    1.96 +            -[a-zA-Z0-9])
    1.97 +                opt_OPT=`echo "x$1" | cut -c3-`
    1.98 +                opt_ARG=''
    1.99 +                ;;
   1.100 +            *)
   1.101 +                break
   1.102 +                ;;
   1.103 +        esac
   1.104 +    fi
   1.105 +
   1.106 +    #   eat up option
   1.107 +    shift
   1.108 +
   1.109 +    #   determine whether option needs an argument
   1.110 +    eval "opt_MODE=\$opt_MODE_${opt_OPT}"
   1.111 +    if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then
   1.112 +        if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then
   1.113 +            opt_PREV="$opt_OPT"
   1.114 +            continue
   1.115 +        fi
   1.116 +    fi
   1.117 +
   1.118 +    #   process option
   1.119 +    case $opt_MODE in
   1.120 +        '.' )
   1.121 +            #   boolean option
   1.122 +            eval "opt_${opt_OPT}=yes"
   1.123 +            ;;
   1.124 +        ':' )
   1.125 +            #   option with argument (multiple occurances override)
   1.126 +            eval "opt_${opt_OPT}=\"\$opt_ARG\""
   1.127 +            ;;
   1.128 +        '+' )
   1.129 +            #   option with argument (multiple occurances append)
   1.130 +            eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\""
   1.131 +            ;;
   1.132 +        * )
   1.133 +            echo "$0: ERROR: unknown option: \`$opt_OPT'" 1>&2
   1.134 +            exit 1
   1.135 +            ;;
   1.136 +    esac
   1.137 +done
   1.138 +if [ ".$opt_PREV" != . ]; then
   1.139 +    echo "$0: ERROR: missing argument to option \`$opt_PREV'" 1>&2
   1.140 +    exit 1
   1.141 +fi
   1.142 +
   1.143 +#   process help option
   1.144 +if [ ".$opt_h" = .yes ]; then
   1.145 +    echo "Usage: $0 $str_usage"
   1.146 +    exit 0
   1.147 +fi
   1.148 +
   1.149 +#   complain about incorrect number of arguments
   1.150 +case $arg_MODE in
   1.151 +    '=' )
   1.152 +        if [ $# -ne $arg_NUMS ]; then
   1.153 +            echo "$0: ERROR: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
   1.154 +            exit 1
   1.155 +        fi
   1.156 +        ;;
   1.157 +    '+' )
   1.158 +        if [ $# -lt $arg_NUMS ]; then
   1.159 +            echo "$0: ERROR: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
   1.160 +            exit 1
   1.161 +        fi
   1.162 +        ;;
   1.163 +esac
   1.164 +
   1.165 +##
   1.166 +##  HELPER FUNCTIONS
   1.167 +##
   1.168 +
   1.169 +#   helper function for graceful termination
   1.170 +die () {
   1.171 +    echo "$0: ERROR: $*"
   1.172 +    exit 1
   1.173 +}
   1.174 +
   1.175 +#   helper function for verbose messages
   1.176 +verbose () {
   1.177 +    lvl="$1"
   1.178 +    msg="$2"
   1.179 +    if [ $opt_v -ge $lvl ]; then
   1.180 +        case "$lvl" in
   1.181 +            1 ) str_prefix="**" ;;
   1.182 +            2 ) str_prefix="++" ;;
   1.183 +            3 ) str_prefix="--" ;;
   1.184 +            4 ) str_prefix=".." ;;
   1.185 +        esac
   1.186 +        echo "${str_prefix} ${msg}"
   1.187 +    fi
   1.188 +}
   1.189 +
   1.190 +#   expand macros
   1.191 +macro_expand () {
   1.192 +    stk="$1"
   1.193 +
   1.194 +    #   load all options and their default values
   1.195 +    options=""
   1.196 +    for option in `sed <$stk \
   1.197 +        -e "1,/^%options/d" -e '/^%/,$d' \
   1.198 +        -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' \
   1.199 +        -e 's; *[^ ]*$;;'`; do
   1.200 +        options="$options $option"
   1.201 +    done
   1.202 +    eval `sed <$stk \
   1.203 +        -e "1,/^%options/d" -e '/^%/,$d' \
   1.204 +        -e 's/#.*$//' -e 's/^ *//' -e '/^ *$/d' \
   1.205 +        -e 's:^\([^ ]*\) *\([^ ]*\)$:option_\1="\2";:'`
   1.206 +
   1.207 +    #   override options with defined values
   1.208 +    for define in $opt_D; do
   1.209 +        name=`echo "$define" | sed -e 's;=.*$;;'`
   1.210 +        value=`echo "$define" | sed -e 's;^.*=;;'`
   1.211 +        eval "exists=\"\${option_${name}}\""
   1.212 +        if [ ".$exists" = . ]; then
   1.213 +            die "definition of not-existing option \"$name\""
   1.214 +        fi
   1.215 +        eval "option_${name}=\"${value}\""
   1.216 +    done
   1.217 +
   1.218 +    #   expand macros
   1.219 +    cmd="sed"
   1.220 +    for name in $options; do
   1.221 +        eval "value=\"\${option_${name}}\""
   1.222 +        cmd="$cmd -e 's;%{[?]$name:\\([^}]*\\)};\1;g'"
   1.223 +        cmd="$cmd -e 's;%{![?]$name:\\([^}]*\\)};;g'"
   1.224 +        cmd="$cmd -e 's;%{$name};$value;g'"
   1.225 +    done
   1.226 +    cmd="$cmd -e 's;%{[?][^:}]*:[^}]*};;g'"
   1.227 +    cmd="$cmd -e 's;%{![?][^:}]*:\([^}]*\)};\1;g'"
   1.228 +    eval "$cmd"
   1.229 +}
   1.230 +
   1.231 +#   extract macro-expanded header
   1.232 +header () {
   1.233 +    stk="$1"
   1.234 +    hdr="$2"
   1.235 +    exists=`egrep "^${hdr}" $stk`
   1.236 +    if [ ".$exists" != . ]; then
   1.237 +        egrep "^${hdr}:" $stk | \
   1.238 +        sed -e 's;^[^:]*: *;;' -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' | \
   1.239 +        macro_expand "$stk"
   1.240 +    fi
   1.241 +}
   1.242 +
   1.243 +#   extract macro-expanded section
   1.244 +section () {
   1.245 +    stk="$1"
   1.246 +    sec="$2"
   1.247 +    exists=`egrep "^%${sec}" $stk`
   1.248 +    if [ ".$exists" != . ]; then
   1.249 +        sed <$stk \
   1.250 +            -e "1,/^%${sec}/d" -e '/^%/,$d' \
   1.251 +            -e 's/#.*$//' -e 's/^ *//' -e 's/ *$//' -e '/^ *$/d' | \
   1.252 +        macro_expand "$stk"
   1.253 +    fi
   1.254 +}
   1.255 +
   1.256 +##
   1.257 +##  MAIN
   1.258 +##
   1.259 +
   1.260 +#   determine stack file
   1.261 +stk="$1"
   1.262 +shift
   1.263 +
   1.264 +#   support stand-alone query operation
   1.265 +if [ ".$opt_q" = .yes ]; then
   1.266 +    name=`header "$stk" "Name"`
   1.267 +    summary=`header "$stk" "Summary"`
   1.268 +    packager=`header "$stk" "Packager"`
   1.269 +    version=`header "$stk" "Version"`
   1.270 +    release=`header "$stk" "Release"`
   1.271 +    echo "name=\"$name\";"
   1.272 +    echo "summary=\"$summary\";"
   1.273 +    echo "packager=\"$packager\";"
   1.274 +    echo "version=\"$version\";"
   1.275 +    echo "release=\"$release\";"
   1.276 +    sed <$stk \
   1.277 +        -e "1,/^%options/d" -e '/^%/,$d' \
   1.278 +        -e 's/#.*$//' -e 's/^ *//' -e '/^ *$/d' \
   1.279 +        -e 's:^\([^ ]*\) *\([^ ]*\)$:\1="\2";:'
   1.280 +    exit 0
   1.281 +fi
   1.282 +
   1.283 +#   determine temporary directory
   1.284 +tmpdir="${TMPDIR-/tmp}"
   1.285 +
   1.286 +#   provide verbose header
   1.287 +verbose 1 "OpenPKG Software Stack Generation"
   1.288 +
   1.289 +#   determine information
   1.290 +verbose 2 "determining software stack information"
   1.291 +name=`header "$stk" "Name"`
   1.292 +summary=`header "$stk" "Summary"`
   1.293 +packager=`header "$stk" "Packager"`
   1.294 +version=`header "$stk" "Version"`
   1.295 +release=`header "$stk" "Release"`
   1.296 +verbose 3 "Name:        $name"
   1.297 +verbose 3 "Summary:     $summary"
   1.298 +verbose 3 "Packager:    $packager"
   1.299 +verbose 3 "Version:     $version"
   1.300 +verbose 3 "Release:     $release"
   1.301 +if [ ".$opt_u" = .yes ]; then
   1.302 +    basename="$name"
   1.303 +else
   1.304 +    basename="$name-$version-$release"
   1.305 +fi
   1.306 +
   1.307 +#   determine URLs
   1.308 +verbose 2 "determining software stack packages"
   1.309 +repo=`section "$stk" "repository"`
   1.310 +verbose 3 "repository:  [URL]  $repo"
   1.311 +$openpkg build -r "$repo" -Z -u -K -B \
   1.312 +    `section "$stk" "packages"` | \
   1.313 +    egrep "openpkg curl" | \
   1.314 +    sed -e 's;^.* \([^ ]*\) || exit.*$;\1;' \
   1.315 +        -e '/\/openpkg-[0-9].*\.src\.rpm/{h;s/\.src\.rpm$/.src.sh/;p;x}' \
   1.316 +    >$tmpdir/url.txt
   1.317 +
   1.318 +#   provide header
   1.319 +verbose 2 "assembling software stack sources"
   1.320 +
   1.321 +#   download source packages
   1.322 +if [ ! -d "$opt_o/$basename.src.d" ]; then
   1.323 +    verbose 3 "creating:    [DIR]  $opt_o/$basename.src.d"
   1.324 +    $shtool mkdir -p -m 755 "$opt_o/$basename.src.d"
   1.325 +else
   1.326 +    verbose 3 "reusing:     [DIR]  $opt_o/$basename.src.d"
   1.327 +fi
   1.328 +for url in `cat $tmpdir/url.txt`; do
   1.329 +    url_file=`echo $url | sed -e 's;^.*/\([^/]*\)$;\1;'`
   1.330 +    if [ ! -f "$opt_o/$basename.src.d/$url_file" ]; then
   1.331 +        verbose 3 "downloading: [FILE] $opt_o/$basename.src.d/$url_file"
   1.332 +        if [ $opt_v -ge 4 ]; then
   1.333 +            $curl '-#' -L -k -o $opt_o/$basename.src.d/$url_file $url
   1.334 +        else
   1.335 +            $curl -s -L -k -o $opt_o/$basename.src.d/$url_file $url
   1.336 +        fi
   1.337 +    else
   1.338 +        verbose 3 "reusing:     [FILE] $opt_o/$basename.src.d/$url_file"
   1.339 +    fi
   1.340 +done
   1.341 +for path in $opt_o/$basename.src.d/*.src.sh $opt_o/$basename.src.d/*.src.rpm; do
   1.342 +    if [ ! -f "$path" ]; then
   1.343 +        continue
   1.344 +    fi
   1.345 +    path_file=`echo $path | sed -e 's;^.*/\([^/]*\)$;\1;'`
   1.346 +    found=no
   1.347 +    for url in `cat $tmpdir/url.txt`; do
   1.348 +        url_file=`echo $url | sed -e 's;^.*/\([^/]*\)$;\1;'`
   1.349 +        if [ ".$url_file" = ".$path_file" ]; then
   1.350 +            found=yes
   1.351 +            break
   1.352 +        fi
   1.353 +    done
   1.354 +    if [ ".$found" = .no ]; then
   1.355 +        verbose 3 "removing:    [FILE] $path"
   1.356 +        rm -f "$path"
   1.357 +    fi
   1.358 +done
   1.359 +rm -f $tmpdir/url.txt
   1.360 +
   1.361 +#   generate XML/RDF index for SRPM packages
   1.362 +verbose 3 "generating:  [FILE] $opt_o/$basename.src.d/00INDEX.rdf"
   1.363 +$openpkg index -r "OpenPKG/SRPM" \
   1.364 +    -o $opt_o/$basename.src.d/00INDEX.rdf \
   1.365 +    -i $opt_o/$basename.src.d
   1.366 +
   1.367 +#   generate deployment utility
   1.368 +verbose 3 "generating:  [FILE] $opt_o/$basename.sh"; \
   1.369 +section "$stk" "framework" >$tmpdir/framework.txt
   1.370 +section "$stk" "prolog" >$tmpdir/prolog.txt
   1.371 +section "$stk" "epilog" >$tmpdir/epilog.txt
   1.372 +HAVE_PROLOG=no; if [ ".`cat $tmpdir/prolog.txt`" != . ]; then HAVE_PROLOG=yes; fi
   1.373 +HAVE_EPILOG=no; if [ ".`cat $tmpdir/epilog.txt`" != . ]; then HAVE_EPILOG=yes; fi
   1.374 +$openpkg build -r "$repo" -Z -u -K \
   1.375 +    `section "$stk" "packages"` | \
   1.376 +grep -v "^#" | \
   1.377 +grep -v "^echo" | \
   1.378 +grep -v "^rm" | \
   1.379 +egrep -v "^(if|fi)" | \
   1.380 +grep -v "openpkg curl" | \
   1.381 +grep -v "openpkg rpm -Uvh" | \
   1.382 +sed -e 's;.*openpkg rpm ;;' \
   1.383 +    -e 's; || exit.*;;' \
   1.384 +    -e 's;--rebuild ;;' \
   1.385 +    -e 's;/.*/\([^/]*\.src\.rpm\);\1;' \
   1.386 +    -e 's;^\(.*\) \([^/]*\.src\.rpm\);\2 \1;' \
   1.387 +    -e "s;--define '\\([^ ]*\\) \\([^ ]*\\)';\\1=\\2;g" \
   1.388 +    -e 's;\.src\.rpm;;' \
   1.389 +    >$tmpdir/packages.txt
   1.390 +sed <$0 \
   1.391 +    -e '1,/^____/d' \
   1.392 +    -e "/^CFG_FRAMEWORK=\"/r $tmpdir/framework.txt" \
   1.393 +    -e "/^CFG_PACKAGES=\"/r $tmpdir/packages.txt" \
   1.394 +    -e "s;@HAVE_PROLOG@;$HAVE_PROLOG;" \
   1.395 +    -e "/%prolog/r $tmpdir/prolog.txt" \
   1.396 +    -e "s;@HAVE_EPILOG@;$HAVE_EPILOG;" \
   1.397 +    -e "/%epilog/r $tmpdir/epilog.txt" \
   1.398 +    -e "/^## SHTOOL ##/r $shtool" \
   1.399 +    -e "s;^\\(CFG_NAME=\"\\).*\\(\"\\);\\1$name\\2;" \
   1.400 +    -e "s;^\\(CFG_SUMMARY=\"\\).*\\(\"\\);\\1$summary\\2;" \
   1.401 +    -e "s;^\\(CFG_PACKAGER=\"\\).*\\(\"\\);\\1$packager\\2;" \
   1.402 +    -e "s;^\\(CFG_VERSION=\"\\).*\\(\"\\);\\1$version\\2;" \
   1.403 +    -e "s;^\\(CFG_RELEASE=\"\\).*\\(\"\\);\\1$release\\2;" \
   1.404 +    -e "s;^\\(CFG_UNVERSIONED=\"\\).*\\(\"\\);\\1$opt_u\\2;" \
   1.405 +    >$opt_o/$basename.sh
   1.406 +
   1.407 +#   cleanup
   1.408 +rm -f $tmpdir/framework.txt
   1.409 +rm -f $tmpdir/packages.txt
   1.410 +rm -f $tmpdir/prolog.txt
   1.411 +rm -f $tmpdir/epilog.txt
   1.412 +
   1.413 +#   exit gracefully
   1.414 +exit 0
   1.415 +
   1.416 +##
   1.417 +##  DEPLOYMENT SCRIPT
   1.418 +##
   1.419 +
   1.420 +______________________________________________________________________________
   1.421 +#!/bin/sh
   1.422 +#![OpenPKG]
   1.423 +##
   1.424 +##  OpenPKG Software Stack Deployment
   1.425 +##  Copyright (c) 2010-2012 OpenPKG GmbH <http://openpkg.com/>
   1.426 +##
   1.427 +##  This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
   1.428 +##  All rights reserved. Licenses which grant limited permission to use,
   1.429 +##  copy, modify and distribute this software are available from the
   1.430 +##  OpenPKG GmbH.
   1.431 +##
   1.432 +##  THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
   1.433 +##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   1.434 +##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   1.435 +##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
   1.436 +##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   1.437 +##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   1.438 +##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   1.439 +##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   1.440 +##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   1.441 +##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   1.442 +##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   1.443 +##  SUCH DAMAGE.
   1.444 +##
   1.445 +
   1.446 +##
   1.447 +##  COMMAND LINE PARSING
   1.448 +##
   1.449 +
   1.450 +str_usage="[-h|--help] [-v|--verbose <level>] [-c|--cleanup <level>] [-D|--define <name>=<value> ...] [-s|--srcdir <dir>] [-o|--outdir <dir>] [-t|--tmpdir <dir>] [-S <sudo>]"
   1.451 +arg_spec="0="
   1.452 +opt_spec="h.v:c:D+s:o:t:S:"
   1.453 +opt_alias="h:help,v:verbose,c:cleanup,D:define,s:srcdir,o:outdir,t:tmpdir,S:sudo"
   1.454 +opt_h=no
   1.455 +opt_v=3
   1.456 +opt_c=1
   1.457 +opt_D=""
   1.458 +opt_s=""
   1.459 +opt_o=""
   1.460 +opt_t="${TMPDIR-/tmp}"
   1.461 +opt_S=""
   1.462 +
   1.463 +#   parse argument specification string
   1.464 +eval `echo $arg_spec |\
   1.465 +      sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
   1.466 +
   1.467 +#   parse option specification string
   1.468 +eval `echo $opt_spec |\
   1.469 +      sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
   1.470 +
   1.471 +#   parse option alias string
   1.472 +eval `echo $opt_alias |\
   1.473 +      sed -e 's/-/_/g' -e 's/\([a-zA-Z0-9]\):\([^,]*\),*/opt_ALIAS_\2=\1;/g'`
   1.474 +
   1.475 +#   interate over argument line
   1.476 +opt_PREV=''
   1.477 +while [ $# -gt 0 ]; do
   1.478 +    #   special option stops processing
   1.479 +    if [ ".$1" = ".--" ]; then
   1.480 +        shift
   1.481 +        break
   1.482 +    fi
   1.483 +
   1.484 +    #   determine option and argument
   1.485 +    opt_ARG_OK=no
   1.486 +    if [ ".$opt_PREV" != . ]; then
   1.487 +        #   merge previous seen option with argument
   1.488 +        opt_OPT="$opt_PREV"
   1.489 +        opt_ARG="$1"
   1.490 +        opt_ARG_OK=yes
   1.491 +        opt_PREV=''
   1.492 +    else
   1.493 +        #   split argument into option and argument
   1.494 +        case "$1" in
   1.495 +            --[a-zA-Z0-9]*=*)
   1.496 +                eval `echo "x$1" |\
   1.497 +                      sed -e 's/^x--\([a-zA-Z0-9-]*\)=\(.*\)$/opt_OPT="\1";opt_ARG="\2"/'`
   1.498 +                opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
   1.499 +                eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
   1.500 +                ;;
   1.501 +            --[a-zA-Z0-9]*)
   1.502 +                opt_OPT=`echo "x$1" | cut -c4-`
   1.503 +                opt_STR=`echo $opt_OPT | sed -e 's/-/_/g'`
   1.504 +                eval "opt_OPT=\${opt_ALIAS_${opt_STR}-${opt_OPT}}"
   1.505 +                opt_ARG=''
   1.506 +                ;;
   1.507 +            -[a-zA-Z0-9]*)
   1.508 +                eval `echo "x$1" |\
   1.509 +                      sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
   1.510 +                          -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
   1.511 +                ;;
   1.512 +            -[a-zA-Z0-9])
   1.513 +                opt_OPT=`echo "x$1" | cut -c3-`
   1.514 +                opt_ARG=''
   1.515 +                ;;
   1.516 +            *)
   1.517 +                break
   1.518 +                ;;
   1.519 +        esac
   1.520 +    fi
   1.521 +
   1.522 +    #   eat up option
   1.523 +    shift
   1.524 +
   1.525 +    #   determine whether option needs an argument
   1.526 +    eval "opt_MODE=\$opt_MODE_${opt_OPT}"
   1.527 +    if [ ".$opt_ARG" = . ] && [ ".$opt_ARG_OK" != .yes ]; then
   1.528 +        if [ ".$opt_MODE" = ".:" ] || [ ".$opt_MODE" = ".+" ]; then
   1.529 +            opt_PREV="$opt_OPT"
   1.530 +            continue
   1.531 +        fi
   1.532 +    fi
   1.533 +
   1.534 +    #   process option
   1.535 +    case $opt_MODE in
   1.536 +        '.' )
   1.537 +            #   boolean option
   1.538 +            eval "opt_${opt_OPT}=yes"
   1.539 +            ;;
   1.540 +        ':' )
   1.541 +            #   option with argument (multiple occurances override)
   1.542 +            eval "opt_${opt_OPT}=\"\$opt_ARG\""
   1.543 +            ;;
   1.544 +        '+' )
   1.545 +            #   option with argument (multiple occurances append)
   1.546 +            eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\""
   1.547 +            ;;
   1.548 +        * )
   1.549 +            echo "$0: ERROR: unknown option: \`$opt_OPT'" 1>&2
   1.550 +            exit 1
   1.551 +            ;;
   1.552 +    esac
   1.553 +done
   1.554 +if [ ".$opt_PREV" != . ]; then
   1.555 +    echo "$0: ERROR: missing argument to option \`$opt_PREV'" 1>&2
   1.556 +    exit 1
   1.557 +fi
   1.558 +
   1.559 +#   process help option
   1.560 +if [ ".$opt_h" = .yes ]; then
   1.561 +    echo "Usage: $0 $str_usage"
   1.562 +    exit 0
   1.563 +fi
   1.564 +
   1.565 +#   complain about incorrect number of arguments
   1.566 +case $arg_MODE in
   1.567 +    '=' )
   1.568 +        if [ $# -ne $arg_NUMS ]; then
   1.569 +            echo "$0: ERROR: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
   1.570 +            exit 1
   1.571 +        fi
   1.572 +        ;;
   1.573 +    '+' )
   1.574 +        if [ $# -lt $arg_NUMS ]; then
   1.575 +            echo "$0: ERROR: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
   1.576 +            exit 1
   1.577 +        fi
   1.578 +        ;;
   1.579 +esac
   1.580 +
   1.581 +#   helper function for verbose messages
   1.582 +verbose () {
   1.583 +    lvl="$1"
   1.584 +    msg="$2"
   1.585 +    if [ $opt_v -ge $lvl ]; then
   1.586 +        case "$lvl" in
   1.587 +            1 ) str_prefix="**" ;;
   1.588 +            2 ) str_prefix="++" ;;
   1.589 +            3 ) str_prefix="--" ;;
   1.590 +            4 ) str_prefix=".." ;;
   1.591 +        esac
   1.592 +        echo "${str_prefix} ${msg}"
   1.593 +    fi
   1.594 +}
   1.595 +
   1.596 +#   helper function for graceful termination
   1.597 +die () {
   1.598 +    echo "$0: ERROR: $*"
   1.599 +    exit 1
   1.600 +}
   1.601 +
   1.602 +##
   1.603 +##  MAIN
   1.604 +##
   1.605 +
   1.606 +#   the stack information
   1.607 +CFG_NAME=""
   1.608 +CFG_SUMMARY=""
   1.609 +CFG_PACKAGER=""
   1.610 +CFG_VERSION=""
   1.611 +CFG_RELEASE=""
   1.612 +
   1.613 +#   the required OpenPKG framework parameters
   1.614 +CFG_FRAMEWORK="
   1.615 +"
   1.616 +
   1.617 +#   the required OpenPKG packages
   1.618 +#   (in topological order and with build options resolved)
   1.619 +CFG_PACKAGES="
   1.620 +"
   1.621 +
   1.622 +#   whether unversioned output directory should be used
   1.623 +CFG_UNVERSIONED=""
   1.624 +
   1.625 +#   display information
   1.626 +verbose 1 "OpenPKG Software Stack Deployment"
   1.627 +verbose 2 "determining information"
   1.628 +
   1.629 +#   parse OpenPKG framework parameters
   1.630 +params="
   1.631 +    prefix
   1.632 +    user group
   1.633 +    susr musr rusr nusr
   1.634 +    sgrp mgrp rgrp ngrp
   1.635 +    suid muid ruid nuid
   1.636 +    sgid mgid rgid ngid
   1.637 +    tag
   1.638 +"
   1.639 +for param in $params; do
   1.640 +    eval "CF_$param=''"
   1.641 +done
   1.642 +for opt in $CFG_FRAMEWORK; do
   1.643 +    case "$opt" in
   1.644 +        --[a-zA-Z0-9-]*=* )
   1.645 +            name=`echo "$opt" | sed -e 's;^--\([^=]*\)=.*$;\1;'`
   1.646 +            value=`echo "$opt" | sed -e 's;^--[^=]*=\(.*\)$;\1;'`
   1.647 +            eval "CF_$name='$value'"
   1.648 +            ;;
   1.649 +    esac
   1.650 +done
   1.651 +for define in $opt_D; do
   1.652 +    name=`echo "$define" | sed -e 's;=.*$;;'`
   1.653 +    value=`echo "$define" | sed -e 's;^.*=;;'`
   1.654 +    eval "CF_$name='$value'"
   1.655 +done
   1.656 +CFG_FRAMEWORK=''
   1.657 +for name in $params; do
   1.658 +    eval "value=\"\$CF_$name\""
   1.659 +    if [ ".$value" != . ]; then
   1.660 +        if [ ".$CFG_FRAMEWORK" = . ]; then
   1.661 +            CFG_FRAMEWORK="--$name=$value"
   1.662 +        else
   1.663 +            CFG_FRAMEWORK="$CFG_FRAMEWORK --$name=$value"
   1.664 +        fi
   1.665 +    fi
   1.666 +done
   1.667 +if [ ".$CF_musr" = . ]; then CF_musr="$CF_user";    fi
   1.668 +if [ ".$CF_mgrp" = . ]; then CF_mgrp="$CF_group";   fi
   1.669 +if [ ".$CF_rusr" = . ]; then CF_rusr="$CF_user-r";  fi
   1.670 +if [ ".$CF_rgrp" = . ]; then CF_rgrp="$CF_group-r"; fi
   1.671 +if [ ".$CF_nusr" = . ]; then CF_nusr="$CF_user-n";  fi
   1.672 +if [ ".$CF_ngrp" = . ]; then CF_ngrp="$CF_group-n"; fi
   1.673 +verbose 3 "name:     $CFG_NAME"
   1.674 +verbose 3 "summary:  $CFG_SUMMARY"
   1.675 +verbose 3 "packager: $CFG_PACKAGER"
   1.676 +verbose 3 "version:  $CFG_VERSION"
   1.677 +verbose 3 "release:  $CFG_RELEASE"
   1.678 +
   1.679 +#   determine target parameters
   1.680 +if [ ".$CF_prefix" = . ]; then
   1.681 +    die "OpenPKG Framework parameter \"prefix\" required"
   1.682 +fi
   1.683 +prefix="$CF_prefix"
   1.684 +if [ ".$CF_tag" = . ]; then
   1.685 +    die "OpenPKG Framework parameter \"tag\" required"
   1.686 +fi
   1.687 +tag="$CF_tag"
   1.688 +shtool="$opt_t/$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.shtool.sh"
   1.689 +sed <$0 -e '1,/^## SHTOOL ##.*/d' >$shtool
   1.690 +platform=`sh $shtool platform -n -L -S "" -C "+" -F '%<ap>-%<sp>'`
   1.691 +verbose 3 "platform: $platform"
   1.692 +verbose 3 "tag:      $tag"
   1.693 +verbose 3 "prefix:   $prefix"
   1.694 +
   1.695 +#   determine operation directories
   1.696 +srcdir="$opt_s"
   1.697 +if [ ".$srcdir" = . ]; then
   1.698 +    srcdir="$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.src.d"
   1.699 +fi
   1.700 +tmpdir="$opt_t/$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.d"
   1.701 +if [ ! -d "$tmpdir" ]; then
   1.702 +    (   umask 077
   1.703 +        rm -rf "$tmpdir" >/dev/null 2>&1 || true
   1.704 +        sh $shtool mkdir -p -m 700 "$tmpdir" >/dev/null 2>&1
   1.705 +        if [ $? -ne 0 ]; then
   1.706 +            die "failed to create temporary directory: \"$tmpdir\""
   1.707 +        fi
   1.708 +    ) || exit $?
   1.709 +fi
   1.710 +outdir="$opt_o"
   1.711 +if [ ".$outdir" = . ]; then
   1.712 +    if [ ".$CFG_UNVERSIONED" = .yes ]; then
   1.713 +        outdir="$CFG_NAME.$platform-$tag.d"
   1.714 +    else
   1.715 +        outdir="$CFG_NAME-$CFG_VERSION-$CFG_RELEASE.$platform-$tag.d"
   1.716 +    fi
   1.717 +fi
   1.718 +if [ ! -d "$outdir" ]; then
   1.719 +    sh $shtool mkdir -p -m 755 "$outdir" >/dev/null 2>&1
   1.720 +    if [ $? -ne 0 ]; then
   1.721 +        die "failed to create output directory: \"$outdir\""
   1.722 +    fi
   1.723 +fi
   1.724 +verbose 3 "srcdir:   $srcdir"
   1.725 +verbose 3 "outdir:   $outdir"
   1.726 +verbose 3 "tmpdir:   $tmpdir"
   1.727 +
   1.728 +#   execute prolog script
   1.729 +if [ ".@HAVE_PROLOG@" = .yes ]; then
   1.730 +    verbose 2 "execute prolog script"
   1.731 +    cat >$tmpdir/prolog.sh <<EOT
   1.732 +#!/bin/sh
   1.733 +#![OpenPKG]
   1.734 +# %prolog
   1.735 +EOT
   1.736 +    $opt_S sh $tmpdir/prolog.sh
   1.737 +    rm -f $tmpdir/prolog.sh
   1.738 +fi
   1.739 +
   1.740 +if [ $opt_c -le 1 -a -x "$prefix/bin/openpkg" ]; then
   1.741 +    #   optionally fresh-up OpenPKG instance
   1.742 +    pkgs=`$prefix/bin/openpkg rpm -qa | egrep -v '^(openpkg-[0-9]|gpg-pubkey-)'`
   1.743 +    if [ ".$pkgs" != . ]; then
   1.744 +        verbose 2 "uninstall already installed OpenPKG packages"
   1.745 +        for pkg in $pkgs; do
   1.746 +            verbose 3 "REMOVE: $pkg @ $prefix"
   1.747 +        done
   1.748 +        $opt_S $prefix/bin/openpkg rpm -e $pkgs || \
   1.749 +            die "failed to uninstall already installed OpenPKG packages"
   1.750 +    fi
   1.751 +fi
   1.752 +if [ $opt_c -le 0 -a -x "$prefix/bin/openpkg" ]; then
   1.753 +    #   optionally destroy OpenPKG instance
   1.754 +    verbose 2 "destroy existing OpenPKG framework"
   1.755 +    $opt_S $prefix/bin/openpkg rpm -e openpkg || \
   1.756 +        die "failed to destroy existing OpenPKG framework"
   1.757 +fi
   1.758 +
   1.759 +#   check whether an already existing OpenPKG instance can be reused
   1.760 +if [ -x "$prefix/bin/openpkg" ]; then
   1.761 +    verbose 2 "checking compatibility of existing OpenPKG framework"
   1.762 +    for name in $params; do
   1.763 +        case "$name" in
   1.764 +            user|group ) continue ;;
   1.765 +        esac
   1.766 +        eval "value_required=\"\$CF_$name\""
   1.767 +        if [ ".$value_required" != . ]; then
   1.768 +            value_existing=`$prefix/bin/openpkg rpm --eval "%{l_${name}}"`
   1.769 +            if [ ".$value_existing" != ".$value_required" ]; then
   1.770 +                die "conflict on parameter \"$name\": value required: \"$value_required\", value existing: \"$value_existing\""
   1.771 +            fi
   1.772 +        fi
   1.773 +    done
   1.774 +fi
   1.775 +
   1.776 +#   install or upgrade all packages
   1.777 +verbose 2 "install or upgrade all OpenPKG packages"
   1.778 +DIFS="$IFS"
   1.779 +OIFS="$IFS"; IFS="
   1.780 +"
   1.781 +for spec in $CFG_PACKAGES; do
   1.782 +    #   determine information
   1.783 +    pkg=`echo "$spec"    | sed -e 's;^\([^ ]*\).*$;\1;'`
   1.784 +    opts=`echo "$spec"   | sed -e 's;^[^ ]*;;' -e 's;^ *;;'`
   1.785 +    name=`echo "$pkg"    | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*$;\1;'`
   1.786 +    version=`echo "$pkg" | sed -e 's;^.*-\([^-][^-]*\)-[^-][^-]*$;\1;'`
   1.787 +    release=`echo "$pkg" | sed -e 's;^.*-[^-][^-]*-\([^-][^-]*\)$;\1;'`
   1.788 +
   1.789 +    if [ ".$name" = .openpkg ]; then
   1.790 +        #
   1.791 +        #   OpenPKG Framework
   1.792 +        #
   1.793 +        if [   ! -f "$outdir/$pkg.$platform-$tag.sh" \
   1.794 +            -o ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then
   1.795 +            #   build (bootstrap & regular)
   1.796 +            verbose 3 "BOOTSTRAP-BUILD: $srcdir/$pkg.src.sh"
   1.797 +            verbose 4 "options: $CFG_FRAMEWORK"
   1.798 +            if [ ! -f "$srcdir/$pkg.src.sh" ]; then
   1.799 +                die "source shell package not existing: $srcdir/$pkg.src.sh"
   1.800 +            fi
   1.801 +            (   TMPDIR="$tmpdir"
   1.802 +                srcdir="`cd $srcdir && pwd`"
   1.803 +                cd "$outdir" || exit $?
   1.804 +                cmd="sh \"$srcdir/$pkg.src.sh\" $CFG_FRAMEWORK"
   1.805 +                if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi
   1.806 +                eval "$cmd" || \
   1.807 +                    die "failed to build package \"$srcdir/$pkg.src.sh\""
   1.808 +                rm -f $pkg.src.rpm
   1.809 +            ) || exit $?
   1.810 +        fi
   1.811 +        if [ ! -x "$prefix/bin/openpkg" ]; then
   1.812 +            #   install (bootstrap)
   1.813 +            if [ ! -f "$outdir/$pkg.$platform-$tag.sh" ]; then
   1.814 +                die "binary shell package not existing: $outdir/$pkg.$platform-$tag.sh"
   1.815 +            fi
   1.816 +            verbose 3 "BOOTSTRAP-INSTALL: $outdir/$pkg.$platform-$tag.sh"
   1.817 +            cmd="$opt_S sh \"$outdir/$pkg.$platform-$tag.sh\""
   1.818 +            if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi
   1.819 +            eval "$cmd" || \
   1.820 +                die "failed to install package \"$outdir/$pkg.$platform-$tag.sh\""
   1.821 +        else
   1.822 +            check=`$prefix/bin/openpkg rpm -q openpkg 2>/dev/null`
   1.823 +            if [ ".$check" != ".$pkg" ]; then
   1.824 +                #   upgrade (regular)
   1.825 +                if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then
   1.826 +                    die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm"
   1.827 +                fi
   1.828 +                verbose 3 "UPGRADE: $outdir/$pkg.$platform-$tag.rpm"
   1.829 +                rpm_opt="-U"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi
   1.830 +                $opt_S $prefix/bin/openpkg rpm $rpm_opt \
   1.831 +                    $outdir/$pkg.$platform-$tag.rpm || \
   1.832 +                    die "failed to upgrade package: $outdir/$pkg.$platform-$tag.rpm"
   1.833 +            else
   1.834 +                #   keep as-is
   1.835 +                verbose 3 "KEEP AS-IS: $pkg @ $prefix"
   1.836 +            fi
   1.837 +        fi
   1.838 +    else
   1.839 +        #
   1.840 +        #   OpenPKG Packages
   1.841 +        #
   1.842 +        if [ ! -x "$prefix/bin/openpkg" ]; then
   1.843 +            #   usually will not happen because of correctly
   1.844 +            #   generated topologically correct package list
   1.845 +            die "command \"$prefix/bin/openpkg\" has to exit for building a regular OpenPKG package" 1>&2
   1.846 +        fi
   1.847 +        if [ ! -f $outdir/$pkg.$platform-$tag.rpm ]; then
   1.848 +            #    build (regular)
   1.849 +            if [ ! -f "$srcdir/$pkg.src.rpm" ]; then
   1.850 +                die "source RPM package not existing: $srcdir/$pkg.src.rpm"
   1.851 +            fi
   1.852 +            verbose 3 "BUILD: $srcdir/$pkg.src.rpm"
   1.853 +            if [ ".$opts" != . ]; then
   1.854 +                verbose 4 "options: $opts"
   1.855 +            fi
   1.856 +            rm -rf "$tmpdir/$pkg" >/dev/null 2>&1 || true
   1.857 +            sh $shtool mkdir -p -m 755 "$tmpdir/$pkg" >/dev/null 2>&1
   1.858 +            cmd="$prefix/bin/openpkg --keep-privileges"
   1.859 +            cmd="$cmd rpm --rebuild"
   1.860 +            cmd="$cmd --define \"_specdir   $tmpdir/$pkg\""
   1.861 +            cmd="$cmd --define \"_sourcedir $tmpdir/$pkg\""
   1.862 +            cmd="$cmd --define \"_builddir  $tmpdir/$pkg\""
   1.863 +            cmd="$cmd --define \"_tmppath   $tmpdir/$pkg\""
   1.864 +            cmd="$cmd --define \"_srcrpmdir $tmpdir/$pkg\""
   1.865 +            cmd="$cmd --define \"_rpmdir    $outdir\""
   1.866 +            OIFS2="$IFS"; IFS="$DIFS"
   1.867 +            for opt in $opts; do
   1.868 +                opt_name=`echo "$opt" | sed -e 's;^\([^=]*\)=.*$;\1;'`
   1.869 +                opt_value=`echo "$opt" | sed -e 's;^[^=]*=\(.*\)$;\1;'`
   1.870 +                cmd="$cmd --define \"$opt_name $opt_value\""
   1.871 +            done
   1.872 +            IFS="$OIFS2"
   1.873 +            cmd="$cmd $srcdir/$pkg.src.rpm"
   1.874 +            if [ $opt_v -lt 4 ]; then cmd="$cmd >/dev/null 2>&1"; fi
   1.875 +            eval "$cmd" || \
   1.876 +                die "failed to build package \"$srcdir/$pkg.src.rpm\""
   1.877 +        fi
   1.878 +        check=`$prefix/bin/openpkg rpm -q "$name" 2>/dev/null`
   1.879 +        if [ ".$check" = ".package $name is not installed" ]; then
   1.880 +            #   install (regular)
   1.881 +            if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then
   1.882 +                die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm"
   1.883 +            fi
   1.884 +            verbose 3 "INSTALL: $outdir/$pkg.$platform-$tag.rpm"
   1.885 +            rpm_opt="-i"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi
   1.886 +            $opt_S $prefix/bin/openpkg rpm $rpm_opt \
   1.887 +                $outdir/$pkg.$platform-$tag.rpm || \
   1.888 +                die "failed to install package: $outdir/$pkg.$platform-$tag.rpm"
   1.889 +        elif [ ".$check" != ".$pkg" ]; then
   1.890 +            #   upgrade (regular)
   1.891 +            if [ ! -f "$outdir/$pkg.$platform-$tag.rpm" ]; then
   1.892 +                die "binary RPM package not existing: $outdir/$pkg.$platform-$tag.rpm"
   1.893 +            fi
   1.894 +            verbose 3 "UPGRADE: $outdir/$pkg.$platform-$tag.rpm"
   1.895 +            rpm_opt="-U"; if [ $opt_v -ge 4 ]; then rpm_opt="${rpm_opt}vh"; fi
   1.896 +            $opt_S $prefix/bin/openpkg rpm $rpm_opt \
   1.897 +                $outdir/$pkg.$platform-$tag.rpm || \
   1.898 +                die "failed to upgrade package: $outdir/$pkg.$platform-$tag.rpm"
   1.899 +        else
   1.900 +            #   keep as-is
   1.901 +            verbose 3 "KEEP AS-IS: $pkg @ $prefix"
   1.902 +        fi
   1.903 +    fi
   1.904 +done
   1.905 +IFS="$OIFS"
   1.906 +
   1.907 +#   optionally remove residue packages from binary RPM package directory
   1.908 +if [ $opt_c -lt 3 ]; then
   1.909 +    verbose 2 "cleanup target directory from residue packages"
   1.910 +    for pkg in $outdir/*.sh $outdir/*.rpm; do
   1.911 +        if [ ! -f "$pkg" ]; then
   1.912 +            continue
   1.913 +        fi
   1.914 +        pkg_base=`echo "$pkg" | sed -e 's;^.*/\([^/][^/]*-[0-9][^/-]*-[0-9][0-9.]*\)\.[^/][^/]*$;\1;'`
   1.915 +        erase=yes
   1.916 +        for spec in $CFG_PACKAGES; do
   1.917 +            spec_base=`echo "$spec" | sed -e 's;^\(.*-[^-][^-]*-[^-][^-]*\).*$;\1;'`
   1.918 +            if [ ".$pkg_base" = ".$spec_base" ]; then
   1.919 +                erase=no
   1.920 +                break
   1.921 +            fi
   1.922 +        done
   1.923 +        if [ ".$erase" = .yes ]; then
   1.924 +            verbose 3 "REMOVE: $pkg"
   1.925 +            rm -f "$pkg"
   1.926 +        fi
   1.927 +    done
   1.928 +fi
   1.929 +
   1.930 +#   optionally remove residue packages from OpenPKG instance
   1.931 +if [ $opt_c -lt 3 ]; then
   1.932 +    verbose 2 "cleanup OpenPKG instance from residue packages"
   1.933 +    for pkg1 in `$prefix/bin/openpkg rpm -qa | egrep -v '^(openpkg-[0-9]|gpg-pubkey-)'`; do
   1.934 +        name1=`echo "$pkg1" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*$;\1;'`
   1.935 +        erase=yes
   1.936 +        for spec in $CFG_PACKAGES; do
   1.937 +            name2=`echo "$spec" | sed -e 's;^\(.*\)-[^-][^-]*-[^-][^-]*.*$;\1;'`
   1.938 +            if [ ".$name1" = ".$name2" ]; then
   1.939 +                erase=no
   1.940 +                break
   1.941 +            fi
   1.942 +        done
   1.943 +        if [ ".$erase" = .yes ]; then
   1.944 +            verbose 3 "REMOVE: pkg1 @ $prefix"
   1.945 +            $opt_S $prefix/bin/openpkg rpm -e "$pkg1" || \
   1.946 +                die "failed to erase residue package \"$pkg1\""
   1.947 +        fi
   1.948 +    done
   1.949 +fi
   1.950 +
   1.951 +#   execute epilog script
   1.952 +if [ ".@HAVE_EPILOG@" = .yes ]; then
   1.953 +    verbose 2 "execute epilog script"
   1.954 +    cat >$tmpdir/epilog.sh <<EOT
   1.955 +#!/bin/sh
   1.956 +#![OpenPKG]
   1.957 +# %epilog
   1.958 +EOT
   1.959 +    $opt_S sh $tmpdir/epilog.sh
   1.960 +    rm -f $tmpdir/epilog.sh
   1.961 +fi
   1.962 +
   1.963 +#   cleanup
   1.964 +rm -f  $shtool >/dev/null 3>&1 || true
   1.965 +rm -rf $tmpdir >/dev/null 2>&1 || true
   1.966 +
   1.967 +exit 0
   1.968 +
   1.969 +## SHTOOL ###################################################################
   1.970 +

mercurial