Thu, 04 Oct 2012 20:30:05 +0200
Correct out of date build configuration, porting to Solaris 11 network
link infrastructure and new libpcap logic. This additionally allows for
device drivers in subdirectories of /dev. Correct packaged nmap
personalities and signatures to work out of the box. Finally, hack
arpd logic to properly close sockets and quit on TERM by repeating
signaling in the run command script. Sadly, all this fails to correct
the run time behaviour of honeyd which fails to bind to the IP layer.
michael@13 | 1 | #!@l_prefix@/lib/openpkg/bash |
michael@13 | 2 | ## |
michael@13 | 3 | ## rpmdb -- OpenPKG RPM Database Administration Utility |
michael@428 | 4 | ## Copyright (c) 2000-2012 OpenPKG GmbH <http://openpkg.com/> |
michael@13 | 5 | ## |
michael@428 | 6 | ## This software is property of the OpenPKG GmbH, DE MUC HRB 160208. |
michael@428 | 7 | ## All rights reserved. Licenses which grant limited permission to use, |
michael@428 | 8 | ## copy, modify and distribute this software are available from the |
michael@428 | 9 | ## OpenPKG GmbH. |
michael@13 | 10 | ## |
michael@428 | 11 | ## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED |
michael@13 | 12 | ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
michael@13 | 13 | ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
michael@13 | 14 | ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR |
michael@13 | 15 | ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
michael@13 | 16 | ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
michael@13 | 17 | ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
michael@13 | 18 | ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
michael@13 | 19 | ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
michael@13 | 20 | ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
michael@13 | 21 | ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
michael@13 | 22 | ## SUCH DAMAGE. |
michael@13 | 23 | ## |
michael@13 | 24 | |
michael@13 | 25 | # program information |
michael@13 | 26 | progname="rpmdb" |
michael@13 | 27 | |
michael@13 | 28 | # configuration defaults |
michael@13 | 29 | help="" |
michael@13 | 30 | prefix="@l_prefix@" |
michael@13 | 31 | dbpath="" |
michael@428 | 32 | dbapi="" |
michael@428 | 33 | tmpdir="" |
michael@13 | 34 | rpm="" |
michael@13 | 35 | musr="@l_musr@" |
michael@13 | 36 | mgrp="@l_mgrp@" |
michael@13 | 37 | mode="" |
michael@13 | 38 | force=no |
michael@13 | 39 | verbose=2 |
michael@13 | 40 | |
michael@13 | 41 | ## |
michael@13 | 42 | ## PARSE COMMAND LINE |
michael@13 | 43 | ## |
michael@13 | 44 | |
michael@13 | 45 | # iterate over argument line |
michael@428 | 46 | args="" |
michael@13 | 47 | for opt |
michael@13 | 48 | do |
michael@13 | 49 | case $opt in |
michael@13 | 50 | -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;; |
michael@13 | 51 | *) arg='' ;; |
michael@13 | 52 | esac |
michael@13 | 53 | case $opt in |
michael@13 | 54 | -h|--help ) help="Usage" ;; |
michael@13 | 55 | -B|--build ) mode=build ;; |
michael@428 | 56 | -M|--migrate ) mode=migrate ;; |
michael@13 | 57 | -R|--rebuild ) mode=rebuild ;; |
michael@13 | 58 | -C|--cleanup ) mode=cleanup ;; |
michael@13 | 59 | -F|--fixate ) mode=fixate ;; |
michael@13 | 60 | -L|--list ) mode=list ;; |
michael@13 | 61 | -f|--force ) force=yes ;; |
michael@13 | 62 | -q|--quiet ) verbose=0 ;; |
michael@13 | 63 | -v|--verbose ) verbose=`expr $verbose + 1` ;; |
michael@13 | 64 | --prefix=* ) prefix=$arg ;; |
michael@13 | 65 | --dbpath=* ) dbpath=$arg ;; |
michael@428 | 66 | --dblib=* ) dblib=$arg ;; |
michael@428 | 67 | --tmpdir=* ) tmpdir=$arg ;; |
michael@13 | 68 | --rpm=* ) rpm=$arg ;; |
michael@13 | 69 | --musr=* ) musr=$arg ;; |
michael@13 | 70 | --mgrp=* ) mgrp=$arg ;; |
michael@428 | 71 | -- ) ;; |
michael@428 | 72 | -* ) help="Invalid option \`$opt'"; break ;; |
michael@428 | 73 | * ) args="$args \"$opt\"" ;; |
michael@13 | 74 | esac |
michael@13 | 75 | done |
michael@428 | 76 | eval "set -- $args" |
michael@13 | 77 | |
michael@428 | 78 | # make sure exactly one run-time mode is specified |
michael@13 | 79 | if [ ".$mode" = . ]; then |
michael@13 | 80 | help="No or invalid run-time mode specified" |
michael@13 | 81 | fi |
michael@13 | 82 | |
michael@13 | 83 | # error or usage message |
michael@13 | 84 | if [ ".$help" != . ]; then |
michael@13 | 85 | if [ ".$help" != ".Usage" ]; then |
michael@13 | 86 | echo "$progname:ERROR: $help" 1>&2 |
michael@13 | 87 | fi |
michael@13 | 88 | cat 1>&2 <<EOT |
michael@13 | 89 | $progname:USAGE: $progname [options] |
michael@13 | 90 | |
michael@13 | 91 | -h, --help print usage message (this one) |
michael@13 | 92 | -B, --build build new RPM database from scratch |
michael@428 | 93 | -M, --migrate migrate RPM database to new format |
michael@13 | 94 | -R, --rebuild rebuild new from old RPM database |
michael@13 | 95 | -C, --cleanup cleanup existing RPM database |
michael@13 | 96 | -F, --fixate fixate existing RPM database |
michael@13 | 97 | -L, --list list all RPM database files |
michael@13 | 98 | -f, --force operate in force mode (no save operations) |
michael@13 | 99 | -q, --quiet operate in quiet mode (no verbose messages at all) |
michael@13 | 100 | -v, --verbose operate in more verbose mode (increase verbose level) |
michael@13 | 101 | --prefix=PREFIX use OpenPKG instance under PREFIX |
michael@13 | 102 | --dbpath=PATH use OpenPKG RPM database under PATH |
michael@428 | 103 | --dblib=LIB use OpenPKG RPM database backend library ("db" or "sqlite") |
michael@428 | 104 | --tmpdir=PATH use OpenPKG temporary directory under PATH |
michael@13 | 105 | --rpm=PROG use OpenPKG RPM executable PROG |
michael@13 | 106 | --musr=USERNAME use OpenPKG management user USERNAME |
michael@13 | 107 | --mgrp=GROUPNAME use OpenPKG management group GROUPNAME |
michael@13 | 108 | |
michael@13 | 109 | This is OpenPKG rpmdb, an RPM database administration utility, providing |
michael@428 | 110 | lower-level maintainance functions for the Berkeley-DB based RPM |
michael@13 | 111 | database. It allows building new RPM databases from scratch, rebuilding |
michael@13 | 112 | a new from an old RPM database (content dumping and reloading), |
michael@13 | 113 | cleaning up problems on an existing RPM database (removal of DB region |
michael@13 | 114 | files, etc) and fixating the files in an existing RPM database (file |
michael@13 | 115 | attributes). |
michael@13 | 116 | |
michael@13 | 117 | EOT |
michael@13 | 118 | if [ ".$help" != ".Usage" ]; then |
michael@13 | 119 | exit 2 |
michael@13 | 120 | else |
michael@13 | 121 | exit 0 |
michael@13 | 122 | fi |
michael@13 | 123 | fi |
michael@13 | 124 | |
michael@13 | 125 | # delayed determination of variables |
michael@13 | 126 | if [ ".$dbpath" = . ]; then |
michael@13 | 127 | dbpath="$prefix/RPM/DB" |
michael@13 | 128 | fi |
michael@428 | 129 | if [ ".$dblib" = . ]; then |
michael@428 | 130 | dblib="${1-db}" |
michael@428 | 131 | fi |
michael@428 | 132 | if [ ".$tmpdir" = . ]; then |
michael@428 | 133 | tmpdir="$prefix/RPM/TMP" |
michael@428 | 134 | fi |
michael@13 | 135 | if [ ".$rpm" = . ]; then |
michael@13 | 136 | rpm="$prefix/bin/openpkg rpm" |
michael@13 | 137 | fi |
michael@13 | 138 | |
michael@13 | 139 | ## |
michael@13 | 140 | ## DATABASE FILE INFORMATION |
michael@13 | 141 | ## |
michael@13 | 142 | |
michael@13 | 143 | dbfiles=" |
michael@428 | 144 | 3:btree:Basenames |
michael@428 | 145 | 3:btree:Conflictname |
michael@428 | 146 | 3:temporary:Depends |
michael@428 | 147 | 3:btree:Dirnames |
michael@428 | 148 | 3:btree:Filedigests |
michael@428 | 149 | 3:btree:Filepaths |
michael@428 | 150 | 3:btree:Group |
michael@428 | 151 | 3:btree:Installtid |
michael@428 | 152 | 3:btree:Name |
michael@428 | 153 | 3:hash:Packagecolor |
michael@428 | 154 | 3:btree:Packages |
michael@428 | 155 | 3:btree:Providename |
michael@428 | 156 | 3:btree:Provideversion |
michael@428 | 157 | 3:hash:Pubkeys |
michael@428 | 158 | 3:btree:Requirename |
michael@428 | 159 | 3:btree:Requireversion |
michael@428 | 160 | 3:hash:Sha1header |
michael@428 | 161 | 3:hash:Sigmd5 |
michael@428 | 162 | 3:btree:Triggername |
michael@428 | 163 | 3:btree:Obsoletename |
michael@428 | 164 | 3:btree:Nvra |
michael@428 | 165 | 3:btree:Sourcepkgid |
michael@428 | 166 | 3:btree:BuildEnvironment |
michael@428 | 167 | 3:region:__db.001 |
michael@428 | 168 | 3:region:__db.002 |
michael@428 | 169 | 3:region:__db.003 |
michael@428 | 170 | 3:region:__db.004 |
michael@428 | 171 | 3:region:__db.005 |
michael@428 | 172 | 3:region:__db.006 |
michael@428 | 173 | 3:region:__db.007 |
michael@428 | 174 | 3:region:__db.008 |
michael@428 | 175 | 3:region:__db.009 |
michael@428 | 176 | 4:*:Basenames |
michael@428 | 177 | 4:*:Conflictname |
michael@428 | 178 | 4:temporary:Depends |
michael@428 | 179 | 4:*:Dirnames |
michael@428 | 180 | 4:*:Filedigests |
michael@428 | 181 | 4:*:Filepaths |
michael@428 | 182 | 4:*:Group |
michael@428 | 183 | 4:*:Installtid |
michael@428 | 184 | 4:*:Name |
michael@428 | 185 | 4:*:Packagecolor |
michael@428 | 186 | 4:*:Packages |
michael@428 | 187 | 4:*:Providename |
michael@428 | 188 | 4:*:Provideversion |
michael@428 | 189 | 4:*:Pubkeys |
michael@428 | 190 | 4:*:Requirename |
michael@428 | 191 | 4:*:Requireversion |
michael@428 | 192 | 4:*:Sha1header |
michael@428 | 193 | 4:*:Sigmd5 |
michael@428 | 194 | 4:*:Triggername |
michael@428 | 195 | 4:*:Obsoletename |
michael@428 | 196 | 4:*:Nvra |
michael@428 | 197 | 4:*:Sourcepkgid |
michael@428 | 198 | 4:*:BuildEnvironment |
michael@13 | 199 | " |
michael@13 | 200 | |
michael@13 | 201 | ## |
michael@13 | 202 | ## HELPER FUNCTIONS |
michael@13 | 203 | ## |
michael@13 | 204 | |
michael@13 | 205 | error () { |
michael@13 | 206 | echo "$progname:ERROR: $*" 1>&2 |
michael@13 | 207 | exit 1 |
michael@13 | 208 | } |
michael@13 | 209 | |
michael@13 | 210 | warning () { |
michael@13 | 211 | echo "$progname:WARNING: $*" 1>&2 |
michael@13 | 212 | } |
michael@13 | 213 | |
michael@13 | 214 | verbose () { |
michael@13 | 215 | local level=$1 |
michael@13 | 216 | shift |
michael@13 | 217 | if [ $level -le $verbose ]; then |
michael@13 | 218 | local lead="" |
michael@13 | 219 | case "$level" in |
michael@13 | 220 | 1 ) lead="" ;; |
michael@13 | 221 | 2 ) lead="" ;; |
michael@13 | 222 | 3 ) lead=" " ;; |
michael@13 | 223 | * ) lead=" " ;; |
michael@13 | 224 | esac |
michael@13 | 225 | echo "$progname: $lead$*" 1>&2 |
michael@13 | 226 | fi |
michael@13 | 227 | } |
michael@13 | 228 | |
michael@428 | 229 | rpmdb_version_load () { |
michael@428 | 230 | if [ -f $dbpath/VERSION ]; then |
michael@428 | 231 | eval `(. $dbpath/VERSION || exit $?; echo "DBAPI=\"$DBAPI\"; DBLIB=\"$DBLIB\"; DBVER=\"$DBVER\"")` |
michael@428 | 232 | fi |
michael@428 | 233 | if [ ".$DBAPI" = . ]; then DBAPI="3"; fi |
michael@428 | 234 | if [ ".$DBLIB" = . ]; then DBLIB="db"; fi |
michael@428 | 235 | if [ ".$DBVER" = . ]; then DBVER="4.1.2"; fi |
michael@428 | 236 | } |
michael@428 | 237 | |
michael@428 | 238 | rpmdb_version_save () { |
michael@428 | 239 | if [ ".$DBAPI" = .3 ]; then |
michael@428 | 240 | DBLIB="db" |
michael@428 | 241 | DBVER=`$rpmdb_load -V 2>&1 |\ |
michael@428 | 242 | grep 'Berkeley DB [0-9][0-9]*\.[0-9][0-9]*' |\ |
michael@428 | 243 | sed -e 's;^;X;' \ |
michael@428 | 244 | -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \ |
michael@428 | 245 | -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1.0;' \ |
michael@428 | 246 | -e 's;^X.*$;0.0.0;'` |
michael@428 | 247 | elif [ ".$DBAPI" = .4 ]; then |
michael@428 | 248 | DBLIB="sqlite" |
michael@428 | 249 | DBVER=`$rpmdb_sqlite --version 2>&1 |\ |
michael@428 | 250 | grep '^[0-9][0-9]*\.[0-9][0-9]*' |\ |
michael@428 | 251 | sed -e 's;^;X;' \ |
michael@428 | 252 | -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$;\1;' \ |
michael@428 | 253 | -e 's;^X[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$;\1.0;' \ |
michael@428 | 254 | -e 's;^X.*$;0.0.0;'` |
michael@428 | 255 | fi |
michael@428 | 256 | ( echo "DBAPI=$DBAPI" |
michael@428 | 257 | echo "DBLIB=$DBLIB" |
michael@428 | 258 | echo "DBVER=$DBVER" |
michael@428 | 259 | ) >$dbpath/VERSION.new || exit $? |
michael@428 | 260 | mv $dbpath/VERSION.new $dbpath/VERSION || exit $? |
michael@428 | 261 | chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true |
michael@428 | 262 | chmod 644 $dbpath/VERSION 2>/dev/null || true |
michael@428 | 263 | } |
michael@428 | 264 | |
michael@13 | 265 | rpm () { |
michael@428 | 266 | local opts="--define '_dbpath `echo $dbpath | sed -e 's;/*$;;' -e 's;$;/;'`'" |
michael@428 | 267 | opts="$opts --define '_repackage_all_erasures 0'" |
michael@13 | 268 | if [ ".$force" = .yes ]; then |
michael@13 | 269 | opts="$opts --define '__dbi_private yes'" |
michael@13 | 270 | fi |
michael@13 | 271 | verbose 3 "run: $rpm $opts $@" |
michael@13 | 272 | eval "$rpm $opts \"\$@\"" |
michael@13 | 273 | } |
michael@13 | 274 | |
michael@428 | 275 | rpmdb_load="$prefix/lib/openpkg/db_tool load" |
michael@428 | 276 | rpmdb_dump="$prefix/lib/openpkg/db_tool dump" |
michael@428 | 277 | rpmdb_sqlite="$prefix/lib/openpkg/sqlite3" |
michael@13 | 278 | |
michael@13 | 279 | ## |
michael@13 | 280 | ## RPM DATABASE OPERATIONS |
michael@13 | 281 | ## |
michael@13 | 282 | |
michael@13 | 283 | db_wait () { |
michael@13 | 284 | # wait until RPM has released the database in case we are called |
michael@13 | 285 | # asynchronously to RPM (especially important when upgrading from |
michael@13 | 286 | # RPM 4.0 where concurrent access is still not possible) |
michael@13 | 287 | verbose 2 "waiting for RPM database to be available" |
michael@13 | 288 | local i=0 |
michael@13 | 289 | while [ $i -lt 10 ]; do |
michael@13 | 290 | if $prefix/libexec/openpkg/rpm -q openpkg >/dev/null 2>&1; then |
michael@13 | 291 | break |
michael@13 | 292 | fi |
michael@13 | 293 | sleep 1 |
michael@13 | 294 | i=`expr $i + 1` |
michael@13 | 295 | done |
michael@13 | 296 | if [ $i -eq 10 ]; then |
michael@13 | 297 | exit 1 |
michael@13 | 298 | else |
michael@13 | 299 | exit 0 |
michael@13 | 300 | fi |
michael@13 | 301 | } |
michael@13 | 302 | |
michael@13 | 303 | db_remove () { |
michael@13 | 304 | # remove all known files |
michael@13 | 305 | verbose 2 "removing (possibly existing) old RPM database DB files" |
michael@13 | 306 | for dbfile in $dbfiles; do |
michael@428 | 307 | eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
michael@428 | 308 | verbose 3 "removing database file: $dbpath/$dbfile ($dbapi:$dbtype)" |
michael@13 | 309 | rm -f $dbpath/$dbfile |
michael@13 | 310 | done |
michael@13 | 311 | } |
michael@13 | 312 | |
michael@13 | 313 | db_init () { |
michael@13 | 314 | # perform official "initdb" operation |
michael@13 | 315 | verbose 2 "creating new RPM database (built-in RPM procedure)" |
michael@13 | 316 | rpm --initdb |
michael@428 | 317 | rpmdb_version_save |
michael@13 | 318 | } |
michael@13 | 319 | |
michael@13 | 320 | db_unbreak () { |
michael@428 | 321 | # cleanup DB files |
michael@428 | 322 | verbose 2 "cleaning up RPM database DB files" |
michael@13 | 323 | for dbfile in $dbfiles; do |
michael@428 | 324 | eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
michael@428 | 325 | if [ -f $dbpath/$dbfile ]; then |
michael@428 | 326 | if [ ".$dbapi" = .3 -a ".$dbtype" = .region ]; then |
michael@428 | 327 | verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)" |
michael@428 | 328 | rm -f $dbpath/$dbfile || true |
michael@428 | 329 | elif [ ".$dbtype" = .temporary ]; then |
michael@428 | 330 | verbose 3 "cleaning up DB file: $dbpath/$dbfile ($dbapi:$dbtype)" |
michael@428 | 331 | rm -f $dbpath/$dbfile || true |
michael@428 | 332 | fi |
michael@13 | 333 | fi |
michael@13 | 334 | done |
michael@13 | 335 | } |
michael@13 | 336 | |
michael@428 | 337 | db_convert () { |
michael@428 | 338 | # make sure all RPM database DB files have the correct type |
michael@428 | 339 | # (as the type can be different during upgrading from RPM 4 to RPM 5) |
michael@428 | 340 | verbose 2 "making sure RPM database are of the correct type" |
michael@13 | 341 | for dbfile in $dbfiles; do |
michael@428 | 342 | eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
michael@428 | 343 | if [ ".$dbapi" != ".$DBAPI" ]; then |
michael@428 | 344 | continue |
michael@428 | 345 | fi |
michael@428 | 346 | if [ -f $dbpath/$dbfile ]; then |
michael@428 | 347 | if [ ".$dbapi" = .3 ] && [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then |
michael@428 | 348 | dbtype_old="`$rpmdb_dump -h $tmpdir -r $dbpath/$dbfile | grep '^type=' | sed -e 'q' | sed -e 's/^type=//'`" |
michael@428 | 349 | if [ ".$dbtype_old" != ".$dbtype" ]; then |
michael@428 | 350 | verbose 3 "converting DB file: $dbpath/$dbfile ($dbtype_old -> $dbtype)" |
michael@428 | 351 | rm -f $dbpath/$dbfile.new |
michael@428 | 352 | $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\ |
michael@428 | 353 | sed -e "s/^type=.*/type=$dbtype/" -e '/^h_nelem=.*/d' |\ |
michael@428 | 354 | $rpmdb_load -h $tmpdir $dbpath/$dbfile.new |
michael@428 | 355 | if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then |
michael@428 | 356 | rm -f $dbpath/$dbfile |
michael@428 | 357 | mv $dbpath/$dbfile.new $dbpath/$dbfile |
michael@428 | 358 | else |
michael@428 | 359 | warning "failed to convert RPM DB file \"$dbfile\"" |
michael@428 | 360 | fi |
michael@428 | 361 | fi |
michael@13 | 362 | fi |
michael@13 | 363 | fi |
michael@13 | 364 | done |
michael@13 | 365 | } |
michael@13 | 366 | |
michael@13 | 367 | db_reload () { |
michael@13 | 368 | # rebuilding new from old RPM database DB files by dumping and |
michael@13 | 369 | # reloading their entire content |
michael@13 | 370 | verbose 2 "dumping and reloading RPM database DB file contents" |
michael@13 | 371 | for dbfile in $dbfiles; do |
michael@428 | 372 | eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
michael@428 | 373 | if [ ".$dbapi" != ".$DBAPI" ]; then |
michael@428 | 374 | continue |
michael@428 | 375 | fi |
michael@13 | 376 | if [ -f $dbpath/$dbfile ]; then |
michael@428 | 377 | if [ ".$dbapi" = .3 ]; then |
michael@428 | 378 | verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)" |
michael@428 | 379 | if [ ".$dbtype" = .hash -o ".$dbtype" = .btree ]; then |
michael@428 | 380 | rm -f $dbpath/$dbfile.new |
michael@428 | 381 | $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile |\ |
michael@428 | 382 | $rpmdb_load -h $tmpdir $dbpath/$dbfile.new |
michael@428 | 383 | if $rpmdb_dump -h $tmpdir -r $dbpath/$dbfile.new >/dev/null 2>&1; then |
michael@428 | 384 | rm -f $dbpath/$dbfile |
michael@428 | 385 | mv $dbpath/$dbfile.new $dbpath/$dbfile |
michael@428 | 386 | else |
michael@428 | 387 | warning "failed to reload RPM DB file \"$dbfile\"" |
michael@428 | 388 | fi |
michael@428 | 389 | elif [ ".$dbtype" = .region ]; then |
michael@428 | 390 | rm -f $dbpath/$dbfile || true |
michael@428 | 391 | elif [ ".$dbtype" = .temporary ]; then |
michael@428 | 392 | rm -f $dbpath/$dbfile || true |
michael@428 | 393 | fi |
michael@428 | 394 | elif [ ".$dbapi" = .4 ]; then |
michael@428 | 395 | verbose 3 "dumping and reloading DB file: $dbpath/$dbfile ($dbtype)" |
michael@428 | 396 | rm -f $dbpath/$dbfile.new |
michael@428 | 397 | $rpmdb_sqlite $dbpath/$dbfile .dump |\ |
michael@428 | 398 | $rpmdb_sqlite $dbpath/$dbfile.new |
michael@428 | 399 | if $rpmdb_sqlite $dbpath/$dbfile.new >/dev/null 2>&1; then |
michael@428 | 400 | rm -f $dbpath/$dbfile |
michael@428 | 401 | mv $dbpath/$dbfile.new $dbpath/$dbfile |
michael@428 | 402 | else |
michael@428 | 403 | warning "failed to reload RPM DB file \"$dbfile\"" |
michael@428 | 404 | fi |
michael@13 | 405 | fi |
michael@13 | 406 | fi |
michael@13 | 407 | done |
michael@428 | 408 | rpmdb_version_save |
michael@428 | 409 | } |
michael@428 | 410 | |
michael@428 | 411 | db_migrate () { |
michael@428 | 412 | # perform database migration |
michael@428 | 413 | if [ ".$1" != . ]; then |
michael@428 | 414 | dblib="$1" |
michael@428 | 415 | fi |
michael@428 | 416 | dbapi_old="$DBAPI" |
michael@428 | 417 | if [ ".$dblib" = .db ]; then |
michael@428 | 418 | dbapi_new="3" |
michael@428 | 419 | elif [ ".$dblib" = .sqlite ]; then |
michael@428 | 420 | dbapi_new="4" |
michael@428 | 421 | else |
michael@428 | 422 | error "unknown RPM database backend library \"$dblib\"" |
michael@428 | 423 | fi |
michael@428 | 424 | if [ ".$dbapi_new" = ".$dbapi_old" ]; then |
michael@428 | 425 | error "RPM database already uses requested backend ($DBAPI:$DBLIB:$DBVER)" |
michael@428 | 426 | fi |
michael@428 | 427 | verbose 2 "migrating RPM database" |
michael@428 | 428 | rpm --rebuilddb --dbapi "$dbapi_old" --rebuilddbapi "$dbapi_new" |
michael@428 | 429 | verbose 3 "old RPM database format: $DBAPI:$DBLIB:$DBVER" |
michael@428 | 430 | DBAPI="$dbapi_new" |
michael@428 | 431 | rpmdb_version_save |
michael@428 | 432 | rpmdb_version_load |
michael@428 | 433 | verbose 3 "new RPM database format: $DBAPI:$DBLIB:$DBVER" |
michael@13 | 434 | } |
michael@13 | 435 | |
michael@13 | 436 | db_rebuild () { |
michael@13 | 437 | # perform official "rebuilddb" operation |
michael@13 | 438 | verbose 2 "rebuilding RPM database (built-in RPM procedure)" |
michael@13 | 439 | rpm --rebuilddb |
michael@428 | 440 | rpmdb_version_save |
michael@13 | 441 | } |
michael@13 | 442 | |
michael@13 | 443 | db_operate () { |
michael@13 | 444 | # perform some read/write operation on RPM database |
michael@13 | 445 | # (we have no package available, but removing and reimporting |
michael@13 | 446 | # the OpenPKG OpenPGP keys is a harmless thing and always possible) |
michael@13 | 447 | verbose 2 "performing read/write operation on RPM database" |
michael@13 | 448 | for spec in \ |
michael@13 | 449 | openpkg.org.pgp:gpg-pubkey-63c4cb9f-3c591eda \ |
michael@13 | 450 | openpkg.com.pgp:gpg-pubkey-61b7ae34-4544a6af \ |
michael@13 | 451 | openpkg.net.pgp:gpg-pubkey-52197903-4544a74d \ |
michael@13 | 452 | ; do |
michael@13 | 453 | eval `echo "$spec" | sed -e 's/^\(.*\):\(.*\)$/file="\1"; package="\2"/'` |
michael@13 | 454 | rpm -q $package >/dev/null 2>&1 && rpm -e $package --allmatches || true |
michael@13 | 455 | rpm -q $package >/dev/null 2>&1 || rpm --import $prefix/etc/openpkg/$file || true |
michael@13 | 456 | done |
michael@13 | 457 | rpm -qa >/dev/null 2>&1 |
michael@13 | 458 | } |
michael@13 | 459 | |
michael@13 | 460 | db_fixate () { |
michael@13 | 461 | # fix ownership and permissions of (especially newly created) |
michael@13 | 462 | # RPM database files to make sure they are consistent |
michael@13 | 463 | verbose 2 "making sure RPM database files have consistent attributes" |
michael@13 | 464 | for dbfile in $dbfiles; do |
michael@428 | 465 | eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
michael@428 | 466 | if [ ".$dbapi" != ".$DBAPI" ]; then |
michael@428 | 467 | continue |
michael@428 | 468 | fi |
michael@13 | 469 | verbose 3 "fixating DB file: $dbpath/$dbfile ($dbtype)" |
michael@428 | 470 | if [ -f $dbpath/$dbfile ]; then |
michael@428 | 471 | chown $musr:$mgrp $dbpath/$dbfile 2>/dev/null || true |
michael@428 | 472 | chmod 644 $dbpath/$dbfile 2>/dev/null || true |
michael@428 | 473 | fi |
michael@13 | 474 | done |
michael@428 | 475 | chown $musr:$mgrp $dbpath/VERSION 2>/dev/null || true |
michael@428 | 476 | chmod 644 $dbpath/VERSION 2>/dev/null || true |
michael@13 | 477 | } |
michael@13 | 478 | |
michael@13 | 479 | db_list () { |
michael@13 | 480 | # list all database files |
michael@13 | 481 | for dbfile in $dbfiles; do |
michael@428 | 482 | eval `echo $dbfile | sed -e 's/^\(.*\):\(.*\):\(.*\)$/dbapi="\1"; dbtype="\2"; dbfile="\3";/'` |
michael@428 | 483 | if [ ".$dbapi" != ".$DBAPI" ]; then |
michael@428 | 484 | continue |
michael@428 | 485 | fi |
michael@428 | 486 | if [ ! -f "$dbpath/$dbfile" ]; then |
michael@428 | 487 | continue |
michael@428 | 488 | fi |
michael@13 | 489 | if [ $verbose -eq 0 ]; then |
michael@13 | 490 | echo "$dbfile" |
michael@13 | 491 | elif [ $verbose -eq 1 ]; then |
michael@13 | 492 | echo "$dbpath/$dbfile" |
michael@13 | 493 | elif [ $verbose -ge 2 ]; then |
michael@13 | 494 | echo "$dbpath/$dbfile ($dbtype)" |
michael@13 | 495 | fi |
michael@13 | 496 | done |
michael@13 | 497 | } |
michael@13 | 498 | |
michael@13 | 499 | ## |
michael@13 | 500 | ## ENVIRONMENT CONSISTENCY CHECKS |
michael@13 | 501 | ## |
michael@13 | 502 | |
michael@13 | 503 | # sanity check OpenPKG instance |
michael@13 | 504 | if [ ".$prefix" = . ]; then |
michael@13 | 505 | error "OpenPKG instance directory is empty" |
michael@13 | 506 | fi |
michael@13 | 507 | if [ ! -d $prefix ]; then |
michael@13 | 508 | error "OpenPKG instance directory \"$prefix\" not found" |
michael@13 | 509 | fi |
michael@13 | 510 | if [ ! -x $prefix/bin/openpkg ]; then |
michael@13 | 511 | error "OpenPKG instance directory \"$prefix\" not valid" |
michael@13 | 512 | fi |
michael@13 | 513 | |
michael@13 | 514 | # sanity check OpenPKG RPM database |
michael@13 | 515 | if [ ".$dbpath" = . ]; then |
michael@13 | 516 | error "OpenPKG RPM database directory is empty" |
michael@13 | 517 | fi |
michael@13 | 518 | if [ ! -d $dbpath ]; then |
michael@13 | 519 | error "OpenPKG RPM database directory \"$dbpath\" not found" |
michael@13 | 520 | fi |
michael@13 | 521 | if [ ! -w $dbpath ]; then |
michael@13 | 522 | error "OpenPKG RPM database directory \"$dbpath\" not writable" |
michael@13 | 523 | fi |
michael@13 | 524 | |
michael@428 | 525 | # load database information |
michael@428 | 526 | rpmdb_version_load |
michael@428 | 527 | |
michael@13 | 528 | ## |
michael@13 | 529 | ## DISPATCH INTO COMMANDS |
michael@13 | 530 | ## |
michael@13 | 531 | |
michael@13 | 532 | case "$mode" in |
michael@13 | 533 | build ) |
michael@13 | 534 | verbose 1 "BUILDING NEW RPM DATABASE FROM SCRATCH ($dbpath)" |
michael@13 | 535 | db_remove |
michael@13 | 536 | db_init |
michael@428 | 537 | db_fixate |
michael@428 | 538 | db_operate |
michael@428 | 539 | ;; |
michael@428 | 540 | |
michael@428 | 541 | migrate ) |
michael@428 | 542 | verbose 1 "MIGRATING RPM DATABASE FORMAT ($dbpath)" |
michael@428 | 543 | db_unbreak |
michael@428 | 544 | db_convert |
michael@428 | 545 | db_migrate |
michael@13 | 546 | db_rebuild |
michael@13 | 547 | db_fixate |
michael@13 | 548 | db_operate |
michael@13 | 549 | ;; |
michael@13 | 550 | |
michael@13 | 551 | rebuild ) |
michael@13 | 552 | verbose 1 "REBUILDING NEW FROM OLD RPM DATABASE ($dbpath)" |
michael@13 | 553 | db_unbreak |
michael@428 | 554 | db_convert |
michael@13 | 555 | db_reload |
michael@13 | 556 | db_rebuild |
michael@13 | 557 | db_fixate |
michael@13 | 558 | db_operate |
michael@13 | 559 | ;; |
michael@13 | 560 | |
michael@13 | 561 | cleanup ) |
michael@13 | 562 | verbose 1 "CLEANING UP EXISTING RPM DATABASE ($dbpath)" |
michael@13 | 563 | db_unbreak |
michael@428 | 564 | db_convert |
michael@13 | 565 | db_rebuild |
michael@13 | 566 | db_fixate |
michael@13 | 567 | db_operate |
michael@13 | 568 | ;; |
michael@13 | 569 | |
michael@13 | 570 | fixate ) |
michael@13 | 571 | verbose 1 "FIXATING EXISTING RPM DATABASE ($dbpath)" |
michael@13 | 572 | db_fixate |
michael@13 | 573 | ;; |
michael@13 | 574 | |
michael@13 | 575 | list ) |
michael@13 | 576 | db_list |
michael@13 | 577 | ;; |
michael@13 | 578 | esac |
michael@13 | 579 | |
michael@13 | 580 | exit 0 |
michael@13 | 581 |