RPM Community Forums

Mailing List Message of <rpm-devel>

Re: strange RPMDB problem: messed up entries (regularily)

From: Ralf S. Engelschall <rse+rpm-devel@rpm5.org>
Date: Mon 18 Aug 2008 - 14:26:52 CEST
Message-ID: <20080818122652.GA55997@engelschall.com>
On Mon, Aug 18, 2008, Ralf S. Engelschall wrote:

> [...]
> | error: rpmdb: skipping h#      42 blob size(4140): BAD, 8 + 16 * il(959996723) + dl(825374516)
> | error: db4 error(-30986) from dbcursor->get: DB_PAGE_NOTFOUND: Requested page not found
>
> Notice the error at the end. I can easily recover from this problem
> by just running "openpkg rpm --rebuilddb". This then once again shows
> the same error but at least results in no more errors during the next
> "openpkg rpm -qa". BUT! The problem then is still not gone: "openpkg rpm
> -qi openpkg" then shows:
>
> | # /usr/opkg/bin/openpkg rpm -qi openpkg
> | package openpkg is not installed

It now happened just again on a different instance. Interesting aspect
I found out this time:

| # /v/en/sw/bin/openpkg rpm -qa
| [...]
| error: rpmdb: skipping h#      30 blob size(3940): BAD, 8 + 16 * il(75) + dl(2952)
| error: rpmdb: skipping h#      37 blob size(4768): BAD, 8 + 16 * il(81) + dl(9152)
| error: rpmdb: skipping h#      39 blob size(122300): BAD, 8 + 16 * il(825308978) + dl(929380405)
| error: rpmdb: skipping h#      40 blob size(4164): BAD, 8 + 16 * il(825374516) + dl(1647719268)
| error: db4 error(-30986) from dbcursor->get: DB_PAGE_NOTFOUND: Requested page not found
| en# /v/en/sw/bin/openpkg rpm --db-rebuild
| rpmdb: REBUILDING NEW FROM OLD RPM DATABASE (/v/en/sw/RPM/DB)
| rpmdb: cleaning up RPM database DB files
| rpmdb: making sure RPM database are of the correct type
| rpmdb: dumping and reloading RPM database DB file contents
| rpmdb: rebuilding RPM database (built-in RPM procedure)
| rpmdb: making sure RPM database files have consistent attributes
| rpmdb: performing read/write operation on RPM database
| # /v/en/sw/bin/openpkg rpm -qa
| make-3.81-20080101
| m4-1.4.11-20080403
| binutils-2.18-20080101
| grep-2.5.3-20080101
| [...]
| # /v/en/sw/bin/openpkg rpm -q openpkg
| openpkg-4.0b5-20080726

Notice the "--db-rebuild" instead of "--rebuildb" here and the fact
that with "--rebuilddb" I usually loose the "openpkg" entry while with
"--db-rebuild" I do not.

To explain: "--db-xxxx" are RPM aliases to OpenPKG's "rpmdb" addon
script and its "--db-rebuild" actually does a full "dump" and "restore"
with the Berkeley-DB tool (for details see the attached script) while
"--rebuildb" is RPM-internal.

Very interesting that the full dump/restore via external tools is
able to resurrect the database without information loss while RPM's
--rebuilddb seems to kick away data. Hmm...

                                       Ralf S. Engelschall
                                       rse@engelschall.com
                                       www.engelschall.com

##
##  rpmdb -- OpenPKG RPM Database Administration Utility
##  Copyright (c) 2000-2008 OpenPKG GmbH <http://openpkg.com/>
##
##  This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
##  All rights reserved. Licenses which grant limited permission to use,
##  copy, modify and distribute this software are available from the
##  OpenPKG GmbH.
##
##  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.
##

#   program information
progname="rpmdb"

#   configuration defaults
help=""
prefix="/usr/opkg"
dbpath=""
dbapi=""
tmpdir=""
rpm=""
musr="opkg"
mgrp="opkg"
mode=""
force=no
verbose=2

##
##  PARSE COMMAND LINE
##

