Hi,

deb_{install,remove} worked fine, but had some problems with regard to conf
files etc. Reimplementing dpkg's behaviour in a simple fell script is not
feasible in the short life span of these scripts.

I therefore followed another approach in my new script, dpkg_hurd, which is
heavily based on Jeff's deb_install. It is a all-in-on-place package:

Install a package:  dpkg_hurd -i|--install packagefile.deb
Remove  a package:  dpkg_hurd -r|--remove  packagename
Purge   a package:  dpkg_hurd --purge      packagename

You can also use the options "-s, -S, -l, -L" as under Debian GNU/Linux. The
only thing the script does here is adding "--root=." to the dpkg invocation.
The behaviour in the above cases is a bit more complex.

When installing, the script does build a new Debian package, containing not
the installation scripts, and hands that over to dpkg. When removing, it moves
the installed removal scripts out of the way. Because of the rebuild, you
need thrice the disk space available as the size of the Debian package
itself. This could be optimized by modifying the ar archive directly. I
couldn't figure out how, maybe someone else wants to do it. (Dpkg does add a
special header to the ar archive, which gets mangled when you perform
operations on the archive).

The advantage is that no installation knowledge is builtin the script. It
leaves everything to dpkg, who knows well how to do it. This should solve
all sort of conffile and other problems. A further advantage is that the new
script is simple.

Have fun,
Marcus

-- 
"Rhubarb is no Egyptian god."        Debian GNU/Linux        finger brinkmd@ 
Marcus Brinkmann                   http://www.debian.org    master.debian.org
[EMAIL PROTECTED]                        for public  PGP Key
http://homepage.ruhr-uni-bochum.de/Marcus.Brinkmann/       PGP Key ID 36E7CD09
#!/bin/sh
#
# Copyright (c) 1998 - This script is hereby placed in the public domain
#                      by Marcus Brinkmann.
#
# dpkg_hurd - poor man's dpkg.
#
# Usage - dpkg_hurd -i|--install package_*.deb
#    or - dpkg_hurd -r|--remove package
#    or - dpkg_hurd --purge package
#    or - dpkg_hurd -s|-L package
#    or - dpkg_hurd -l|-S  pattern
#
# Warning: This script is for bootstrapping a Debian/Gnu Hurd system
#          onto an empty ext2 partition.  The {pre,post}{inst,rem}
#          scripts are not run.
#
# Change history:
#    19 Dec 1998 - v0.0 <[EMAIL PROTECTED]>
#        Original created by Marcus Brinkmann.
#    22 Dec 1998 - v0.1 Jeff Sheinberg <[EMAIL PROTECTED]>
#        Error checking, automatic update of status file.
#    24 Dec 1998 - v0.2 Jeff Sheinberg <[EMAIL PROTECTED]>
#        Remove by package name, fix bugs in name.list file creation.
#    TODO - add lockfile and trap exit & int, merge with deb_remove.
#    28 Dec 1998 - v0.3 Marcus Brinkmann <[EMAIL PROTECTED]>
#        Extract package name from deb file, not from file name.
#        Rebuild package w/o install scripts and use dpkg directly.
#        Added -r and -p as well as -s,-S,-l,-L options.
#    TODO - fix all those race conditions and use proper tmp dir!

set -u -e

PS4='+$LINENO: '

err ()
{
    echo "$0: $1" 1>&2
    exit 1
}

vld="var/lib/dpkg"
vldi="${vld}/info"
[ -d ./${vld} ] || \
  err "cd is \`$PWD', must be run from a dpkg root directory"
[ -d ./lost+found ] || \
  err "cd is \`$PWD', must be run from a partition root filesystem directory"
[ -L ./usr -a ./ -ef usr/ ] \
  || err "cd is \`$PWD', must be run from a hurd root filesystem directory"

[ "$#" == 2 ] || err "exactly two arguments, an action and a *.deb file or 
package name is required"

if [ "${1}" == "-i" -o "${1}" == "--install" ] ; then

        file="${2}"
        name=`dpkg --info ${file} | grep Package - | sed -e "s/ Package: //"`

        [ -f ${file} ] || err "file \`${file}' does not exist"

        # Construct directory hierarchie
        ctrl=temp_build/${name}/DEBIAN
        mkdir -m 0755 -p ${ctrl}

        # Extract the files from the .deb archive.
        dpkg-deb --extract ${file} ${ctrl}/..

        # Extract control info and create control files.
        dpkg-deb --control ${file} ${ctrl}

        # Move the package scripts out of the build dir.
        for f in preinst postinst prerm postrm
        do
          if [ -e ${ctrl}/${f} ] ; then
             mv ${ctrl}/${f} temp_build/
          fi 
        done

        # Now repack the file.
        dpkg --build temp_build/${name}

        # Move old prerm and postrm scripts out of the way.
        for f in prerm postrm
        do
          if [ -e ${vldi}/${name}.${f} ] ; then
             mv ${vldi}/${name}.${f} ${vldi}/${name}.${f}.backup
          fi
        done

        dpkg --root=. --force-architecture --install temp_build/${name}.deb

        # Move new package scripts into dpkg's repository
        for f in preinst postinst prerm postrm
        do
          if [ -e temp_build/${f} ] ; then
             mv temp_build/${f} ${vldi}/${name}.${f}
          fi
          if [ -e ${vldi}/${name}.${f}.backup ] ; then
             rm ${vldi}/${name}.${f}.backup
          fi
        done

        # Clean temp directory.
        rm -fR temp_build

fi

if [ "${1}" == "-r" -o "${1}" == "--remove" -o "${1}" == "--purge" ] ; then

        name="${2}"
        # Move old prerm and postrm scripts out of the way.
        for f in prerm postrm
        do
          if [ -e ${vldi}/${name}.${f} ] ; then
             mv ${vldi}/${name}.${f} ${vldi}/${name}.${f}.backup
          fi
        done

        dpkg --root=. --force-architecture ${1} ${name}

        for f in prerm postrm
        do
          if [ -e ${vldi}/${name}.${f}.backup ] ; then
             rm ${vldi}/${name}.${f}.backup
          fi
        done

fi
        
if [ "${1}" == "-s" -o "${1}" == "-S" -o "${1}" == "-l" -o "${1}" == "-L" ] ; 
then
        dpkg --root=. "${1}" "${2}"
fi

exit 0  

# deb_hurd - end of file.

Reply via email to