openpkg/rpmdb

Tue, 31 Jul 2012 09:20:53 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 31 Jul 2012 09:20:53 +0200
changeset 421
3285b64e3857
child 428
f880f219c566
permissions
-rw-r--r--

Import package vendor original specs for necessary manipulations.

michael@13 1 #!@l_prefix@/lib/openpkg/bash
michael@13 2 ##
michael@13 3 ## rpmdb -- OpenPKG RPM Database Administration Utility
michael@13 4 ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
michael@13 5 ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
michael@13 6 ##
michael@13 7 ## Permission to use, copy, modify, and distribute this software for
michael@13 8 ## any purpose with or without fee is hereby granted, provided that
michael@13 9 ## the above copyright notice and this permission notice appear in all
michael@13 10 ## copies.
michael@13 11 ##
michael@13 12 ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
michael@13 13 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
michael@13 14 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
michael@13 15 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
michael@13 16 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
michael@13 17 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
michael@13 18 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
michael@13 19 ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
michael@13 20 ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
michael@13 21 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
michael@13 22 ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
michael@13 23 ## SUCH DAMAGE.
michael@13 24 ##
michael@13 25
michael@13 26 # program information
michael@13 27 progname="rpmdb"
michael@13 28
michael@13 29 # configuration defaults
michael@13 30 help=""
michael@13 31 prefix="@l_prefix@"
michael@13 32 dbpath=""
michael@13 33 rpm=""
michael@13 34 musr="@l_musr@"
michael@13 35 mgrp="@l_mgrp@"
michael@13 36 mode=""
michael@13 37 force=no
michael@13 38 verbose=2
michael@13 39
michael@13 40 ##
michael@13 41 ## PARSE COMMAND LINE
michael@13 42 ##
michael@13 43
michael@13 44 # iterate over argument line
michael@13 45 for opt
michael@13 46 do
michael@13 47 case $opt in
michael@13 48 -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
michael@13 49 *) arg='' ;;
michael@13 50 esac
michael@13 51 case $opt in
michael@13 52 -h|--help ) help="Usage" ;;
michael@13 53 -B|--build ) mode=build ;;
michael@13 54 -R|--rebuild ) mode=rebuild ;;
michael@13 55 -C|--cleanup ) mode=cleanup ;;
michael@13 56 -F|--fixate ) mode=fixate ;;
michael@13 57 -L|--list ) mode=list ;;
michael@13 58 -f|--force ) force=yes ;;
michael@13 59 -q|--quiet ) verbose=0 ;;
michael@13 60 -v|--verbose ) verbose=`expr $verbose + 1` ;;
michael@13 61 --prefix=* ) prefix=$arg ;;
michael@13 62 --dbpath=* ) dbpath=$arg ;;
michael@13 63 --rpm=* ) rpm=$arg ;;
michael@13 64 --musr=* ) musr=$arg ;;
michael@13 65 --mgrp=* ) mgrp=$arg ;;
michael@13 66 * ) help="Invalid option \`$opt'"; break ;;
michael@13 67 esac
michael@13 68 done
michael@13 69
michael@13 70 # makre sure exactly one run-time mode is specified
michael@13 71 if [ ".$mode" = . ]; then
michael@13 72 help="No or invalid run-time mode specified"
michael@13 73 fi
michael@13 74
michael@13 75 # error or usage message
michael@13 76 if [ ".$help" != . ]; then
michael@13 77 if [ ".$help" != ".Usage" ]; then
michael@13 78 echo "$progname:ERROR: $help" 1>&2
michael@13 79 fi
michael@13 80 cat 1>&2 <<EOT
michael@13 81 $progname:USAGE: $progname [options]
michael@13 82
michael@13 83 -h, --help print usage message (this one)
michael@13 84 -B, --build build new RPM database from scratch
michael@13 85 -R, --rebuild rebuild new from old RPM database
michael@13 86 -C, --cleanup cleanup existing RPM database
michael@13 87 -F, --fixate fixate existing RPM database
michael@13 88 -L, --list list all RPM database files
michael@13 89 -f, --force operate in force mode (no save operations)
michael@13 90 -q, --quiet operate in quiet mode (no verbose messages at all)
michael@13 91 -v, --verbose operate in more verbose mode (increase verbose level)
michael@13 92 --prefix=PREFIX use OpenPKG instance under PREFIX
michael@13 93 --dbpath=PATH use OpenPKG RPM database under PATH
michael@13 94 --rpm=PROG use OpenPKG RPM executable PROG
michael@13 95 --musr=USERNAME use OpenPKG management user USERNAME
michael@13 96 --mgrp=GROUPNAME use OpenPKG management group GROUPNAME
michael@13 97
michael@13 98 This is OpenPKG rpmdb, an RPM database administration utility, providing
michael@13 99 lower-level maintainance functions for the Berkeley-DB 4.1 based RPM 4.2
michael@13 100 database. It allows building new RPM databases from scratch, rebuilding
michael@13 101 a new from an old RPM database (content dumping and reloading),
michael@13 102 cleaning up problems on an existing RPM database (removal of DB region
michael@13 103 files, etc) and fixating the files in an existing RPM database (file
michael@13 104 attributes).
michael@13 105
michael@13 106 EOT
michael@13 107 if [ ".$help" != ".Usage" ]; then
michael@13 108 exit 2
michael@13 109 else
michael@13 110 exit 0
michael@13 111 fi
michael@13 112 fi
michael@13 113
michael@13 114 # delayed determination of variables
michael@13 115 if [ ".$dbpath" = . ]; then
michael@13 116 dbpath="$prefix/RPM/DB"
michael@13 117 fi
michael@13 118 if [ ".$rpm" = . ]; then
michael@13 119 rpm="$prefix/bin/openpkg rpm"
michael@13 120 fi
michael@13 121
michael@13 122 ##
michael@13 123 ## DATABASE FILE INFORMATION
michael@13 124 ##
michael@13 125
michael@13 126 dbfiles="
michael@13 127 hash:Basenames
michael@13 128 hash:Conflictname
michael@13 129 hash:Depends
michael@13 130 btree:Dirnames
michael@13 131 hash:Filemd5s
michael@13 132 hash:Group
michael@13 133 btree:Installtid
michael@13 134 hash:Name
michael@13 135 hash:Packages
michael@13 136 hash:Providename
michael@13 137 btree:Provideversion
michael@13 138 hash:Pubkeys
michael@13 139 hash:Requirename
michael@13 140 btree:Requireversion
michael@13 141 hash:Sha1header
michael@13 142 hash:Sigmd5
michael@13 143 hash:Triggername
michael@13 144 region:__db.001
michael@13 145 region:__db.002
michael@13 146 region:__db.003
michael@13 147 region:__db.004
michael@13 148 region:__db.005
michael@13 149 region:__db.006
michael@13 150 region:__db.007
michael@13 151 region:__db.008
michael@13 152 region:__db.009
michael@13 153 "
michael@13 154
michael@13 155 ##
michael@13 156 ## HELPER FUNCTIONS
michael@13 157 ##
michael@13 158
michael@13 159 error () {
michael@13 160 echo "$progname:ERROR: $*" 1>&2
michael@13 161 exit 1
michael@13 162 }
michael@13 163
michael@13 164 warning () {
michael@13 165 echo "$progname:WARNING: $*" 1>&2
michael@13 166 }
michael@13 167
michael@13 168 verbose () {
michael@13 169 local level=$1
michael@13 170 shift
michael@13 171 if [ $level -le $verbose ]; then
michael@13 172 local lead=""
michael@13 173 case "$level" in
michael@13 174 1 ) lead="" ;;
michael@13 175 2 ) lead="" ;;
michael@13 176 3 ) lead=" " ;;
michael@13 177 * ) lead=" " ;;
michael@13 178 esac
michael@13 179 echo "$progname: $lead$*" 1>&2
michael@13 180 fi
michael@13 181 }
michael@13 182
michael@13 183 rpm () {
michael@13 184 local opts="--dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`"
michael@13 185 if [ ".$force" = .yes ]; then
michael@13 186 opts="$opts --define '__dbi_private yes'"
michael@13 187 fi
michael@13 188 verbose 3 "run: $rpm $opts $@"
michael@13 189 eval "$rpm $opts \"\$@\""
michael@13 190 }
michael@13 191
michael@13 192 rpmdb_load () {
michael@13 193 $prefix/lib/openpkg/rpmdb_load ${1+"$@"}
michael@13 194 }
michael@13 195
michael@13 196 rpmdb_dump () {
michael@13 197 $prefix/lib/openpkg/rpmdb_dump ${1+"$@"}
michael@13 198 }
michael@13 199
michael@13 200 ##
michael@13 201 ## RPM DATABASE OPERATIONS
michael@13 202 ##
michael@13 203
michael@13 204 db_wait () {
michael@13 205 # wait until RPM has released the database in case we are called
michael@13 206 # asynchronously to RPM (especially important when upgrading from
michael@13 207 # RPM 4.0 where concurrent access is still not possible)
michael@13 208 verbose 2 "waiting for RPM database to be available"
michael@13 209 local i=0
michael@13 210 while [ $i -lt 10 ]; do
michael@13 211 if $prefix/libexec/openpkg/rpm -q openpkg >/dev/null 2>&1; then
michael@13 212 break
michael@13 213 fi
michael@13 214 sleep 1
michael@13 215 i=`expr $i + 1`
michael@13 216 done
michael@13 217 if [ $i -eq 10 ]; then
michael@13 218 exit 1
michael@13 219 else
michael@13 220 exit 0
michael@13 221 fi
michael@13 222 }
michael@13 223
michael@13 224 db_remove () {
michael@13 225 # remove all known files
michael@13 226 verbose 2 "removing (possibly existing) old RPM database DB files"
michael@13 227 for dbfile in $dbfiles; do
michael@13 228 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
michael@13 229 verbose 3 "removing database file: $dbpath/$dbfile ($dbtype)"
michael@13 230 rm -f $dbpath/$dbfile
michael@13 231 done
michael@13 232 }
michael@13 233
michael@13 234 db_init () {
michael@13 235 # perform official "initdb" operation
michael@13 236 # (is mostly a no-operation in RPM 4.2, but anyway)
michael@13 237 verbose 2 "creating new RPM database (built-in RPM procedure)"
michael@13 238 rpm --initdb
michael@13 239
michael@13 240 # perform some real RPM work, so more database files
michael@13 241 # magically spring into existence
michael@13 242 verbose 2 "operating on new RPM database"
michael@13 243 rpm --import $prefix/etc/openpkg/openpkg.org.pgp || true
michael@13 244 rpm -e gpg-pubkey-63c4cb9f-3c591eda --allmatches || true
michael@13 245
michael@13 246 # perform official "rebuilddb" operation in the hope it
michael@13 247 # creates even more database files now that we have some content
michael@13 248 verbose 2 "rebuilding new RPM database (built-in RPM procedure)"
michael@13 249 rpm --rebuilddb
michael@13 250 }
michael@13 251
michael@13 252 db_unbreak () {
michael@13 253 # cleanup DB region files
michael@13 254 verbose 2 "cleaning up RPM database DB region files"
michael@13 255 for dbfile in $dbfiles; do
michael@13 256 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
michael@13 257 if [ ".$dbtype" = .region ]; then
michael@13 258 verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbtype)"
michael@13 259 rm -f $dbpath/$dbfile || true
michael@13 260 touch $dbpath/$dbfile || true
michael@13 261 fi
michael@13 262 done
michael@13 263 }
michael@13 264
michael@13 265 db_extend () {
michael@13 266 # make sure all RPM database DB files are present
michael@13 267 verbose 2 "making sure RPM database contains all possible DB files"
michael@13 268 for dbfile in $dbfiles; do
michael@13 269 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
michael@13 270 if [ ! -f $dbpath/$dbfile ]; then
michael@13 271 verbose 3 "creating DB file: $dbpath/$dbfile ($dbtype)"
michael@13 272 if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
michael@13 273 ( echo "VERSION=3"
michael@13 274 echo "format=bytevalue"
michael@13 275 echo "type=$dbtype"
michael@13 276 echo "db_pagesize=16384"
michael@13 277 echo "HEADER=END"
michael@13 278 echo "DATA=END"
michael@13 279 ) | rpmdb_load $dbpath/$dbfile || true
michael@13 280 else
michael@13 281 touch $dbpath/$dbfile || true
michael@13 282 fi
michael@13 283 fi
michael@13 284 done
michael@13 285 }
michael@13 286
michael@13 287 db_reload () {
michael@13 288 # rebuilding new from old RPM database DB files by dumping and
michael@13 289 # reloading their entire content
michael@13 290 verbose 2 "dumping and reloading RPM database DB file contents"
michael@13 291 for dbfile in $dbfiles; do
michael@13 292 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
michael@13 293 verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)"
michael@13 294 if [ -f $dbpath/$dbfile ]; then
michael@13 295 if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then
michael@13 296 rpmdb_dump $dbpath/$dbfile |\
michael@13 297 rpmdb_load $dbpath/$dbfile.new
michael@13 298 rm -f $dbpath/$dbfile
michael@13 299 mv $dbpath/$dbfile.new $dbpath/$dbfile
michael@13 300 else
michael@13 301 rm -f $dbpath/$dbfile || true
michael@13 302 touch $dbpath/$dbfile || true
michael@13 303 fi
michael@13 304 fi
michael@13 305 done
michael@13 306 }
michael@13 307
michael@13 308 db_rebuild () {
michael@13 309 # perform official "rebuilddb" operation
michael@13 310 verbose 2 "rebuilding RPM database (built-in RPM procedure)"
michael@13 311 rpm --rebuilddb
michael@13 312 }
michael@13 313
michael@13 314 db_operate () {
michael@13 315 # perform some read/write operation on RPM database
michael@13 316 # (we have no package available, but removing and reimporting
michael@13 317 # the OpenPKG OpenPGP keys is a harmless thing and always possible)
michael@13 318 verbose 2 "performing read/write operation on RPM database"
michael@13 319 for spec in \
michael@13 320 openpkg.org.pgp:gpg-pubkey-63c4cb9f-3c591eda \
michael@13 321 openpkg.com.pgp:gpg-pubkey-61b7ae34-4544a6af \
michael@13 322 openpkg.net.pgp:gpg-pubkey-52197903-4544a74d \
michael@13 323 ; do
michael@13 324 eval `echo "$spec" | sed -e 's/^\(.*\):\(.*\)$/file="\1"; package="\2"/'`
michael@13 325 rpm -q $package >/dev/null 2>&1 && rpm -e $package --allmatches || true
michael@13 326 rpm -q $package >/dev/null 2>&1 || rpm --import $prefix/etc/openpkg/$file || true
michael@13 327 done
michael@13 328 rpm -qa >/dev/null 2>&1
michael@13 329 }
michael@13 330
michael@13 331 db_fixate () {
michael@13 332 # fix ownership and permissions of (especially newly created)
michael@13 333 # RPM database files to make sure they are consistent
michael@13 334 verbose 2 "making sure RPM database files have consistent attributes"
michael@13 335 for dbfile in $dbfiles; do
michael@13 336 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
michael@13 337 verbose 3 "fixating DB file: $dbpath/$dbfile ($dbtype)"
michael@13 338 chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true
michael@13 339 chmod 644 $dbpath/$dbfile 2>/dev/null || true
michael@13 340 done
michael@13 341 }
michael@13 342
michael@13 343 db_list () {
michael@13 344 # list all database files
michael@13 345 for dbfile in $dbfiles; do
michael@13 346 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'`
michael@13 347 if [ $verbose -eq 0 ]; then
michael@13 348 echo "$dbfile"
michael@13 349 elif [ $verbose -eq 1 ]; then
michael@13 350 echo "$dbpath/$dbfile"
michael@13 351 elif [ $verbose -ge 2 ]; then
michael@13 352 echo "$dbpath/$dbfile ($dbtype)"
michael@13 353 fi
michael@13 354 done
michael@13 355 }
michael@13 356
michael@13 357 ##
michael@13 358 ## ENVIRONMENT CONSISTENCY CHECKS
michael@13 359 ##
michael@13 360
michael@13 361 # sanity check OpenPKG instance
michael@13 362 if [ ".$prefix" = . ]; then
michael@13 363 error "OpenPKG instance directory is empty"
michael@13 364 fi
michael@13 365 if [ ! -d $prefix ]; then
michael@13 366 error "OpenPKG instance directory \"$prefix\" not found"
michael@13 367 fi
michael@13 368 if [ ! -x $prefix/bin/openpkg ]; then
michael@13 369 error "OpenPKG instance directory \"$prefix\" not valid"
michael@13 370 fi
michael@13 371
michael@13 372 # sanity check OpenPKG RPM database
michael@13 373 if [ ".$dbpath" = . ]; then
michael@13 374 error "OpenPKG RPM database directory is empty"
michael@13 375 fi
michael@13 376 if [ ! -d $dbpath ]; then
michael@13 377 error "OpenPKG RPM database directory \"$dbpath\" not found"
michael@13 378 fi
michael@13 379 if [ ! -w $dbpath ]; then
michael@13 380 error "OpenPKG RPM database directory \"$dbpath\" not writable"
michael@13 381 fi
michael@13 382
michael@13 383 ##
michael@13 384 ## DISPATCH INTO COMMANDS
michael@13 385 ##
michael@13 386
michael@13 387 case "$mode" in
michael@13 388 build )
michael@13 389 verbose 1 "BUILDING NEW RPM DATABASE FROM SCRATCH ($dbpath)"
michael@13 390 db_remove
michael@13 391 db_init
michael@13 392 db_extend
michael@13 393 db_rebuild
michael@13 394 db_fixate
michael@13 395 db_operate
michael@13 396 ;;
michael@13 397
michael@13 398 rebuild )
michael@13 399 verbose 1 "REBUILDING NEW FROM OLD RPM DATABASE ($dbpath)"
michael@13 400 db_unbreak
michael@13 401 db_extend
michael@13 402 db_reload
michael@13 403 db_rebuild
michael@13 404 db_fixate
michael@13 405 db_operate
michael@13 406 ;;
michael@13 407
michael@13 408 cleanup )
michael@13 409 verbose 1 "CLEANING UP EXISTING RPM DATABASE ($dbpath)"
michael@13 410 db_unbreak
michael@13 411 db_extend
michael@13 412 db_rebuild
michael@13 413 db_fixate
michael@13 414 db_operate
michael@13 415 ;;
michael@13 416
michael@13 417 fixate )
michael@13 418 verbose 1 "FIXATING EXISTING RPM DATABASE ($dbpath)"
michael@13 419 db_extend
michael@13 420 db_fixate
michael@13 421 db_operate
michael@13 422 ;;
michael@13 423
michael@13 424 list )
michael@13 425 db_list
michael@13 426 ;;
michael@13 427 esac
michael@13 428
michael@13 429 exit 0
michael@13 430

mercurial