#   iterate over argument line
args=""
for opt
do
    case $opt in
        -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
           *) arg='' ;;
    esac
    case $opt in
        -h|--help      ) help="Usage"  ;;
        -B|--build     ) mode=build    ;;
        -M|--migrate   ) mode=migrate  ;;
        -R|--rebuild   ) mode=rebuild  ;;
        -C|--cleanup   ) mode=cleanup  ;;
        -F|--fixate    ) mode=fixate   ;;
        -L|--list      ) mode=list     ;;
        -f|--force     ) force=yes     ;;
        -q|--quiet     ) verbose=0     ;;
        -v|--verbose   ) verbose=`expr $verbose + 1` ;;
        --prefix=*     ) prefix=$arg   ;;
        --dbpath=*     ) dbpath=$arg   ;;
        --dblib=*      ) dblib=$arg    ;;
        --tmpdir=*     ) tmpdir=$arg   ;;
        --rpm=*        ) rpm=$arg      ;;
        --musr=*       ) musr=$arg     ;;
        --mgrp=*       ) mgrp=$arg     ;;
        --             ) ;;
        -*             ) help="Invalid option \`$opt'"; break ;;
        *              ) args="$args \"$opt\"" ;;
    esac
done
eval "set -- $args"

#   make sure exactly one run-time mode is specified
if [ ".$mode" = . ]; then
    help="No or invalid run-time mode specified"
fi

#   error or usage message
if [ ".$help" != . ]; then
    if [ ".$help" != ".Usage" ]; then
        echo "$progname:ERROR: $help" 1>&2
    fi
    cat 1>&2 <<EOT
$progname:USAGE: $progname [options]

  -h, --help        print usage message (this one)
  -B, --build       build new RPM database from scratch
  -M, --migrate     migrate RPM database to new format
  -R, --rebuild     rebuild new from old RPM database
  -C, --cleanup     cleanup existing RPM database
  -F, --fixate      fixate existing RPM database
  -L, --list        list all RPM database files
  -f, --force       operate in force mode (no save operations)
  -q, --quiet       operate in quiet mode (no verbose messages at all)
  -v, --verbose     operate in more verbose mode (increase verbose level)
  --prefix=PREFIX   use OpenPKG instance under PREFIX
  --dbpath=PATH     use OpenPKG RPM database under PATH
  --dblib=LIB       use OpenPKG RPM database backend library ("db" or "sqlite")
  --tmpdir=PATH     use OpenPKG temporary directory under PATH
  --rpm=PROG        use OpenPKG RPM executable PROG
  --musr=USERNAME   use OpenPKG management user USERNAME
  --mgrp=GROUPNAME  use OpenPKG management group GROUPNAME

This is OpenPKG rpmdb, an RPM database administration utility, providing
lower-level maintainance functions for the Berkeley-DB based RPM
database. It allows building new RPM databases from scratch, rebuilding
a new from an old RPM database (content dumping and reloading),
cleaning up problems on an existing RPM database (removal of DB region
files, etc) and fixating the files in an existing RPM database (file
attributes).

EOT
    if [ ".$help" != ".Usage" ]; then
        exit 2
    else
        exit 0
    fi
fi

#   delayed determination of variables
if [ ".$dbpath" = . ]; then
    dbpath="$prefix/RPM/DB"
fi
if [ ".$dblib" = . ]; then
    dblib="${1-db}"
fi
if [ ".$tmpdir" = . ]; then
    tmpdir="$prefix/RPM/TMP"
fi
if [ ".$rpm" = . ]; then
    rpm="$prefix/bin/openpkg rpm"
fi

##
##  DATABASE FILE INFORMATION
##

dbfiles="
    3:btree:Basenames
    3:btree:Conflictname
    3:temporary:Depends
    3:btree:Dirnames
    3:btree:Filedigests
    3:btree:Group
    3:btree:Installtid
    3:btree:Name
    3:hash:Packagecolor
    3:btree:Packages
    3:btree:Providename
    3:btree:Provideversion
    3:hash:Pubkeys
    3:btree:Requirename
    3:btree:Requireversion
    3:hash:Sha1header
    3:hash:Sigmd5
    3:btree:Triggername
    3:btree:Nvra
    3:btree:Sourcepkgid
    3:btree:BuildEnvironment
    3:region:__db.001
    3:region:__db.002
    3:region:__db.003
    3:region:__db.004
    3:region:__db.005
    3:region:__db.006
    3:region:__db.007
    3:region:__db.008
    3:region:__db.009
    4:*:Basenames
    4:*:Conflictname
    4:temporary:Depends
    4:*:Dirnames
    4:*:Filedigests
    4:*:Group
    4:*:Installtid
    4:*:Name
    4:*:Packagecolor
    4:*:Packages
    4:*:Providename
    4:*:Provideversion
    4:*:Pubkeys
    4:*:Requirename
    4:*:Requireversion
    4:*:Sha1header
    4:*:Sigmd5
    4:*:Triggername
    4:*:Nvra
    4:*:Sourcepkgid
    4:*:BuildEnvironment
