소스 검색

In following our good ritual when confronted with a new release, we commit a cruel heavy weight change to the critical bootstrap package in order to fully break everything and horse up the whole release. This time we finally introduce the namespace-clean OpenPKG in order to have it already in place for the major version 2.0: New Files: %{l_prefix}/bin/openpkg %{l_prefix}/libexec/openpkg/install %{l_prefix}/libexec/openpkg/man %{l_prefix}/man/man1/openpkg.1 Moved Files: %{l_prefix}/bin/rpm -> %{l_prefix}/libexec/openpkg/rpm %{l_prefix}/bin/rpm-config -> %{l_prefix}/libexec/openpkg/rpm-config %{l_prefix}/bin/rpm2cpio -> %{l_prefix}/libexec/openpkg/rpm2cpio %{l_prefix}/bin/rpmbuild -> %{l_prefix}/libexec/openpkg/rpmbuild %{l_prefix}/sbin/lsync -> %{l_prefix}/libexec/openpkg/lsync %{l_prefix}/man/man8/*.8 -> %{l_prefix}/libexec/openpkg/*.8 %{l_prefix}/lib/openpkg/uuid.sh -> %{l_prefix}/libexec/openpkg/uuid %{l_prefix}/include/rpm/ -> %{l_prefix}/include/openpkg/rpm/ %{l_prefix}/lib/librpm*.a -> %{l_prefix}/lib/openpkg/librpm*.a The short-term goal is to make OpenPKG bootstrap package namespace clean, but the long-term pgoal is to provide the bootstrap part of the new forthcoming OpenPKG Tool Chain in a way we then can seamlessly integrate it. The key point is the new %{l_prefix}/bin/openpkg command.

Ralf S. Engelschall 22 년 전
부모
커밋
8256a59b1d
16개의 변경된 파일855개의 추가작업 그리고 97개의 파일을 삭제
  1. 1 0
      openpkg/HISTORY
  2. 8 8
      openpkg/aux.wrapbin.sh
  3. 131 0
      openpkg/install.sh
  4. 28 0
      openpkg/man.sh
  5. 186 0
      openpkg/openpkg.1
  6. 1 1
      openpkg/openpkg.boot
  7. 90 0
      openpkg/openpkg.pod
  8. 252 0
      openpkg/openpkg.sh
  9. 140 74
      openpkg/openpkg.spec
  10. 1 0
      openpkg/pod2man.sh
  11. 3 3
      openpkg/rc.openpkg
  12. 3 3
      openpkg/root.README
  13. 3 3
      openpkg/rpmdb
  14. 6 3
      openpkg/rpmmacros
  15. 1 1
      openpkg/rpmx.pl
  16. 1 1
      openpkg/uuid.sh

+ 1 - 0
openpkg/HISTORY

@@ -2,6 +2,7 @@
 2004
 ====
 
+20040216 change filesystem layout for final OpenPKG 2.0 namespace clean layout
 20040216 config.{guess,sub} scripts are no longer installed
 20040216 fixed --tag processing in bootstrapping situation
 20040216 upgraded to OSSP uuid 1.0.0

+ 8 - 8
openpkg/aux.wrapbin.sh

@@ -163,7 +163,7 @@ echo "++ fixating OpenPKG instance filesystem hierarchy"
   echo '    chown "$2" "$4"'
   echo '    chgrp "$3" "$4"'
   echo '}'
-  $l_prefix/bin/rpm -qa \
+  $l_prefix/bin/openpkg rpm -qa \
       --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
@@ -193,24 +193,24 @@ set -- 1 # emulate RPM's $1 when executing scripts
   echo "Details about this installed OpenPKG instance you can easily"
   echo "determine by running the following typical RPM query commands:"
   echo ""
-  echo "    \$ ${l_prefix}/bin/rpm -qa"
-  echo "    \$ ${l_prefix}/bin/rpm -qi  openpkg"
-  echo "    \$ ${l_prefix}/bin/rpm -qlv openpkg"
+  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 "The integrity of the whole OpenPKG instance you can check at any"
   echo "time by running the RPM verify command:"
   echo ""
-  echo "    \$ ${l_prefix}/bin/rpm -Va"
+  echo "    \$ ${l_prefix}/bin/openpkg rpm -Va"
   echo ""
   echo "For installing software packages into this OpenPKG instance, just run"
   echo "the following two RPM build commands for each package:"
   echo ""
-  echo "    \$ ${l_prefix}/bin/rpm --rebuild /path/to/foo-*.src.rpm"
-  echo "    \$ ${l_prefix}/bin/rpm -Uvh ${l_prefix}/RPM/PKG/foo-*.rpm"
+  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 "If you later want to remove a software package, just run:"
   echo ""
-  echo "    \$ ${l_prefix}/bin/rpm -e foo"
+  echo "    \$ ${l_prefix}/bin/openpkg rpm -e foo"
   echo ""
   echo "For removing the whole OpenPKG instance under prefix ${l_prefix},"
   echo "just remove every package. Once you finally removed the package"

+ 131 - 0
openpkg/install.sh

@@ -0,0 +1,131 @@
+##
+##  install -- OpenPKG Tool Chain "install" command (BOOSTRAP VERSION ONLY)
+##  Copyright (c) 2004 The OpenPKG Project <http://www.openpkg.org/>
+##  Copyright (c) 2004 Ralf S. Engelschall <rse@engelschall.com>
+##  Copyright (c) 2004 Cable & Wireless <http://www.cw.com/>
+##
+##  Permission to use, copy, modify, and distribute this software for
+##  any purpose with or without fee is hereby granted, provided that
+##  the above copyright notice and this permission notice appear in all
+##  copies.
+##
+##  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.
+##
+
+##
+##  This command emulates the "openpkg install openpkg-tools" command
+##  in order to bootstrap the installation of the OpenPKG Tool Chain.
+##
+
+#   sanity check usage
+if [ $# -eq 1 -a ".$1" = ".openpkg-tools" ]; then
+    :
+else
+    echo "openpkg:ERROR: still not available functionality \"$cmd $*\""                   1>&2
+    echo "openpkg: This functionality is provided by the \"openpkg-tools\" package only!" 1>&2
+    echo "openpkg: Run the command \"$OPENPKG_PREFIX/bin/openpkg install openpkg-tools\" to"    1>&2
+    echo "openpkg: bootstrap the \"openpkg-tools\" package for additional functionality." 1>&2
+    echo "openpkg: This bootstrap version only supports this particular install command." 1>&2
+    exit 1
+fi
+
+#   determine OpenPKG release and download URLs
+release=`$OPENPKG_PREFIX/bin/openpkg rpm --eval '%{l_openpkg_release -F "%s"}'`
+case "$release" in
+    CURRENT )
+        url_src="ftp://ftp.openpkg.org/current/SRC"
+        url_upd=""
+        ;;
+    [0-9].[0-9] )
+        url_src="ftp://ftp.openpkg.org/release/$release/SRC"
+        url_upd="ftp://ftp.openpkg.org/release/$release/UPD"
+        ;;
+    * )
+        echo "openpkg:ERROR: invalid OpenPKG release \"$release\"" 1>&2
+        exit 1
+        ;;
+esac
+
+#   determine path to binary RPMs
+rpmdir=`$OPENPKG_PREFIX/bin/openpkg rpm --eval '%{_rpmdir}'`
+rpmtag=`$OPENPKG_PREFIX/bin/openpkg rpm --eval '%{l_platform -p}-%{l_tag}'`
+
+#   iterate through package installation in dependency order
+for pkg in openpkg make binutils gcc perl openpkg-tools; do
+    #   determine latest package version and URL
+    pkg_srpm=""
+    pkg_name=""
+    for url in $url_upd $url_src; do
+        if [ ".$url" = . ]; then
+            continue
+        fi
+        pkg_name=`$OPENPKG_PREFIX/lib/openpkg/curl -s -l "$url/" |\
+            egrep "^${pkg}-[0-9]" |\
+            sed -e "s;^${pkg}-\\([0-9][^-]*\\)-\\([^-][^-]*\\)\\.src\\.rpm.*;\\2:\\1;" |\
+            sort -r | head -1 |\
+            sed -e "s;^\\([^:]*\\):\\(.*\\);${pkg}-\\2-\\1;"`
+        if [ ".$pkg_name" != . ]; then
+            pkg_srpm="$url/$pkg_name.src.rpm"
+            break
+        fi
+    done
+    if [ ".$pkg_name" = . ]; then
+        echo "openpkg:ERROR: package \"$pkg\" not found under URLs:" 1>&2
+        if [ ".$url_upd" != . ]; then
+            echo "openpkg:ERROR: $url_upd" 1>&2
+        fi
+        echo "openpkg:ERROR: $url_src" 1>&2
+        exit 1
+    fi
+
+    #   check whether package is already installed
+    if [ ".`$OPENPKG_PREFIX/bin/openpkg rpm -q $pkg_name | grep -v 'is not installed'`" != . ]; the
+        continue
+    fi
+
+    #   build binary package from source package
+    if [ ! -f "$rpmdir/$pkg_name.$rpmtag.rpm" ]; then
+        echo "++ fetching and building source package \"$pkg_name.src.rpm\""
+        $OPENPKG_PREFIX/bin/openpkg rpm --rebuild $pkg_srpm
+        if [ $? -ne 0 ]; then
+            echo "openpkg:ERROR: failed to build package \"$pkg_name\" (RPM returned with $?)" 1>&2
+            exit 1
+        fi
+        if [ ! -f "$rpmdir/$pkg_name.$rpmtag.rpm" ]; then
+            echo "openpkg:ERROR: failed to build package \"$pkg_name\" (RPM returned successfully but there is no $rpmdir/$pkg_name.$rpmtag.rpm)" 1>&2
+            exit 1
+        fi
+    fi
+
+    #   install binary package
+    echo "++ installing binary package \"$pkg_name.$rpmtag.rpm\""
+    $OPENPKG_PREFIX/bin/openpkg rpm -Uvh "$rpmdir/$pkg_name.$rpmtag.rpm"
+    if [ $? -ne 0 ]; then
+        echo "openpkg:ERROR: failed to install package \"$pkg_name\" (RPM returned with $?)" 1>&2
+        exit 1
+    fi
+done
+
+#   display final result message
+if [ -f "$OPENPKG_PREFIX/lib/openpkg-tools/openpkg.sh" ]; then
+    ( echo "Congratulations, you have bootstrapped the OpenPKG Tool Chain."
+      echo "You now have additional management ommands available. Run"
+      echo "    \$ $OPENPKG_PREFIX/bin/openpkg --help"
+      echo "for more details on the actual list of available commands."
+    ) | $OPENPKG_PREFIX/lib/openpkg/rpmtool msg -b -t notice
+else
+    echo "openpkg:ERROR: failed to install package \"openpkg-tools\"" 1>&2
+    exit 1
+fi
+

+ 28 - 0
openpkg/man.sh

@@ -0,0 +1,28 @@
+#!@l_prefix@/lib/openpkg/bash
+##
+##  man -- OpenPKG Tool Chain "man" command
+##  Copyright (c) 2004 The OpenPKG Project <http://www.openpkg.org/>
+##  Copyright (c) 2004 Ralf S. Engelschall <rse@engelschall.com>
+##  Copyright (c) 2004 Cable & Wireless <http://www.cw.com/>
+##
+##  Permission to use, copy, modify, and distribute this software for
+##  any purpose with or without fee is hereby granted, provided that
+##  the above copyright notice and this permission notice appear in all
+##  copies.
+##
+##  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.
+##
+
+echo "FIXME: STILL NOT IMPLEMENTED"
+

+ 186 - 0
openpkg/openpkg.1

@@ -0,0 +1,186 @@
+.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings.  \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote.  | will give a
+.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
+.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
+.\" expand to `' in nroff, nothing in troff, for use with C<>.
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+.    ds -- \(*W-
+.    ds PI pi
+.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
+.    ds L" ""
+.    ds R" ""
+.    ds C` 
+.    ds C' 
+'br\}
+.el\{\
+.    ds -- \|\(em\|
+.    ds PI \(*p
+.    ds L" ``
+.    ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD.  Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+.    de IX
+.    tm Index:\\$1\t\\n%\t"\\$2"
+..
+.    nr % 0
+.    rr F
+.\}
+.\"
+.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
+.    \" fudge factors for nroff and troff
+.if n \{\
+.    ds #H 0
+.    ds #V .8m
+.    ds #F .3m
+.    ds #[ \f1
+.    ds #] \fP
+.\}
+.if t \{\
+.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+.    ds #V .6m
+.    ds #F 0
+.    ds #[ \&
+.    ds #] \&
+.\}
+.    \" simple accents for nroff and troff
+.if n \{\
+.    ds ' \&
+.    ds ` \&
+.    ds ^ \&
+.    ds , \&
+.    ds ~ ~
+.    ds /
+.\}
+.if t \{\
+.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+.    \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+.    \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+.    \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+.    ds : e
+.    ds 8 ss
+.    ds o a
+.    ds d- d\h'-1'\(ga
+.    ds D- D\h'-1'\(hy
+.    ds th \o'bp'
+.    ds Th \o'LP'
+.    ds ae ae
+.    ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "OPENPKG 1"
+.TH OPENPKG 1 "OpenPKG" "OPENPKG(8)" "OpenPKG"
+.SH "NAME"
+\&\fBOpenPKG\fR \-\- Cross\-Platform Unix Software Packaging Facility
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+.IP "Command Line Interface" 4
+.IX Item "Command Line Interface"
+$ \fBopenpkg\fR [\fIopt\fR ...] \fIcmd\fR [\fIcmd_opt\fR ...] [\fIcmd_arg\fR ...]
+.Sp
+$ \fBopenpkg\fR \fBman\fR \fIcmd\fR
+.IP "Project Locations" 4
+.IX Item "Project Locations"
+.Vb 5
+\& http://www.openpkg.org/       web service
+\& http://cvs.openpkg.org/       repository service
+\& http://pgp.openpkg.org/       OpenPGP service
+\& http://rt.openpkg.org/        request tracking service
+\& ftp://ftp.openpkg.org/        download service
+.Ve
+.IP "Project Forums" 4
+.IX Item "Project Forums"
+.Vb 5
+\& petidomo@openpkg.org          mailing-list manager
+\& openpkg-announce@openpkg.org  project announcements
+\& openpkg-dev@openpkg.org       developer forum
+\& openpkg-users@openpkg.org     users forum
+\& openpkg-bugdb@openpkg.org     users forum
+.Ve
+.IP "Local Documentation" 4
+.IX Item "Local Documentation"
+.Vb 7
+\& openpkg-rpm(1)                RPM package manager
+\& openpkg-rpmbuild(1)           RPM package manager (build only)
+\& openpkg-rpm2cpio(1)           RPM payload utility
+\& openpkg-rpm-config(1)         RPM C API utility
+\& openpkg-lsync(1)              local area synchronization
+\& openpkg-rc(1)                 run-command facility
+\& openpkg-tools(1)              OpenPKG Tool Chain (optional)
+.Ve
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+OpenPKG is the world leading instrument for deployment and maintenance
+of Open Source software when administration crosses Unix platform
+boundaries. The OpenPKG project is a collaboration effort with the
+goal of creating and maintaining portable and easy to install software
+packages for use on the major Unix server platforms.
+.PP
+The unique OpenPKG architecture leverages proven technologies like
+Red Hat Package Manager (\s-1RPM\s0) to establish a unified administration
+environment, independent of the underlying operating system. OpenPKG
+is completely self-contained and does not even need a preinstallation
+of \s-1RPM\s0. Instead, \s-1RPM\s0 is provided as an OpenPKG \s-1RPM\s0 package itself plus
+a tricky bootstrapping procedure in order to allow one to create from
+scratch the initial state of the whole OpenPKG software packaging
+system.

+ 1 - 1
openpkg/openpkg.boot

@@ -411,7 +411,7 @@ if [ -f "$tmpdir/rpm" ]; then
     exit 1
 fi
 ( echo "#!/bin/sh"
-  echo "exec $RPM_BUILD_ROOT$prefix/bin/rpm \\"
+  echo "exec $RPM_BUILD_ROOT$prefix/libexec/openpkg/rpm \\"
   echo "    --rcfile \"$tmpdir/rpm.1\" \\"
   echo "    --define \"__platform $RPM_BUILD_ROOT$prefix/etc/openpkg/platform\" \\"
   echo "    \"\$@\""

+ 90 - 0
openpkg/openpkg.pod

@@ -0,0 +1,90 @@
+##
+##  openpkg -- OpenPKG Tool Chain
+##  Copyright (c) 2000-2004 The OpenPKG Project <http://www.openpkg.org/>
+##  Copyright (c) 2000-2004 Ralf S. Engelschall <rse@engelschall.com>
+##  Copyright (c) 2000-2004 Cable & Wireless <http://www.cw.com/>
+##
+##  Permission to use, copy, modify, and distribute this software for
+##  any purpose with or without fee is hereby granted, provided that
+##  the above copyright notice and this permission notice appear in all
+##  copies.
+##
+##  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.
+##
+##  openpkg.pod: Minimum Execution Frontend (Language: Perl POD)
+##
+
+=pod
+
+=head1 NAME
+
+B<OpenPKG> -- Cross-Platform Unix Software Packaging Facility
+
+=head1 SYNOPSIS
+
+=over 4
+
+=item Command Line Interface
+
+$ B<openpkg> [I<opt> ...] I<cmd> [I<cmd_opt> ...] [I<cmd_arg> ...]
+
+$ B<openpkg> B<man> I<cmd>
+
+=item Project Locations
+
+ http://www.openpkg.org/       web service
+ http://cvs.openpkg.org/       repository service
+ http://pgp.openpkg.org/       OpenPGP service
+ http://rt.openpkg.org/        request tracking service
+ ftp://ftp.openpkg.org/        download service
+
+=item Project Forums
+
+ petidomo@openpkg.org          mailing-list manager
+ openpkg-announce@openpkg.org  project announcements
+ openpkg-dev@openpkg.org       developer forum
+ openpkg-users@openpkg.org     users forum
+ openpkg-bugdb@openpkg.org     users forum
+
+=item Local Documentation
+
+ openpkg-rpm(1)                RPM package manager
+ openpkg-rpmbuild(1)           RPM package manager (build only)
+ openpkg-rpm2cpio(1)           RPM payload utility
+ openpkg-rpm-config(1)         RPM C API utility
+ openpkg-lsync(1)              local area synchronization
+ openpkg-rc(1)                 run-command facility
+ openpkg-tools(1)              OpenPKG Tool Chain (optional)
+
+=back
+
+=head1 DESCRIPTION
+  
+OpenPKG is the world leading instrument for deployment and maintenance
+of Open Source software when administration crosses Unix platform
+boundaries. The OpenPKG project is a collaboration effort with the
+goal of creating and maintaining portable and easy to install software
+packages for use on the major Unix server platforms.
+
+The unique OpenPKG architecture leverages proven technologies like
+Red Hat Package Manager (RPM) to establish a unified administration
+environment, independent of the underlying operating system. OpenPKG
+is completely self-contained and does not even need a preinstallation
+of RPM. Instead, RPM is provided as an OpenPKG RPM package itself plus
+a tricky bootstrapping procedure in order to allow one to create from
+scratch the initial state of the whole OpenPKG software packaging
+system.
+
+=cut
+

+ 252 - 0
openpkg/openpkg.sh

@@ -0,0 +1,252 @@
+#!@l_prefix@/lib/openpkg/bash
+##
+##  openpkg -- OpenPKG Tool Chain
+##  Copyright (c) 2000-2004 The OpenPKG Project <http://www.openpkg.org/>
+##  Copyright (c) 2000-2004 Ralf S. Engelschall <rse@engelschall.com>
+##  Copyright (c) 2000-2004 Cable & Wireless <http://www.cw.com/>
+##
+##  Permission to use, copy, modify, and distribute this software for
+##  any purpose with or without fee is hereby granted, provided that
+##  the above copyright notice and this permission notice appear in all
+##  copies.
+##
+##  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.
+##
+##  openpkg.sh: Execution Frontend (Language: Bourne-Shell)
+##
+
+##
+##  command line parsing
+##
+
+#   option defaults
+opt_prefix=""
+opt_tools=""
+opt_version=no
+opt_help=no
+
+#   iterate over argument line
+for opt
+do
+    case $opt in
+        -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
+           *) arg='' ;;
+    esac
+    case $opt in
+        -v|--version   ) opt_version=yes   ;;
+        -h|--help      ) opt_help=yes      ;;
+        --prefix=*     ) opt_prefix="$arg" ;;
+        --tools=*      ) opt_tools="$arg"  ;;
+        -* ) echo "openpkg:ERROR: Invalid command-line option \"$opt\"." 1>&2
+             echo "openpkg:ERROR: Run \"$0 --help\" for list of valid options" 1>&2; exit 1 ;;
+        *  ) break ;;
+    esac
+done
+
+##
+##  determine OpenPKG locations
+##
+
+#   determine path to OpenPKG instance
+if [ ".$opt_prefix" != . ]; then
+    OPENPKG_PREFIX="$opt_prefix"
+fi
+if [ ".$OPENPKG_PREFIX" = . ]; then
+    OPENPKG_PREFIX="@l_prefix@"
+fi
+if [ ! -f "$OPENPKG_PREFIX/bin/openpkg" ]; then
+    echo "openpkg:ERROR: no OpenPKG instance found under \"$OPENPKG_PREFIX\"" 1>&2
+    exit 1
+fi
+
+#   allow convient all-in-one specification of OpenPKG Tool Chain locations
+if [ ".$opt_tool" != . ]; then
+    OPENPKG_TOOLS="$opt_tools"
+fi
+if [ ".$OPENPKG_TOOLS" != . -a ".$OPENPKG_TOOLS_CMDPATH" = . ]; then
+    OPENPKG_TOOLS_CMDPATH="$OPENPKG_TOOLS/cmd"
+fi
+if [ ".$OPENPKG_TOOLS" != . -a ".$OPENPKG_TOOLS_APIPATH" = . ]; then
+    OPENPKG_TOOLS_APIPATH="$OPENPKG_TOOLS/api"
+fi
+
+#   determine path to OpenPKG Tool Chain commands
+cmdpath="$OPENPKG_PREFIX/libexec/openpkg"
+if [ -d "$OPENPKG_PREFIX/libexec/openpkg-tools" ]; then
+    #   openpkg-tools package overrides
+    cmdpath="$OPENPKG_PREFIX/libexec/openpkg-tools:$cmdpath"
+fi
+if [ ".$OPENPKG_TOOLS_CMDPATH" != . ]; then
+    #   user supplied path overrides
+    cmdpath=`echo "$OPENPKG_TOOLS_CMDPATH" | sed -e "s;@;$cmdpath;"`
+fi
+OPENPKG_TOOLS_CMDPATH=`echo "$cmdpath" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
+
+#   determine path to OpenPKG Tool Chain API
+apipath=""
+if [ -d "$OPENPKG_PREFIX/lib/openpkg-tools" ]; then
+    #   openpkg-tools package overrides
+    apipath="$OPENPKG_PREFIX/lib/openpkg-tools:$apipath"
+fi
+if [ ".$OPENPKG_TOOLS_APIPATH" != . ]; then
+    #   user supplied path overrides
+    apipath=`echo "$OPENPKG_TOOLS_APIPATH" | sed -e "s;@;$apipath;"`
+fi
+OPENPKG_TOOLS_APIPATH=`echo "$apipath" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
+
+#   export variables into environment
+export OPENPKG_PREFIX
+export OPENPKG_TOOLS
+export OPENPKG_TOOLS_CMDPATH
+export OPENPKG_TOOLS_APIPATH
+
+##
+##  determine command details and execute command appropriately
+##
+
+#   command line sanity check
+if [ $# -eq 0 ]; then
+    echo "openpkg:ERROR: Invalid command-line arguments." 1>&2
+    echo "openpkg:ERROR: Run \"$0 --help\" for list of valid arguments." 1>&2
+    exit 1
+fi
+
+#   implement stand-alone "--help" option
+if [ ".$opt_help" = .yes ]; then
+    release=`$OPENPKG_PREFIX/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
+    echo ""
+    echo "This is $release <http://www.openpkg.org/>"
+    echo "Cross-Platform Unix Software Packaging Facility"
+    echo ""
+    echo "Copyright (c) 2000-2004 The OpenPKG Project <http://www.openpkg.org/>"
+    echo "Copyright (c) 2000-2004 Ralf S. Engelschall <rse@engelschall.com>"
+    echo "Copyright (c) 2000-2004 Cable & Wireless <http://www.cw.com/>"
+    echo ""
+    echo "The command \"@l_prefix@/bin/openpkg\" is the official command-line"
+    echo "execution frontend of the OpenPKG tool chain. Its usage is:"
+    echo ""
+    echo "  \$ @l_prefix@/bin/openpkg [<option> ...] \\"
+    echo "     <command> [<command-option> ...] [<command-argument> ...]"
+    echo ""
+    echo "where <option> is one of the following global options:"
+    echo "  -p, --prefix    sets the OpenPKG instance prefix   (also: \$OPENPKG_PREFIX)"
+    echo "  -t, --tools     sets the OpenPKG tool chain prefix (also: \$OPENPKG_TOOLS)"
+    echo "  -v, --version   display OpenPKG version/release"
+    echo "  -h, --help      display this usage help message"
+    echo ""
+    echo "where <command> is one of the following commands:"
+    echo "  rpm             (provided by bootstrap package)"
+    echo "  rpmbuild        (provided by bootstrap package)"
+    echo "  rpm2cpio        (provided by bootstrap package)"
+    echo "  rpm-config      (provided by bootstrap package)"
+    echo "  uuid            (provided by bootstrap package)"
+    echo "  rc              (provided by bootstrap package)"
+    echo "  lsync           (provided by bootstrap package)"
+    echo "  man             (provided by bootstrap package)"
+    #   install command intentionally left out in above display!
+    for cmd in rpm rpmbuild rpm2cpio rpm-config uuid rc lsync man install; do
+        id=`echo "$cmd" | sed -e 's/-/_/g'`
+        eval "__cmd_seen_$id=yes"
+    done
+    OIFS="$IFS"; IFS=":"
+    for dir in $OPENPKG_TOOLS_CMDPATH; do
+        IFS="$OIFS"
+        for cmd in `cd $dir 2>&1 && echo *`; do
+            cmd=`echo "$cmd" | sed -e 's/\.sh$//' -e 's/\.pl$//' -e 's;^;X;' -e 's;^X\([a-zA-Z][a-zA-Z0-9_-]*\)$;\1;' -e 's;^X.*$;;'`
+            if [ ".$cmd" != . ]; then
+                id=`echo "$cmd" | sed -e 's/-/_/g' -e 's/\.sh$//' -e 's/\.pl$//'`
+                eval "seen=\$__cmd_seen_$id"
+                if [ ".$seen" != .yes ]; then
+                    echo "$cmd" | awk '{ printf("  %-15s (provided by addon package)\n", $0); }'
+                fi
+            fi
+        done
+    done
+    IFS="$OIFS"
+    echo ""
+    echo "where <command-option> and <command-argument> are <command> specific"
+    echo "options and arguments. Run \"@l_prefix@/bin/openpkg <command> --help\""
+    echo "and \"@l_prefix@/bin/openpkg man <command>\" for more details."
+    echo ""
+    exit 0
+fi
+
+#   implement stand-alone "--version" option
+if [ ".$opt_version" = .yes ]; then
+    release=`$OPENPKG_PREFIX/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
+    version=`$OPENPKG_PREFIX/libexec/openpkg/rpm -q --qf '%{version}' openpkg`
+    echo "$release ($version)"
+    exit 0
+fi
+
+#   iterate over all command directories
+cmd="$1"
+shift
+cmd_path=""
+cmd_shell=""
+OIFS="$IFS"; IFS=":"
+for dir in $OPENPKG_TOOLS_CMDPATH; do
+    IFS="$OIFS"
+    if [ -x "$dir/$cmd" ]; then
+        #   found executable stand-alone binary
+        cmd_path="$dir/$cmd"
+        cmd_shell=""
+        break
+    elif [ -f "$dir/$cmd.sh" ]; then
+        #   found non-executable Bourne-Shell script
+        cmd_path="$dir/$cmd.sh"
+        cmd_shell="$OPENPKG_PREFIX/lib/openpkg/bash"
+        break
+    elif [ -f "$dir/$cmd.pl" ]; then
+        #   found non-executable Perl script
+        cmd_path="$dir/$cmd.pl"
+        if [ -x "$OPENPKG_PREFIX/bin/perl" ]; then
+            cmd_shell="$OPENPKG_PREFIX/bin/perl"
+        else
+            cmd_shell=`$OPENPKG_PREFIX/lib/openpkg/shtool -m perl 2>&1`
+            if [ ".$cmd_shell" = . ]; then
+                echo "openpkg:ERROR: No Perl interpreter found in \$PATH" 1>&2
+                exit 1
+            fi
+        fi
+        #   provide module include path(s) to API
+        OIFS="$IFS"; IFS=":"
+        for dir2 in $OPENPKG_TOOLS_APIPATH; do
+            IFS="$OIFS"
+            cmd_shell="$cmd_shell -I$dir2"
+        done
+        IFS="$OIFS"
+        break
+    fi
+done
+IFS="$OIFS"
+if [ ".$cmd_path" = . ]; then
+    echo "openpkg:ERROR: No such command \"$cmd\" found in command path" 1>&2
+    echo "openpkg:ERROR: ($OPENPKG_TOOLS_CMDPATH)." 1>&2
+    echo "openpkg:ERROR: Set \$OPENPKG_TOOLS_CMDPATH appropriately." 1>&2
+    echo "openpkg:ERROR: Run \"$0 --help\" for list of valid commands." 1>&2
+    exit 1
+fi
+
+#   execute command
+eval "$cmd_shell $cmd_path \${1+\"\$@\"}"
+
+#   execution result check and graceful termination
+if [ $? -ne 0 ]; then
+    echo "openpkg:ERROR: Command \"$cmd\" failed (return code was $?)" 1>&2
+    exit $?
+else
+    exit 0
+fi
+

+ 140 - 74
openpkg/openpkg.spec

@@ -126,6 +126,11 @@ Source54:     rpmx.pl
 Source55:     rpmx.sh
 Source56:     shtool
 Source57:     uuid.sh
+Source58:     openpkg.sh
+Source59:     openpkg.pod
+Source60:     openpkg.1
+Source61:     install.sh
+Source62:     man.sh
 
 #   build information
 Prefix:       %{l_prefix}
@@ -746,6 +751,8 @@ Provides:     openpkg = 1.3.1-1.3.1
         test -d $RPM_BUILD_ROOT%{l_prefix}/RPM/$dir || \
         mkdir $RPM_BUILD_ROOT%{l_prefix}/RPM/$dir
     done
+    mkdir $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg
+    mkdir $RPM_BUILD_ROOT%{l_prefix}/include/openpkg
 
     #   display verbosity header
     set +x; VERBOSE "INSTALL: Installation of RPM"
@@ -807,6 +814,12 @@ Provides:     openpkg = 1.3.1-1.3.1
     mv $RPM_BUILD_ROOT%{l_prefix}/include/popt.h \
        $RPM_BUILD_ROOT%{l_prefix}/include/rpm/popt.h
 
+    #   move C API into custom locations
+    mv $RPM_BUILD_ROOT%{l_prefix}/include/rpm \
+       $RPM_BUILD_ROOT%{l_prefix}/include/openpkg/rpm
+    mv $RPM_BUILD_ROOT%{l_prefix}/lib/librpm* \
+       $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/
+
     #   replace symlinks with hardlinks
     for entry in rpme:rpmi rpmt:rpmb rpmu:rpmi rpmv:rpmq; do
         eval `echo $entry | sed -e 's/^\(.*\):\(.*\)$/dst=\1; src=\2/'`
@@ -816,7 +829,9 @@ Provides:     openpkg = 1.3.1-1.3.1
     done
     rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/rpmbuild
     ln $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmb \
-       $RPM_BUILD_ROOT%{l_prefix}/bin/rpmbuild
+       $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpmbuild
+    mv $RPM_BUILD_ROOT%{l_prefix}/man/man8/rpmbuild.8 \
+       $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpmbuild.8
 
     #   display verbosity header
     set +x; VERBOSE "INSTALL: Install Additional Tools"
@@ -824,21 +839,21 @@ Provides:     openpkg = 1.3.1-1.3.1
     #   install lsync tool
     sed -e "s:@l_prefix@:%{l_prefix}:g" \
         <`SOURCE lsync` \
-        >$RPM_BUILD_ROOT%{l_prefix}/sbin/lsync
-    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/sbin/lsync
+        >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/lsync
+    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/lsync
     sed -e "s:@l_prefix@:%{l_prefix}:g" \
         <`SOURCE dot.lsyncrc` \
         >$RPM_BUILD_ROOT%{l_prefix}/local/.lsyncrc
     sed -e "s:@l_prefix@:%{l_prefix}:g" \
         <`SOURCE lsync.8` \
-        >$RPM_BUILD_ROOT%{l_prefix}/man/man8/lsync.8
+        >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/lsync.8
 
     #   install rpm-config tool
     ( l_prefix="%{l_prefix}"
       l_cc="%{l_cc}"
       l_cflags=""
-      l_cppflags="-DOPENPKG -I${l_prefix}/include/rpm -I${l_prefix}/include"
-      l_ldflags="-L${l_prefix}/lib"
+      l_cppflags="-DOPENPKG -I${l_prefix}/include/openpkg/rpm -I${l_prefix}/include/openpkg"
+      l_ldflags="-L${l_prefix}/lib/openpkg"
       l_libs="-lrpmbuild -lrpm -lrpmio -lrpmdb -lrpmpopt -lrpmbeecrypt -lrpmbz2 -lrpmz"
       sed -e "s:@l_prefix@:%{l_prefix}:g" \
           -e "s:@l_cc@:$l_cc:g" \
@@ -847,12 +862,30 @@ Provides:     openpkg = 1.3.1-1.3.1
           -e "s:@l_ldflags@:$l_ldflags:g" \
           -e "s:@l_libs@:$l_libs:g" \
           <`SOURCE rpm-config.sh` \
-          >$RPM_BUILD_ROOT%{l_prefix}/bin/rpm-config
+          >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm-config
     ) || exit $?
-    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/bin/rpm-config
+    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm-config
     sed -e "s:RPM_VERSION:%{V_rpm}:g" \
         <`SOURCE rpm-config.8` \
-        >$RPM_BUILD_ROOT%{l_prefix}/man/man8/rpm-config.8
+        >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm-config.8
+
+    #   move rpm2cpio tool to custom location
+    mv $RPM_BUILD_ROOT%{l_prefix}/bin/rpm2cpio \
+       $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm2cpio
+    mv $RPM_BUILD_ROOT%{l_prefix}/man/man8/rpm2cpio.8 \
+       $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm2cpio.8
+
+    #   move rpm tool to custom location
+    mv $RPM_BUILD_ROOT%{l_prefix}/bin/rpm \
+       $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm
+    ( echo "#!/bin/sh"
+      echo "echo \"openpkg:WARNING: The \\\"%{l_prefix}/bin/rpm\\\" command is deprecated since OpenPKG 2.0!\" 1>&2"
+      echo "echo \"openpkg:WARNING: Use the \\\"%{l_prefix}/bin/openpkg rpm\\\" command instead, please.\" 1>&2"
+      echo "exec %{l_prefix}/bin/openpkg rpm \${1+\"\$@\"}"
+    ) >$RPM_BUILD_ROOT%{l_prefix}/bin/rpm
+    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/bin/rpm
+    mv $RPM_BUILD_ROOT%{l_prefix}/man/man8/rpm.8 \
+       $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rpm.8
 
     #   install RPM extension
     ( cd rpm-%{V_rpm}
@@ -890,8 +923,8 @@ Provides:     openpkg = 1.3.1-1.3.1
     sed -e "s;@l_prefix@;%{l_prefix};g" \
         -e "s;@l_musr@;%{l_musr};g" \
         -e "s;@l_mgrp@;%{l_mgrp};g" \
-        <`SOURCE uuid.sh` >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/uuid.sh
-    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/uuid.sh
+        <`SOURCE uuid.sh` >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/uuid
+    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/uuid
     sed -e "s;@l_prefix@;%{l_prefix};g" \
         -e "s;@l_musr@;%{l_musr};g" \
         -e "s;@l_mgrp@;%{l_mgrp};g" \
@@ -910,6 +943,22 @@ Provides:     openpkg = 1.3.1-1.3.1
         <`SOURCE rpmtool` >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmtool
     chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rpmtool
 
+    #   install OpenPKG tool chain execution frontend
+    sed -e "s;@l_prefix@;%{l_prefix};g" \
+        <`SOURCE openpkg.sh` >$RPM_BUILD_ROOT%{l_prefix}/bin/openpkg
+    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/bin/openpkg
+    sed -e "s:@l_prefix@:%{l_prefix}:g" \
+        <`SOURCE openpkg.1` \
+        >$RPM_BUILD_ROOT%{l_prefix}/man/man1/openpkg.1
+
+    #   install more OpenPKG tool chain commands
+    sed -e "s;@l_prefix@;%{l_prefix};g" \
+        <`SOURCE install.sh` >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/install
+    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/install
+    sed -e "s;@l_prefix@;%{l_prefix};g" \
+        <`SOURCE man.sh` >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/man
+    chmod a+x $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/man
+
     #   install an own copy of shtool
     cp $shtool $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/shtool
     chmod a+x $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/shtool
@@ -953,11 +1002,13 @@ Provides:     openpkg = 1.3.1-1.3.1
     chmod 755 $RPM_BUILD_ROOT%{l_prefix}/etc/rc.d/rc.openpkg
     ( echo "#!/bin/sh"
       echo "exec %{l_prefix}/etc/rc \${1+\"\$@\"}"
-    ) >$RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rc
-    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rc
+    ) >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rc
+    chmod 755 $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rc
+    ln  $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rc \
+        $RPM_BUILD_ROOT%{l_prefix}/lib/openpkg/rc
     sed -e "s:@l_prefix@:%{l_prefix}:g" \
         <`SOURCE rc.8` \
-        >$RPM_BUILD_ROOT%{l_prefix}/man/man8/rc.8
+        >$RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg/rc.8
 
     #   create configuration directory
     test -d $RPM_BUILD_ROOT%{l_prefix}/etc/openpkg || \
@@ -1013,10 +1064,8 @@ Provides:     openpkg = 1.3.1-1.3.1
     %dir %{l_prefix}/RPM/TMP
     %dir %{l_prefix}/cgi
     %dir %{l_prefix}/bin
+    %{l_prefix}/bin/openpkg
     %{l_prefix}/bin/rpm
-    %{l_prefix}/bin/rpm-config
-    %{l_prefix}/bin/rpm2cpio
-    %{l_prefix}/bin/rpmbuild
     %dir %{l_prefix}/etc
     %{l_prefix}/etc/rc
     %config(noreplace) %{l_prefix}/etc/rc.conf
@@ -1030,49 +1079,49 @@ Provides:     openpkg = 1.3.1-1.3.1
     %config %{l_prefix}/etc/openpkg/rpmrc
     %{l_prefix}/etc/openpkg/openpkg.pgp
     %dir %{l_prefix}/include
-    %dir %{l_prefix}/include/rpm
-    %{l_prefix}/include/rpm/argv.h
-    %{l_prefix}/include/rpm/beecrypt.h
-    %{l_prefix}/include/rpm/bzlib.h
-    %{l_prefix}/include/rpm/db.h
-    %{l_prefix}/include/rpm/fts.h
-    %{l_prefix}/include/rpm/glob.h
-    %{l_prefix}/include/rpm/hdrinline.h
-    %{l_prefix}/include/rpm/header.h
-    %{l_prefix}/include/rpm/misc.h
-    %{l_prefix}/include/rpm/popt.h
-    %{l_prefix}/include/rpm/rpmal.h
-    %{l_prefix}/include/rpm/rpmbuild.h
-    %{l_prefix}/include/rpm/rpmcli.h
-    %{l_prefix}/include/rpm/rpmdb.h
-    %{l_prefix}/include/rpm/rpmds.h
-    %{l_prefix}/include/rpm/rpmerr.h
-    %{l_prefix}/include/rpm/rpmfc.h
-    %{l_prefix}/include/rpm/rpmfi.h
-    %{l_prefix}/include/rpm/rpmfile.h
-    %{l_prefix}/include/rpm/rpmhash.h
-    %{l_prefix}/include/rpm/rpmio.h
-    %{l_prefix}/include/rpm/rpmlib.h
-    %{l_prefix}/include/rpm/rpmlog.h
-    %{l_prefix}/include/rpm/rpmmacro.h
-    %{l_prefix}/include/rpm/rpmmessages.h
-    %{l_prefix}/include/rpm/rpmpgp.h
-    %{l_prefix}/include/rpm/rpmps.h
-    %{l_prefix}/include/rpm/rpmspec.h
-    %{l_prefix}/include/rpm/rpmsw.h
-    %{l_prefix}/include/rpm/rpmte.h
-    %{l_prefix}/include/rpm/rpmts.h
-    %{l_prefix}/include/rpm/rpmurl.h
-    %{l_prefix}/include/rpm/stringbuf.h
-    %{l_prefix}/include/rpm/ugid.h
-    %{l_prefix}/include/rpm/zlib.h
+    %dir %{l_prefix}/include/openpkg
+    %dir %{l_prefix}/include/openpkg/rpm
+    %{l_prefix}/include/openpkg/rpm/argv.h
+    %{l_prefix}/include/openpkg/rpm/beecrypt.h
+    %{l_prefix}/include/openpkg/rpm/bzlib.h
+    %{l_prefix}/include/openpkg/rpm/db.h
+    %{l_prefix}/include/openpkg/rpm/fts.h
+    %{l_prefix}/include/openpkg/rpm/glob.h
+    %{l_prefix}/include/openpkg/rpm/hdrinline.h
+    %{l_prefix}/include/openpkg/rpm/header.h
+    %{l_prefix}/include/openpkg/rpm/misc.h
+    %{l_prefix}/include/openpkg/rpm/popt.h
+    %{l_prefix}/include/openpkg/rpm/rpmal.h
+    %{l_prefix}/include/openpkg/rpm/rpmbuild.h
+    %{l_prefix}/include/openpkg/rpm/rpmcli.h
+    %{l_prefix}/include/openpkg/rpm/rpmdb.h
+    %{l_prefix}/include/openpkg/rpm/rpmds.h
+    %{l_prefix}/include/openpkg/rpm/rpmerr.h
+    %{l_prefix}/include/openpkg/rpm/rpmfc.h
+    %{l_prefix}/include/openpkg/rpm/rpmfi.h
+    %{l_prefix}/include/openpkg/rpm/rpmfile.h
+    %{l_prefix}/include/openpkg/rpm/rpmhash.h
+    %{l_prefix}/include/openpkg/rpm/rpmio.h
+    %{l_prefix}/include/openpkg/rpm/rpmlib.h
+    %{l_prefix}/include/openpkg/rpm/rpmlog.h
+    %{l_prefix}/include/openpkg/rpm/rpmmacro.h
+    %{l_prefix}/include/openpkg/rpm/rpmmessages.h
+    %{l_prefix}/include/openpkg/rpm/rpmpgp.h
+    %{l_prefix}/include/openpkg/rpm/rpmps.h
+    %{l_prefix}/include/openpkg/rpm/rpmspec.h
+    %{l_prefix}/include/openpkg/rpm/rpmsw.h
+    %{l_prefix}/include/openpkg/rpm/rpmte.h
+    %{l_prefix}/include/openpkg/rpm/rpmts.h
+    %{l_prefix}/include/openpkg/rpm/rpmurl.h
+    %{l_prefix}/include/openpkg/rpm/stringbuf.h
+    %{l_prefix}/include/openpkg/rpm/ugid.h
+    %{l_prefix}/include/openpkg/rpm/zlib.h
     %dir %{l_prefix}/info
     %dir %{l_prefix}/lib
     %dir %{l_prefix}/lib/openpkg
     %{l_prefix}/lib/openpkg/bash
     %{l_prefix}/lib/openpkg/bzip2
     %{l_prefix}/lib/openpkg/uuid
-    %{l_prefix}/lib/openpkg/uuid.sh
     %{l_prefix}/lib/openpkg/curl
     %{l_prefix}/lib/openpkg/file
     %{l_prefix}/lib/openpkg/gzip
@@ -1103,15 +1152,31 @@ Provides:     openpkg = 1.3.1-1.3.1
     %{l_prefix}/lib/openpkg/rpmx.sh
     %{l_prefix}/lib/openpkg/shtool
     %{l_prefix}/lib/openpkg/tar
-    %{l_prefix}/lib/librpm.a
-    %{l_prefix}/lib/librpmbeecrypt.a
-    %{l_prefix}/lib/librpmbuild.a
-    %{l_prefix}/lib/librpmbz2.a
-    %{l_prefix}/lib/librpmdb.a
-    %{l_prefix}/lib/librpmio.a
-    %{l_prefix}/lib/librpmpopt.a
-    %{l_prefix}/lib/librpmz.a
+    %{l_prefix}/lib/openpkg/librpm.a
+    %{l_prefix}/lib/openpkg/librpmbeecrypt.a
+    %{l_prefix}/lib/openpkg/librpmbuild.a
+    %{l_prefix}/lib/openpkg/librpmbz2.a
+    %{l_prefix}/lib/openpkg/librpmdb.a
+    %{l_prefix}/lib/openpkg/librpmio.a
+    %{l_prefix}/lib/openpkg/librpmpopt.a
+    %{l_prefix}/lib/openpkg/librpmz.a
     %dir %{l_prefix}/libexec
+    %dir %{l_prefix}/libexec/openpkg
+    %{l_prefix}/libexec/openpkg/uuid
+    %{l_prefix}/libexec/openpkg/man
+    %{l_prefix}/libexec/openpkg/install
+    %{l_prefix}/libexec/openpkg/lsync
+    %{l_prefix}/libexec/openpkg/lsync.8
+    %{l_prefix}/libexec/openpkg/rc
+    %{l_prefix}/libexec/openpkg/rc.8
+    %{l_prefix}/libexec/openpkg/rpm-config
+    %{l_prefix}/libexec/openpkg/rpm-config.8
+    %{l_prefix}/libexec/openpkg/rpm2cpio
+    %{l_prefix}/libexec/openpkg/rpm2cpio.8
+    %{l_prefix}/libexec/openpkg/rpmbuild
+    %{l_prefix}/libexec/openpkg/rpmbuild.8
+    %{l_prefix}/libexec/openpkg/rpm
+    %{l_prefix}/libexec/openpkg/rpm.8
     %dir %{l_prefix}/man
     %dir %{l_prefix}/man/man1
     %dir %{l_prefix}/man/man2
@@ -1131,17 +1196,11 @@ Provides:     openpkg = 1.3.1-1.3.1
     %dir %{l_prefix}/man/cat7
     %dir %{l_prefix}/man/cat8
     %dir %{l_prefix}/man/cat9
-    %{l_prefix}/man/man8/lsync.8
-    %{l_prefix}/man/man8/rc.8
-    %{l_prefix}/man/man8/rpm-config.8
-    %{l_prefix}/man/man8/rpm.8
-    %{l_prefix}/man/man8/rpm2cpio.8
-    %{l_prefix}/man/man8/rpmbuild.8
+    %{l_prefix}/man/man1/openpkg.1
     %dir %{l_prefix}/sbin
     %dir %{l_prefix}/pub
     %dir %{l_prefix}/share
     %dir %{l_prefix}/var
-    %{l_prefix}/sbin/lsync
     %dir %{l_prefix}/local
     %{l_prefix}/local/README
     %{l_prefix}/local/.lsyncrc
@@ -1748,9 +1807,16 @@ Provides:     openpkg = 1.3.1-1.3.1
 
     #   remember what OpenPKG RPM version was installed, so we can
     #   correctly upgrade the RPM database in the %post section (see below).
-    if [ -d ${prefix}/RPM/DB -a -x ${prefix}/bin/rpm ]; then
+    if [ -d ${prefix}/RPM/DB ]; then
+        if [ -x "${prefix}/bin/openpkg" -a -x "${prefix}/libexec/openpkg/rpm" ]; then
+            #   OpenPKG 2.0
+            rpm="${prefix}/bin/openpkg rpm"
+        else
+            #   OpenPKG 1.x
+            rpm="${prefix}/bin/rpm"
+        fi
         rm -f ${prefix}/RPM/DB/.version >/dev/null 2>&1 || true
-        ${prefix}/bin/rpm --version |\
+        $rpm --version |\
             sed -e 's;^;X;' \
                 -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \
                 -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \
@@ -1760,7 +1826,7 @@ Provides:     openpkg = 1.3.1-1.3.1
 
 %post
     #   update or initially create OpenPKG UUID configuration
-    %{l_prefix}/lib/openpkg/uuid.sh update >/dev/null 2>&1 || true
+    %{l_prefix}/bin/openpkg uuid update >/dev/null 2>&1 || true
 
     #   determine new and old OpenPKG RPM version
     V_rpm_new="%{V_rpm}"
@@ -1791,10 +1857,10 @@ Provides:     openpkg = 1.3.1-1.3.1
           echo "be used, but it is strongly recommended to up upgrade it"
           echo "as soon as possible to the latest Berkeley-DB format files"
           echo "by executing the command:"
-          echo "    \$ %{l_prefix}/bin/rpm --db-rebuild"
+          echo "    \$ %{l_prefix}/bin/openpkg rpm --db-rebuild"
           echo "In case of problems with the RPM database you can always"
           echo "execute the command:"
-          echo "    \$ %{l_prefix}/bin/rpm --db-cleanup"
+          echo "    \$ %{l_prefix}/bin/openpkg rpm --db-cleanup"
         ) | %{l_prefix}/lib/openpkg/rpmtool msg -b -t warn
     fi
 

+ 1 - 0
openpkg/pod2man.sh

@@ -1,4 +1,5 @@
 #!/bin/sh
+pod2man --section=1 --center="OpenPKG" --release="OPENPKG(8)"    --date="OpenPKG" --quotes=none openpkg.pod    >openpkg.1
 pod2man --section=8 --center="OpenPKG" --release="RC(8)"         --date="OpenPKG" --quotes=none rc.pod         >rc.8
 pod2man --section=8 --center="OpenPKG" --release="RPMTOOL(8)"    --date="OpenPKG" --quotes=none rpmtool.pod    >rpmtool.8
 pod2man --section=8 --center="OpenPKG" --release="LSYNC(8)"      --date="OpenPKG" --quotes=none lsync.pod      >lsync.8

+ 3 - 3
openpkg/rc.openpkg

@@ -17,15 +17,15 @@
     echo "openpkg_active=\"$openpkg_active\""
 
 %info -o
-    @l_prefix@/lib/openpkg/uuid.sh info
+    @l_prefix@/bin/openpkg uuid info
 
 %start
     rcService openpkg enable yes || exit 0
-    @l_prefix@/lib/openpkg/uuid.sh update >/dev/null 2>&1 || true
+    @l_prefix@/bin/openpkg uuid update >/dev/null 2>&1 || true
 
 %daily
     rcService openpkg enable yes || exit 0
-    @l_prefix@/lib/openpkg/uuid.sh update >/dev/null 2>&1 || true
+    @l_prefix@/bin/openpkg uuid update >/dev/null 2>&1 || true
 
 %env -p0
     rcService openpkg enable yes || exit 0

+ 3 - 3
openpkg/root.README

@@ -5,13 +5,13 @@
 
   Short OpenPKG RPM query command summary:
 
-  $ @l_prefix@/bin/rpm -qa
+  $ @l_prefix@/bin/openpkg rpm -qa
     (q)uery list of (a)ll installed packages
 
-  $ @l_prefix@/bin/rpm -qi <name>
+  $ @l_prefix@/bin/openpkg rpm -qi <name>
     (q)uery (i)nformation about package <name>
 
-  $ @l_prefix@/bin/rpm -qlv <name>
+  $ @l_prefix@/bin/openpkg rpm -qlv <name>
     (q)uery (v)erbose (l)ist of installed files of package <name>
 
   Use "eval `@l_prefix@/etc/rc --eval all env`" from within a user's

+ 3 - 3
openpkg/rpmdb

@@ -117,7 +117,7 @@ if [ ".$dbpath" = . ]; then
     dbpath="$prefix/RPM/DB"
 fi
 if [ ".$rpm" = . ]; then
-    rpm="$prefix/bin/rpm"
+    rpm="$prefix/bin/openpkg rpm"
 fi
 
 ##
@@ -209,7 +209,7 @@ db_wait () {
     verbose 2 "waiting for RPM database to be available"
     local i=0
     while [ $i -lt 10 ]; do
-        if $prefix/bin/rpm -q openpkg >/dev/null 2>&1; then
+        if $prefix/libexec/openpkg/rpm -q openpkg >/dev/null 2>&1; then
             break
         fi
         sleep 1
@@ -361,7 +361,7 @@ fi
 if [ ! -d $prefix ]; then
     error "OpenPKG instance directory \"$prefix\" not found"
 fi
-if [ ! -x $prefix/bin/rpm ]; then
+if [ ! -x $prefix/bin/openpkg ]; then
     error "OpenPKG instance directory \"$prefix\" not valid"
 fi
 

+ 6 - 3
openpkg/rpmmacros

@@ -27,7 +27,7 @@
 ##
 
 #   the OpenPKG release identification (for the current package or as a fallback for the bootstrap package)
-%l_openpkg_release(F:)   %(echo "%{?release}%{!?release:%(%{l_prefix}/bin/rpm -q --qf '%{release}' openpkg)}" | sed -e 's;^;X;' -e 's;^X\\([0-9][0-9]*\\.[0-9][0-9]*\\).*$;\\1;' -e 's;^X\\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\)$;CURRENT;' -e 's;^X.*$;UNKNOWN;' | awk '{ printf(%{?-F:%{-F*}}%{!?-F:"OpenPKG-%s"}, $0); }')
+%l_openpkg_release(F:)   %(echo "%{?release}%{!?release:%(%{l_rpm} -q --qf '%{release}' openpkg)}" | sed -e 's;^;X;' -e 's;^X\\([0-9][0-9]*\\.[0-9][0-9]*\\).*$;\\1;' -e 's;^X\\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\)$;CURRENT;' -e 's;^X.*$;UNKNOWN;' | awk '{ printf(%{?-F:%{-F*}}%{!?-F:"OpenPKG-%s"}, $0); }')
 
 #   the OpenPKG OIDs (root is officially registered at IANA)
 %l_openpkg_oid           1.3.6.1.4.1.18749
@@ -230,7 +230,10 @@
 
 #   provide fixed paths to tools (additional)
 %l_rc                    %{l_prefix}/etc/rc
-%l_rpm                   %{l_prefix}/bin/rpm
+%l_rpm                   %{l_prefix}/libexec/openpkg/rpm
+%l_rpm2cpio              %{l_prefix}/libexec/openpkg/rpm2cpio
+%l_rpm_config            %{l_prefix}/libexec/openpkg/rpm-config
+%l_lsync                 %{l_prefix}/libexec/openpkg/lsync
 %l_rpmtool               %{l_prefix}/lib/openpkg/rpmtool
 %l_shtool                %{l_prefix}/lib/openpkg/shtool
 %l_curl                  %{l_prefix}/lib/openpkg/curl
@@ -330,7 +333,7 @@ Provides: %{name}::%{1} = %(echo '%{expand:%%{%{1}}}' | sed -e 's;%%;%%%%;g' -e
     %{nil}
 
 #   macro-processor add-on for testing external conditions
-%l_test(pfd)             %(if [ ".%{?-p:yes}" = .yes ]; then %{l_prefix}/bin/rpm -q %1 >/dev/null 2>&1; rc=$?; elif [ ".%{?-f:yes}" = .yes ]; then test -f %1; rc=$?; elif [ ".%{?-d:yes}" = .yes ]; then test -d %1; rc=$?; fi; if [ ".$rc" = .0 ]; then echo "yes"; else echo "no"; fi)
+%l_test(pfd)             %(if [ ".%{?-p:yes}" = .yes ]; then %{l_rpm} -q %1 >/dev/null 2>&1; rc=$?; elif [ ".%{?-f:yes}" = .yes ]; then test -f %1; rc=$?; elif [ ".%{?-d:yes}" = .yes ]; then test -d %1; rc=$?; fi; if [ ".$rc" = .0 ]; then echo "yes"; else echo "no"; fi)
 
 #   default list of vendor source fetching locations
 %l_fetch_mirror_0        -

+ 1 - 1
openpkg/rpmx.pl

@@ -39,7 +39,7 @@ my $CFG = {
 
 #   determine path to executables
 my $prefix = shift(@ARGV);
-$CFG->{PRG}->{"rpm"}   = $prefix."/bin/rpm";
+$CFG->{PRG}->{"rpm"}   = $prefix."/libexec/openpkg/rpm";
 $CFG->{PRG}->{"curl"}  = $prefix."/lib/openpkg/curl";
 $CFG->{PRG}->{"bzip2"} = $prefix."/lib/openpkg/bzip2";
 $CFG->{PRG}->{"gzip"}  = $prefix."/lib/openpkg/gzip";

+ 1 - 1
openpkg/uuid.sh

@@ -28,7 +28,7 @@
 prefix="@l_prefix@"
 musr="@l_musr@"
 mgrp="@l_mgrp@"
-prog_rpm="$prefix/bin/rpm"
+prog_rpm="$prefix/libexec/openpkg/rpm"
 prog_shtool="$prefix/lib/openpkg/shtool"
 prog_uuid="$prefix/lib/openpkg/uuid"
 file_uuid="$prefix/etc/openpkg/uuid"