| 1 #!@l_prefix@/lib/openpkg/bash |
1 #!@l_prefix@/lib/openpkg/bash |
| 2 ## |
2 ## |
| 3 ## rpmdb -- OpenPKG RPM Database Administration Utility |
3 ## rpmdb -- OpenPKG RPM Database Administration Utility |
| 4 ## Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/> |
4 ## Copyright (c) 2000-2012 OpenPKG GmbH <http://openpkg.com/> |
| 5 ## Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/> |
5 ## |
| 6 ## |
6 ## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. |
| 7 ## Permission to use, copy, modify, and distribute this software for |
7 ## All rights reserved. Licenses which grant limited permission to use, |
| 8 ## any purpose with or without fee is hereby granted, provided that |
8 ## copy, modify and distribute this software are available from the |
| 9 ## the above copyright notice and this permission notice appear in all |
9 ## OpenPKG GmbH. |
| 10 ## copies. |
10 ## |
| 11 ## |
11 ## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED |
| 12 ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
|
| 13 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
12 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| 14 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
13 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 15 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
14 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
| 16 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
15 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| 17 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
16 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 40 ## |
41 ## |
| 41 ## PARSE COMMAND LINE |
42 ## PARSE COMMAND LINE |
| 42 ## |
43 ## |
| 43 |
44 |
| 44 # iterate over argument line |
45 # iterate over argument line |
| |
46 args="" |
| 45 for opt |
47 for opt |
| 46 do |
48 do |
| 47 case $opt in |
49 case $opt in |
| 48 -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; |
50 -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; |
| 49 *) arg='' ;; |
51 *) arg='' ;; |
| 50 esac |
52 esac |
| 51 case $opt in |
53 case $opt in |
| 52 -h|--help ) help="Usage" ;; |
54 -h|--help ) help="Usage" ;; |
| 53 -B|--build ) mode=build ;; |
55 -B|--build ) mode=build ;; |
| |
56 -M|--migrate ) mode=migrate ;; |
| 54 -R|--rebuild ) mode=rebuild ;; |
57 -R|--rebuild ) mode=rebuild ;; |
| 55 -C|--cleanup ) mode=cleanup ;; |
58 -C|--cleanup ) mode=cleanup ;; |
| 56 -F|--fixate ) mode=fixate ;; |
59 -F|--fixate ) mode=fixate ;; |
| 57 -L|--list ) mode=list ;; |
60 -L|--list ) mode=list ;; |
| 58 -f|--force ) force=yes ;; |
61 -f|--force ) force=yes ;; |
| 59 -q|--quiet ) verbose=0 ;; |
62 -q|--quiet ) verbose=0 ;; |
| 60 -v|--verbose ) verbose=`expr $verbose + 1` ;; |
63 -v|--verbose ) verbose=`expr $verbose + 1` ;; |
| 61 --prefix=* ) prefix=$arg ;; |
64 --prefix=* ) prefix=$arg ;; |
| 62 --dbpath=* ) dbpath=$arg ;; |
65 --dbpath=* ) dbpath=$arg ;; |
| |
66 --dblib=* ) dblib=$arg ;; |
| |
67 --tmpdir=* ) tmpdir=$arg ;; |
| 63 --rpm=* ) rpm=$arg ;; |
68 --rpm=* ) rpm=$arg ;; |
| 64 --musr=* ) musr=$arg ;; |
69 --musr=* ) musr=$arg ;; |
| 65 --mgrp=* ) mgrp=$arg ;; |
70 --mgrp=* ) mgrp=$arg ;; |
| 66 * ) help="Invalid option \`$opt'"; break ;; |
71 -- ) ;; |
| |
72 -* ) help="Invalid option \`$opt'"; break ;; |
| |
73 * ) args="$args \"$opt\"" ;; |
| 67 esac |
74 esac |
| 68 done |
75 done |
| 69 |
76 eval "set -- $args" |
| 70 # makre sure exactly one run-time mode is specified |
77 |
| |
78 # make sure exactly one run-time mode is specified |
| 71 if [ ".$mode" = . ]; then |
79 if [ ".$mode" = . ]; then |
| 72 help="No or invalid run-time mode specified" |
80 help="No or invalid run-time mode specified" |
| 73 fi |
81 fi |
| 74 |
82 |
| 75 # error or usage message |
83 # error or usage message |
| 80 cat 1>&2 <<EOT |
88 cat 1>&2 <<EOT |
| 81 $progname:USAGE: $progname [options] |
89 $progname:USAGE: $progname [options] |
| 82 |
90 |
| 83 -h, --help print usage message (this one) |
91 -h, --help print usage message (this one) |
| 84 -B, --build build new RPM database from scratch |
92 -B, --build build new RPM database from scratch |
| |
93 -M, --migrate migrate RPM database to new format |
| 85 -R, --rebuild rebuild new from old RPM database |
94 -R, --rebuild rebuild new from old RPM database |
| 86 -C, --cleanup cleanup existing RPM database |
95 -C, --cleanup cleanup existing RPM database |
| 87 -F, --fixate fixate existing RPM database |
96 -F, --fixate fixate existing RPM database |
| 88 -L, --list list all RPM database files |
97 -L, --list list all RPM database files |
| 89 -f, --force operate in force mode (no save operations) |
98 -f, --force operate in force mode (no save operations) |
| 90 -q, --quiet operate in quiet mode (no verbose messages at all) |
99 -q, --quiet operate in quiet mode (no verbose messages at all) |
| 91 -v, --verbose operate in more verbose mode (increase verbose level) |
100 -v, --verbose operate in more verbose mode (increase verbose level) |
| 92 --prefix=PREFIX use OpenPKG instance under PREFIX |
101 --prefix=PREFIX use OpenPKG instance under PREFIX |
| 93 --dbpath=PATH use OpenPKG RPM database under PATH |
102 --dbpath=PATH use OpenPKG RPM database under PATH |
| |
103 --dblib=LIB use OpenPKG RPM database backend library ("db" or "sqlite") |
| |
104 --tmpdir=PATH use OpenPKG temporary directory under PATH |
| 94 --rpm=PROG use OpenPKG RPM executable PROG |
105 --rpm=PROG use OpenPKG RPM executable PROG |
| 95 --musr=USERNAME use OpenPKG management user USERNAME |
106 --musr=USERNAME use OpenPKG management user USERNAME |
| 96 --mgrp=GROUPNAME use OpenPKG management group GROUPNAME |
107 --mgrp=GROUPNAME use OpenPKG management group GROUPNAME |
| 97 |
108 |
| 98 This is OpenPKG rpmdb, an RPM database administration utility, providing |
109 This is OpenPKG rpmdb, an RPM database administration utility, providing |
| 99 lower-level maintainance functions for the Berkeley-DB 4.1 based RPM 4.2 |
110 lower-level maintainance functions for the Berkeley-DB based RPM |
| 100 database. It allows building new RPM databases from scratch, rebuilding |
111 database. It allows building new RPM databases from scratch, rebuilding |
| 101 a new from an old RPM database (content dumping and reloading), |
112 a new from an old RPM database (content dumping and reloading), |
| 102 cleaning up problems on an existing RPM database (removal of DB region |
113 cleaning up problems on an existing RPM database (removal of DB region |
| 103 files, etc) and fixating the files in an existing RPM database (file |
114 files, etc) and fixating the files in an existing RPM database (file |
| 104 attributes). |
115 attributes). |
| 178 esac |
224 esac |
| 179 echo "$progname: $lead$*" 1>&2 |
225 echo "$progname: $lead$*" 1>&2 |
| 180 fi |
226 fi |
| 181 } |
227 } |
| 182 |
228 |
| |
229 rpmdb_version_load () { |
| |
230 if [ -f $dbpath/VERSION ]; then |
| |
231 eval `(. $dbpath/VERSION || exit $?; echo "DBAPI=\"$DBAPI\"; DBLIB=\"$DBLIB\"; DBVER=\"$DBVER\"")` |
| |
232 fi |
| |
233 if [ ".$DBAPI" = . ]; then DBAPI="3"; fi |
| |
234 if [ ".$DBLIB" = . ]; then DBLIB="db"; fi |
| |
235 if [ ".$DBVER" = . ]; then DBVER="4.1.2"; fi |
| |
236 } |
| |
237 |
| |
238 rpmdb_version_save () { |
| |
239 if [ ".$DBAPI" = .3 ]; then |
| |
240 DBLIB="db" |
| |
241 DBVER=`$rpmdb_load -V 2>&1 |\ |
| |
242 grep 'Berkeley DB [0-9][0-9]*\.[0-9][0-9]*' |\ |
| |
243 sed -e 's;^;X;' \ |
| |
244 -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \ |
| |
245 -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1.0;' \ |
| |
246 -e 's;^X.*$;0.0.0;'` |
| |
247 elif [ ".$DBAPI" = .4 ]; then |
| |
248 DBLIB="sqlite" |
| |
249 DBVER=`$rpmdb_sqlite --version 2>&1 |\ |
| |
250 grep '^[0-9][0-9]*\.[0-9][0-9]*' |\ |
| |
251 sed -e 's;^;X;' \ |
| |
252 -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \ |
| |
253 -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1.0;' \ |
| |
254 -e 's;^X.*$;0.0.0;'` |
| |
255 fi |
| |
256 ( echo "DBAPI=$DBAPI" |
| |
257 echo "DBLIB=$DBLIB" |
| |
258 echo "DBVER=$DBVER" |
| |
259 ) >$dbpath/VERSION.new || exit $? |
| |
260 mv $dbpath/VERSION.new $dbpath/VERSION || exit $? |
| |
261 chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true |
| |
262 chmod 644 $dbpath/VERSION 2>/dev/null || true |
| |
263 } |
| |
264 |
| 183 rpm () { |
265 rpm () { |
| 184 local opts="--dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`" |
266 local opts="--define '_dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`'" |
| |
267 opts="$opts --define '_repackage_all_erasures 0'" |
| 185 if [ ".$force" = .yes ]; then |
268 if [ ".$force" = .yes ]; then |
| 186 opts="$opts --define '__dbi_private yes'" |
269 opts="$opts --define '__dbi_private yes'" |
| 187 fi |
270 fi |
| 188 verbose 3 "run: $rpm $opts $@" |
271 verbose 3 "run: $rpm $opts $@" |
| 189 eval "$rpm $opts \"\$@\"" |
272 eval "$rpm $opts \"\$@\"" |
| 190 } |
273 } |
| 191 |
274 |
| 192 rpmdb_load () { |
275 rpmdb_load="$prefix/lib/openpkg/db_tool load" |
| 193 $prefix/lib/openpkg/rpmdb_load ${1+"$@"} |
276 rpmdb_dump="$prefix/lib/openpkg/db_tool dump" |
| 194 } |
277 rpmdb_sqlite="$prefix/lib/openpkg/sqlite3" |
| 195 |
|
| 196 rpmdb_dump () { |
|
| 197 $prefix/lib/openpkg/rpmdb_dump ${1+"$@"} |
|
| 198 } |
|
| 199 |
278 |
| 200 ## |
279 ## |
| 201 ## RPM DATABASE OPERATIONS |
280 ## RPM DATABASE OPERATIONS |
| 202 ## |
281 ## |
| 203 |
282 |
| 223 |
302 |
| 224 db_remove () { |
303 db_remove () { |
| 225 # remove all known files |
304 # remove all known files |
| 226 verbose 2 "removing (possibly existing) old RPM database DB files" |
305 verbose 2 "removing (possibly existing) old RPM database DB files" |
| 227 for dbfile in $dbfiles; do |
306 for dbfile in $dbfiles; do |
| 228 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'` |
307 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
| 229 verbose 3 "removing database file: $dbpath/$dbfile ($dbtype)" |
308 verbose 3 "removing database file: $dbpath/$dbfile ($dbapi:$dbtype)" |
| 230 rm -f $dbpath/$dbfile |
309 rm -f $dbpath/$dbfile |
| 231 done |
310 done |
| 232 } |
311 } |
| 233 |
312 |
| 234 db_init () { |
313 db_init () { |
| 235 # perform official "initdb" operation |
314 # perform official "initdb" operation |
| 236 # (is mostly a no-operation in RPM 4.2, but anyway) |
|
| 237 verbose 2 "creating new RPM database (built-in RPM procedure)" |
315 verbose 2 "creating new RPM database (built-in RPM procedure)" |
| 238 rpm --initdb |
316 rpm --initdb |
| 239 |
317 rpmdb_version_save |
| 240 # perform some real RPM work, so more database files |
|
| 241 # magically spring into existence |
|
| 242 verbose 2 "operating on new RPM database" |
|
| 243 rpm --import $prefix/etc/openpkg/openpkg.org.pgp || true |
|
| 244 rpm -e gpg-pubkey-63c4cb9f-3c591eda --allmatches || true |
|
| 245 |
|
| 246 # perform official "rebuilddb" operation in the hope it |
|
| 247 # creates even more database files now that we have some content |
|
| 248 verbose 2 "rebuilding new RPM database (built-in RPM procedure)" |
|
| 249 rpm --rebuilddb |
|
| 250 } |
318 } |
| 251 |
319 |
| 252 db_unbreak () { |
320 db_unbreak () { |
| 253 # cleanup DB region files |
321 # cleanup DB files |
| 254 verbose 2 "cleaning up RPM database DB region files" |
322 verbose 2 "cleaning up RPM database DB files" |
| 255 for dbfile in $dbfiles; do |
323 for dbfile in $dbfiles; do |
| 256 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'` |
324 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
| 257 if [ ".$dbtype" = .region ]; then |
325 if [ -f $dbpath/$dbfile ]; then |
| 258 verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbtype)" |
326 if [ ".$dbapi" = .3 -a ".$dbtype" = .region ]; then |
| 259 rm -f $dbpath/$dbfile || true |
327 verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)" |
| 260 touch $dbpath/$dbfile || true |
328 rm -f $dbpath/$dbfile || true |
| 261 fi |
329 elif [ ".$dbtype" = .temporary ]; then |
| 262 done |
330 verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)" |
| 263 } |
331 rm -f $dbpath/$dbfile || true |
| 264 |
332 fi |
| 265 db_extend () { |
333 fi |
| 266 # make sure all RPM database DB files are present |
334 done |
| 267 verbose 2 "making sure RPM database contains all possible DB files" |
335 } |
| |
336 |
| |
337 db_convert () { |
| |
338 # make sure all RPM database DB files have the correct type |
| |
339 # (as the type can be different during upgrading from RPM 4 to RPM 5) |
| |
340 verbose 2 "making sure RPM database are of the correct type" |
| 268 for dbfile in $dbfiles; do |
341 for dbfile in $dbfiles; do |
| 269 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'` |
342 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
| 270 if [ ! -f $dbpath/$dbfile ]; then |
343 if [ ".$dbapi" != ".$DBAPI" ]; then |
| 271 verbose 3 "creating DB file: $dbpath/$dbfile ($dbtype)" |
344 continue |
| 272 if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then |
345 fi |
| 273 ( echo "VERSION=3" |
346 if [ -f $dbpath/$dbfile ]; then |
| 274 echo "format=bytevalue" |
347 if [ ".$dbapi" = .3 ] && [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then |
| 275 echo "type=$dbtype" |
348 dbtype_old="`$rpmdb_dump -h $tmpdir -r $dbpath/$dbfile | grep '^type=' | sed -e 'q' | sed -e 's/^type=//'`" |
| 276 echo "db_pagesize=16384" |
349 if [ ".$dbtype_old" != ".$dbtype" ]; then |
| 277 echo "HEADER=END" |
350 verbose 3 "converting DB file: $dbpath/$dbfile ($dbtype_old -> $dbtype)" |
| 278 echo "DATA=END" |
351 rm -f $dbpath/$dbfile.new |
| 279 ) | rpmdb_load $dbpath/$dbfile || true |
352 $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\ |
| 280 else |
353 sed -e "s/^type=.*/type=$dbtype/" -e '/^h_nelem=.*/d' |\ |
| 281 touch $dbpath/$dbfile || true |
354 $rpmdb_load -h $tmpdir $dbpath/$dbfile.new |
| |
355 if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then |
| |
356 rm -f $dbpath/$dbfile |
| |
357 mv $dbpath/$dbfile.new $dbpath/$dbfile |
| |
358 else |
| |
359 warning "failed to convert RPM DB file \"$dbfile\"" |
| |
360 fi |
| |
361 fi |
| 282 fi |
362 fi |
| 283 fi |
363 fi |
| 284 done |
364 done |
| 285 } |
365 } |
| 286 |
366 |
| 287 db_reload () { |
367 db_reload () { |
| 288 # rebuilding new from old RPM database DB files by dumping and |
368 # rebuilding new from old RPM database DB files by dumping and |
| 289 # reloading their entire content |
369 # reloading their entire content |
| 290 verbose 2 "dumping and reloading RPM database DB file contents" |
370 verbose 2 "dumping and reloading RPM database DB file contents" |
| 291 for dbfile in $dbfiles; do |
371 for dbfile in $dbfiles; do |
| 292 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'` |
372 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
| 293 verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)" |
373 if [ ".$dbapi" != ".$DBAPI" ]; then |
| |
374 continue |
| |
375 fi |
| 294 if [ -f $dbpath/$dbfile ]; then |
376 if [ -f $dbpath/$dbfile ]; then |
| 295 if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then |
377 if [ ".$dbapi" = .3 ]; then |
| 296 rpmdb_dump $dbpath/$dbfile |\ |
378 verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)" |
| 297 rpmdb_load $dbpath/$dbfile.new |
379 if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then |
| 298 rm -f $dbpath/$dbfile |
380 rm -f $dbpath/$dbfile.new |
| 299 mv $dbpath/$dbfile.new $dbpath/$dbfile |
381 $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\ |
| 300 else |
382 $rpmdb_load -h $tmpdir $dbpath/$dbfile.new |
| 301 rm -f $dbpath/$dbfile || true |
383 if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then |
| 302 touch $dbpath/$dbfile || true |
384 rm -f $dbpath/$dbfile |
| |
385 mv $dbpath/$dbfile.new $dbpath/$dbfile |
| |
386 else |
| |
387 warning "failed to reload RPM DB file \"$dbfile\"" |
| |
388 fi |
| |
389 elif [ ".$dbtype" = .region ]; then |
| |
390 rm -f $dbpath/$dbfile || true |
| |
391 elif [ ".$dbtype" = .temporary ]; then |
| |
392 rm -f $dbpath/$dbfile || true |
| |
393 fi |
| |
394 elif [ ".$dbapi" = .4 ]; then |
| |
395 verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)" |
| |
396 rm -f $dbpath/$dbfile.new |
| |
397 $rpmdb_sqlite $dbpath/$dbfile .dump |\ |
| |
398 $rpmdb_sqlite $dbpath/$dbfile.new |
| |
399 if $rpmdb_sqlite $dbpath/$dbfile.new >/dev/null 2>&1; then |
| |
400 rm -f $dbpath/$dbfile |
| |
401 mv $dbpath/$dbfile.new $dbpath/$dbfile |
| |
402 else |
| |
403 warning "failed to reload RPM DB file \"$dbfile\"" |
| |
404 fi |
| 303 fi |
405 fi |
| 304 fi |
406 fi |
| 305 done |
407 done |
| |
408 rpmdb_version_save |
| |
409 } |
| |
410 |
| |
411 db_migrate () { |
| |
412 # perform database migration |
| |
413 if [ ".$1" != . ]; then |
| |
414 dblib="$1" |
| |
415 fi |
| |
416 dbapi_old="$DBAPI" |
| |
417 if [ ".$dblib" = .db ]; then |
| |
418 dbapi_new="3" |
| |
419 elif [ ".$dblib" = .sqlite ]; then |
| |
420 dbapi_new="4" |
| |
421 else |
| |
422 error "unknown RPM database backend library \"$dblib\"" |
| |
423 fi |
| |
424 if [ ".$dbapi_new" = ".$dbapi_old" ]; then |
| |
425 error "RPM database already uses requested backend ($DBAPI:$DBLIB:$DBVER)" |
| |
426 fi |
| |
427 verbose 2 "migrating RPM database" |
| |
428 rpm --rebuilddb --dbapi "$dbapi_old" --rebuilddbapi "$dbapi_new" |
| |
429 verbose 3 "old RPM database format: $DBAPI:$DBLIB:$DBVER" |
| |
430 DBAPI="$dbapi_new" |
| |
431 rpmdb_version_save |
| |
432 rpmdb_version_load |
| |
433 verbose 3 "new RPM database format: $DBAPI:$DBLIB:$DBVER" |
| 306 } |
434 } |
| 307 |
435 |
| 308 db_rebuild () { |
436 db_rebuild () { |
| 309 # perform official "rebuilddb" operation |
437 # perform official "rebuilddb" operation |
| 310 verbose 2 "rebuilding RPM database (built-in RPM procedure)" |
438 verbose 2 "rebuilding RPM database (built-in RPM procedure)" |
| 311 rpm --rebuilddb |
439 rpm --rebuilddb |
| |
440 rpmdb_version_save |
| 312 } |
441 } |
| 313 |
442 |
| 314 db_operate () { |
443 db_operate () { |
| 315 # perform some read/write operation on RPM database |
444 # perform some read/write operation on RPM database |
| 316 # (we have no package available, but removing and reimporting |
445 # (we have no package available, but removing and reimporting |
| 331 db_fixate () { |
460 db_fixate () { |
| 332 # fix ownership and permissions of (especially newly created) |
461 # fix ownership and permissions of (especially newly created) |
| 333 # RPM database files to make sure they are consistent |
462 # RPM database files to make sure they are consistent |
| 334 verbose 2 "making sure RPM database files have consistent attributes" |
463 verbose 2 "making sure RPM database files have consistent attributes" |
| 335 for dbfile in $dbfiles; do |
464 for dbfile in $dbfiles; do |
| 336 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'` |
465 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
| |
466 if [ ".$dbapi" != ".$DBAPI" ]; then |
| |
467 continue |
| |
468 fi |
| 337 verbose 3 "fixating DB file: $dbpath/$dbfile ($dbtype)" |
469 verbose 3 "fixating DB file: $dbpath/$dbfile ($dbtype)" |
| 338 chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true |
470 if [ -f $dbpath/$dbfile ]; then |
| 339 chmod 644 $dbpath/$dbfile 2>/dev/null || true |
471 chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true |
| 340 done |
472 chmod 644 $dbpath/$dbfile 2>/dev/null || true |
| |
473 fi |
| |
474 done |
| |
475 chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true |
| |
476 chmod 644 $dbpath/VERSION 2>/dev/null || true |
| 341 } |
477 } |
| 342 |
478 |
| 343 db_list () { |
479 db_list () { |
| 344 # list all database files |
480 # list all database files |
| 345 for dbfile in $dbfiles; do |
481 for dbfile in $dbfiles; do |
| 346 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\)$/dbtype="\1"; dbfile="\2";/'` |
482 eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
| |
483 if [ ".$dbapi" != ".$DBAPI" ]; then |
| |
484 continue |
| |
485 fi |
| |
486 if [ ! -f "$dbpath/$dbfile" ]; then |
| |
487 continue |
| |
488 fi |
| 347 if [ $verbose -eq 0 ]; then |
489 if [ $verbose -eq 0 ]; then |
| 348 echo "$dbfile" |
490 echo "$dbfile" |
| 349 elif [ $verbose -eq 1 ]; then |
491 elif [ $verbose -eq 1 ]; then |
| 350 echo "$dbpath/$dbfile" |
492 echo "$dbpath/$dbfile" |
| 351 elif [ $verbose -ge 2 ]; then |
493 elif [ $verbose -ge 2 ]; then |