"

##
##  HELPER FUNCTIONS
##

error () {
    echo "$progname:ERROR: $*" 1>&2
    exit 1
}

warning () {
    echo "$progname:WARNING: $*" 1>&2
}

verbose () {
    local level=$1
    shift
    if [ $level -le $verbose ]; then
        local lead=""
        case "$level" in
            1 ) lead="" ;;
            2 ) lead="" ;;
            3 ) lead="  " ;;
            * ) lead="    " ;;
        esac
        echo "$progname: $lead$*" 1>&2
    fi
}

rpmdb_version_load () {
    if [ -f $dbpath/VERSION ]; then
        eval `(. $dbpath/VERSION || exit $?; echo "DBAPI=\"$DBAPI\"; DBLIB=\"$DBLIB\"; DBVER=\"$DBVER\"")`
    fi
    if [ ".$DBAPI" = . ]; then DBAPI="3";     fi
    if [ ".$DBLIB" = . ]; then DBLIB="db";    fi
    if [ ".$DBVER" = . ]; then DBVER="4.1.2"; fi
}

rpmdb_version_save () {
    if [ ".$DBAPI" = .3 ]; then
        DBLIB="db"
        DBVER=`$rpmdb_load -V 2>&1 |\
            grep 'Berkeley DB [0-9][0-9]*\.[0-9][0-9]*' |\
            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.0;' \
                -e 's;^X.*$;0.0.0;'`
    elif [ ".$DBAPI" = .4 ]; then
        DBLIB="sqlite"
        DBVER=`$rpmdb_sqlite --version 2>&1 |\
            grep '^[0-9][0-9]*\.[0-9][0-9]*' |\
            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.0;' \
                -e 's;^X.*$;0.0.0;'`
    fi
    ( echo "DBAPI=$DBAPI"
      echo "DBLIB=$DBLIB"
      echo "DBVER=$DBVER"
    ) >$dbpath/VERSION.new || exit $?
    mv $dbpath/VERSION.new $dbpath/VERSION || exit $?
    chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true
    chmod 644 $dbpath/VERSION 2>/dev/null || true
}

rpm () {
    local opts="--define '_dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`'"
    opts="$opts --define '_repackage_all_erasures 0'"
    if [ ".$force" = .yes ]; then
        opts="$opts --define '__dbi_private yes'"
    fi
    verbose 3 "run: $rpm $opts $@"
    eval "$rpm $opts \"\$@\""
}

rpmdb_load="$prefix/lib/openpkg/db_tool load"
rpmdb_dump="$prefix/lib/openpkg/db_tool dump"
rpmdb_sqlite="$prefix/lib/openpkg/sqlite3"

##
##  RPM DATABASE OPERATIONS
##

db_wait () {
    #   wait until RPM has released the database in case we are called
    #   asynchronously to RPM (especially important when upgrading from
    #   RPM 4.0 where concurrent access is still not possible)
    verbose 2 "waiting for RPM database to be available"
    local i=0
    while [ $i -lt 10 ]; do
        if $prefix/libexec/openpkg/rpm -q openpkg >/dev/null 2>&1; then
            break
        fi
        sleep 1
        i=`expr $i + 1`
    done
    if [ $i -eq 10 ]; then
        exit 1
    else
        exit 0
    fi
}

db_remove () {
    #   remove all known files
    verbose 2 "removing (possibly existing) old RPM database DB files"
    for dbfile in $dbfiles; do
        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
        verbose 3 "removing database file: $dbpath/$dbfile ($dbapi:$dbtype)"
        rm -f $dbpath/$dbfile
    done
}

db_init () {
    #   perform official "initdb" operation
    verbose 2 "creating new RPM database (built-in RPM procedure)"
    rpm --initdb
    rpmdb_version_save
}

db_unbreak () {
    #   cleanup DB files
    verbose 2 "cleaning up RPM database DB files"
    for dbfile in $dbfiles; do
        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
        if [ -f $dbpath/$dbfile ]; then
            if [ ".$dbapi" = .3 -a ".$dbtype" = .region ]; then
                verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)"
                rm -f $dbpath/$dbfile || true
            elif [ ".$dbtype" = .temporary ]; then
                verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)"
                rm -f $dbpath/$dbfile || true
            fi
        fi
    done
}

db_convert () {
    #   make sure all RPM database DB files have the correct type
    #   (as the type can be different during upgrading from RPM 4 to RPM 5)
    verbose 2 "making sure RPM database are of the correct type"
    for dbfile in $dbfiles; do
        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
        if [ ".$dbapi" != ".$DBAPI" ]; then
            continue
        fi
        if [ -f $dbpath/$dbfile ]; then
            if [ ".$dbapi" = .3 ] && [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
                dbtype_old="`$rpmdb_dump -h $tmpdir -r $dbpath/$dbfile | grep '^type=' | sed -e 'q' | sed -e 's/^type=//'`"
                if [ ".$dbtype_old" != ".$dbtype" ]; then
                    verbose 3 "converting DB file: $dbpath/$dbfile ($dbtype_old -> $dbtype)"
                    rm -f $dbpath/$dbfile.new
                    $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\
                    sed -e "s/^type=.*/type=$dbtype/" -e '/^h_nelem=.*/d' |\
                    $rpmdb_load -h $tmpdir $dbpath/$dbfile.new
                    if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then
                        rm -f $dbpath/$dbfile
                        mv $dbpath/$dbfile.new $dbpath/$dbfile
                    else
                        warning "failed to convert RPM DB file \"$dbfile\""
                    fi
                fi
            fi
        fi
    done
}

db_reload () {
    #   rebuilding new from old RPM database DB files by dumping and
    #   reloading their entire content
    verbose 2 "dumping and reloading RPM database DB file contents"
    for dbfile in $dbfiles; do
        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
        if [ ".$dbapi" != ".$DBAPI" ]; then
            continue
        fi
        if [ -f $dbpath/$dbfile ]; then
            if [ ".$dbapi" = .3 ]; then
                verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)"
                if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
                    rm -f $dbpath/$dbfile.new
                    $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\
                    $rpmdb_load -h $tmpdir $dbpath/$dbfile.new
                    if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then
                        rm -f $dbpath/$dbfile
                        mv $dbpath/$dbfile.new $dbpath/$dbfile
                    else
                        warning "failed to reload RPM DB file \"$dbfile\""
                    fi
                elif [ ".$dbtype" = .region ]; then
                    rm -f $dbpath/$dbfile || true
                elif [ ".$dbtype" = .temporary ]; then
                    rm -f $dbpath/$dbfile || true
                fi
            elif [ ".$dbapi" = .4 ]; then
                verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)"
                rm -f $dbpath/$dbfile.new
                $rpmdb_sqlite $dbpath/$dbfile .dump |\
                $rpmdb_sqlite $dbpath/$dbfile.new
                if $rpmdb_sqlite $dbpath/$dbfile.new >/dev/null 2>&1; then
                    rm -f $dbpath/$dbfile
                    mv $dbpath/$dbfile.new $dbpath/$dbfile
                else
                    warning "failed to reload RPM DB file \"$dbfile\""
                fi
            fi
        fi
    done
    rpmdb_version_save
}

db_migrate () {
    #   perform database migration
    if [ ".$1" != . ]; then
        dblib="$1"
    fi
    dbapi_old="$DBAPI"
    if [ ".$dblib" = .db ]; then
        dbapi_new="3"
    elif [ ".$dblib" = .sqlite ]; then
        dbapi_new="4"
    else
        error "unknown RPM database backend library \"$dblib\""
    fi
    if [ ".$dbapi_new" = ".$dbapi_old" ]; then
        error "RPM database already uses requested backend ($DBAPI:$DBLIB:$DBVER)"
    fi
    verbose 2 "migrating RPM database"
    rpm --rebuilddb --dbapi "$dbapi_old" --rebuilddbapi "$dbapi_new"
    verbose 3 "old RPM database format: $DBAPI:$DBLIB:$DBVER"
    DBAPI="$dbapi_new"
    rpmdb_version_save
    rpmdb_version_load
    verbose 3 "new RPM database format: $DBAPI:$DBLIB:$DBVER"
}

db_rebuild () {
    #   perform official "rebuilddb" operation
    verbose 2 "rebuilding RPM database (built-in RPM procedure)"
    rpm --rebuilddb
    rpmdb_version_save
}

db_operate () {
    #   perform some read/write operation on RPM database
    #   (we have no package available, but removing and reimporting
    #   the OpenPKG OpenPGP keys is a harmless thing and always possible)
    verbose 2 "performing read/write operation on RPM database"
    for spec in \
        openpkg.org.pgp:gpg-pubkey-63c4cb9f-3c591eda \
        openpkg.com.pgp:gpg-pubkey-61b7ae34-4544a6af \
        openpkg.net.pgp:gpg-pubkey-52197903-4544a74d \
    ; do
        eval `echo "$spec" | sed -e 's/^\(.*\):\(.*\)$/file="\1"; package="\2"/'`
        rpm -q $package >/dev/null 2>&1 && rpm -e $package --allmatches || true
        rpm -q $package >/dev/null 2>&1 || rpm --import $prefix/etc/openpkg/$file || true
    done
    rpm -qa >/dev/null 2>&1
}

db_fixate () {
    #   fix ownership and permissions of (especially newly created)
    #   RPM database files to make sure they are consistent
    verbose 2 "making sure RPM database files have consistent attributes"
    for dbfile in $dbfiles; do
        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
        if [ ".$dbapi" != ".$DBAPI" ]; then
            continue
        fi
        verbose 3 "fixating DB file: $dbpath/$dbfile ($dbtype)"
        if [ -f $dbpath/$dbfile ]; then
            chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true
            chmod 644 $dbpath/$dbfile 2>/dev/null || true
        fi
    done
    chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true
    chmod 644 $dbpath/VERSION 2>/dev/null || true
}

db_list () {
    #   list all database files
    for dbfile in $dbfiles; do
        eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'`
        if [ ".$dbapi" != ".$DBAPI" ]; then
            continue
        fi
        if [ ! -f "$dbpath/$dbfile" ]; then
            continue
        fi
        if [ $verbose -eq 0 ]; then
            echo "$dbfile"
        elif [ $verbose -eq 1 ]; then
            echo "$dbpath/$dbfile"
        elif [ $verbose -ge 2 ]; then
            echo "$dbpath/$dbfile ($dbtype)"
        fi
    done
}

##
##  ENVIRONMENT CONSISTENCY CHECKS
##

#   sanity check OpenPKG instance
if [ ".$prefix" = . ]; then
    error "OpenPKG instance directory is empty"
fi
if [ ! -d $prefix ]; then
    error "OpenPKG instance directory \"$prefix\" not found"
fi
if [ ! -x $prefix/bin/openpkg ]; then
    error "OpenPKG instance directory \"$prefix\" not valid"
fi

#   sanity check OpenPKG RPM database
if [ ".$dbpath" = . ]; then
    error "OpenPKG RPM database directory is empty"
fi
if [ ! -d $dbpath ]; then
    error "OpenPKG RPM database directory \"$dbpath\" not found"
fi
if [ ! -w $dbpath ]; then
    error "OpenPKG RPM database directory \"$dbpath\" not writable"
fi

#   load database information
rpmdb_version_load

##
##  DISPATCH INTO COMMANDS
##

case "$mode" in
    build )
        verbose 1 "BUILDING NEW RPM DATABASE FROM SCRATCH ($dbpath)"
        db_remove
        db_init
        db_fixate
        db_operate
        ;;

    migrate )
        verbose 1 "MIGRATING RPM DATABASE FORMAT ($dbpath)"
        db_unbreak
        db_convert
        db_migrate
        db_rebuild
        db_fixate
        db_operate
        ;;

    rebuild )
        verbose 1 "REBUILDING NEW FROM OLD RPM DATABASE ($dbpath)"
        db_unbreak
        db_convert
        db_reload
        db_rebuild
        db_fixate
        db_operate
        ;;

    cleanup )
        verbose 1 "CLEANING UP EXISTING RPM DATABASE ($dbpath)"
        db_unbreak
        db_convert
        db_rebuild
        db_fixate
        db_operate
        ;;

    fixate )
        verbose 1 "FIXATING EXISTING RPM DATABASE ($dbpath)"
        db_fixate
        ;;

    list )
        db_list
        ;;
esac

exit 0
Received on Mon Aug 18 14:27:01 2008
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.