Explorar el Código

Ok, revise the RPM database creation and rebuilding procedure again. The main problem is that we neither can just copy the empty "Packages" file (because it is of type "hash" and RPM 4.2 uses also "btree" files) nor can we just touch(1) the files (because RPM will later complain under operations, although even the official RedHat RPM just touches the files). So, do it the ultimative way: we install the Berkeley-DB db_load/db_dump/db_verify tools (with prefix "rpm") and use these to really create missing files with the correct type from scratch. The result is the following. First, we have e.g. OpenPKG 1.3 (RPM 4.0.2, DB 3.2.4): | # /xx/bin/rpm -qa | openpkg-1.3.0-1.3.0 | # ll /xx/RPM/DB/ | total 432 | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Basenames | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Conflictname | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Group | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Name | -rw-r--r-- 1 xx xx 98304 Aug 27 09:57 Packages | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Providename | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Requirename | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Triggername | root@pg6:/tmp | # file /xx/RPM/DB/* | /xx/RPM/DB/Basenames: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Conflictname: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Group: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Name: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Packages: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Providename: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Requirename: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Triggername: Berkeley DB (Hash, version 7, native byte-order) Now we upgrade to OpenPKG-CURRENT (RPM 4.2.1, DB 4.1.24): | # /xx/bin/rpm -Uvh /xx/RPM/PKG/openpkg-20030827-20030827.ix86-freebsd4.8-xx.rpm | Preparing... ########################################### [100%] | 1:openpkg ########################################### [100%] | # ll /xx/RPM/DB/ | total 840 | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Basenames | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Conflictname | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Depends | -rw-r--r-- 1 xx xx 32768 Aug 27 23:02 Dirnames | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Filemd5s | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Group | -rw-r--r-- 1 xx xx 32768 Aug 27 23:02 Installtid | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Name | -rw-r--r-- 1 xx xx 114688 Aug 27 23:02 Packages | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Providename | -rw-r--r-- 1 xx xx 32768 Aug 27 23:02 Provideversion | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Pubkeys | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Requirename | -rw-r--r-- 1 xx xx 32768 Aug 27 23:02 Requireversion | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Sha1header | -rw-r--r-- 1 xx xx 49152 Aug 27 23:02 Sigmd5 | -rw-r--r-- 1 xx xx 49152 Aug 27 09:57 Triggername | -rw-r--r-- 1 xx xx 8192 Aug 27 23:02 __db.001 | -rw-r--r-- 1 xx xx 1318912 Aug 27 23:02 __db.002 | -rw-r--r-- 1 xx xx 737280 Aug 27 23:02 __db.003 | -rw-r--r-- 1 xx xx 0 Aug 27 23:02 __db.004 | -rw-r--r-- 1 xx xx 0 Aug 27 23:02 __db.005 | -rw-r--r-- 1 xx xx 0 Aug 27 23:02 __db.006 | -rw-r--r-- 1 xx xx 0 Aug 27 23:02 __db.007 | -rw-r--r-- 1 xx xx 0 Aug 27 23:02 __db.008 | -rw-r--r-- 1 xx xx 0 Aug 27 23:02 __db.009 | # file /xx/RPM/DB/* | /xx/RPM/DB/Basenames: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Conflictname: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/Depends: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Dirnames: Berkeley DB (Btree, version 9, native byte-order) | /xx/RPM/DB/Filemd5s: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Group: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Installtid: Berkeley DB (Btree, version 9, native byte-order) | /xx/RPM/DB/Name: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Packages: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Providename: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Provideversion: Berkeley DB (Btree, version 9, native byte-order) | /xx/RPM/DB/Pubkeys: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Requirename: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Requireversion: Berkeley DB (Btree, version 9, native byte-order) | /xx/RPM/DB/Sha1header: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Sigmd5: Berkeley DB (Hash, version 8, native byte-order) | /xx/RPM/DB/Triggername: Berkeley DB (Hash, version 7, native byte-order) | /xx/RPM/DB/__db.001: data | /xx/RPM/DB/__db.002: X11 SNF font data, LSB first | /xx/RPM/DB/__db.003: X11 SNF font data, LSB first | /xx/RPM/DB/__db.004: empty | /xx/RPM/DB/__db.005: empty | /xx/RPM/DB/__db.006: empty | /xx/RPM/DB/__db.007: empty | /xx/RPM/DB/__db.008: empty | /xx/RPM/DB/__db.009: empty

Ralf S. Engelschall hace 22 años
padre
commit
5efcd077e1
Se han modificado 2 ficheros con 57 adiciones y 21 borrados
  1. 25 19
      openpkg/openpkg.boot
  2. 32 2
      openpkg/openpkg.spec

+ 25 - 19
openpkg/openpkg.boot

@@ -466,14 +466,6 @@ export HOME
 echo "++ initializing RPM database"
 $tmpdir/rpm --initdb
 
-##
-##   save an empty DB file so that we can install below the
-##   yet untouched databases with correct owner and permissions.
-##
-
-cp $RPM_BUILD_ROOT$prefix/RPM/DB/Packages \
-   $RPM_BUILD_ROOT$prefix/RPM/DB/Empty
-
 ##
 ##   now turn over and re-iterate over the RPM spec, but this time
 ##   with the real RPM tool.
@@ -567,19 +559,33 @@ files=`cat $spec |\
        grep -v '^ *$' | grep -v '%defattr' |\
        sed -e 's;%config(noreplace) *;;' -e 's;%config *;;' \
            -e 's;%dir *;;' -e 's;%{l_prefix}/;;' -e 's;^ *;;' -e "s;%{V_rpm};${V_rpm};"`
-dbfiles=""
-for dbfile in \
-    Packages Name Basenames Group Requirename Providename Conflictname \
-    Triggername Dirnames Requireversion Provideversion Installtid \
-    Sigmd5 Sha1header Filemd5s Depends Pubkeys; do
-    if [ ! -f $RPM_BUILD_ROOT$prefix/RPM/DB/$dbfile ]; then
-        cp $RPM_BUILD_ROOT$prefix/RPM/DB/Empty \
-           $RPM_BUILD_ROOT$prefix/RPM/DB/$dbfile
+db_files=""
+for db in \
+    hash:Basenames hash:Conflictname hash:Depends btree:Dirnames hash:Filemd5s \
+    hash:Group btree:Installtid hash:Name hash:Packages hash:Providename \
+    btree:Provideversion hash:Pubkeys hash:Requirename btree:Requireversion \
+    hash:Sha1header hash:Sigmd5 hash:Triggername index:__db.001 index:__db.002 \
+    index:__db.003 index:__db.004 index:__db.005 index:__db.006 index:__db.007 \
+    index:__db.008 index:__db.009; do
+    eval `echo $db | sed -e 's/^\(.*\):\(.*\)$/db_type="\1"; db_file="\2";/'`
+    if [ ! -f $RPM_BUILD_ROOT$prefix/RPM/DB/$db_file ]; then
+        if [ ".$db_type" = .hash -o ".$db_type" = .btree ]; then
+            ( echo "VERSION=3"
+              echo "format=bytevalue"
+              echo "type=${db_type}"
+              echo "db_pagesize=16384"
+              echo "HEADER=END"
+              echo "DATA=END"
+            ) | $RPM_BUILD_ROOT$prefix/lib/openpkg/rpmdb_load \
+                $RPM_BUILD_ROOT$prefix/RPM/DB/$db_file
+        else
+            touch $RPM_BUILD_ROOT$prefix/RPM/DB/$db_file
+        fi
     fi
-    dbfiles="$dbfiles RPM/DB/$dbfile"
+    db_files="$db_files RPM/DB/$db_file"
 done
-rm -f $RPM_BUILD_ROOT$prefix/RPM/DB/Empty
-files="$files $dbfiles"
+chmod 644 $RPM_BUILD_ROOT$prefix/RPM/DB/*
+files="$files $db_files"
 ( cd $RPM_BUILD_ROOT$prefix;
   $RPM_BUILD_ROOT$prefix/lib/openpkg/tar --no-recursion -cf - $files) |\
 $l_uuencode openpkg-$v.$t.tar >>$dstdir/openpkg-$v.$t.sh

+ 32 - 2
openpkg/openpkg.spec

@@ -906,6 +906,9 @@ Provides:     OpenPKG
     %{l_prefix}/lib/openpkg/rpmtool
     %{l_prefix}/lib/openpkg/rpmu
     %{l_prefix}/lib/openpkg/rpmv
+    %{l_prefix}/lib/openpkg/rpmdb_load
+    %{l_prefix}/lib/openpkg/rpmdb_dump
+    %{l_prefix}/lib/openpkg/rpmdb_verify
     %{l_prefix}/lib/openpkg/rpmx.pl
     %{l_prefix}/lib/openpkg/rpmx.sh
     %{l_prefix}/lib/openpkg/shtool
@@ -1545,8 +1548,35 @@ Provides:     OpenPKG
           %{l_prefix}/bin/rpm -q gpg-pubkey-63c4cb9f-3c591eda >/dev/null 2>&1 || \
               %{l_prefix}/bin/rpm --import %{l_prefix}/etc/openpkg/openpkg.pgp || true
 
-          #   fix ownership of (especially newly created) RPM database files
+          #   make sure all RPM 4.2.x database files are present
+          for db in \
+              hash:Basenames hash:Conflictname hash:Depends btree:Dirnames hash:Filemd5s \
+              hash:Group btree:Installtid hash:Name hash:Packages hash:Providename \
+              btree:Provideversion hash:Pubkeys hash:Requirename btree:Requireversion \
+              hash:Sha1header hash:Sigmd5 hash:Triggername index:__db.001 index:__db.002 \
+              index:__db.003 index:__db.004 index:__db.005 index:__db.006 index:__db.007 \
+              index:__db.008 index:__db.009; do
+              eval `echo $db | sed -e 's/^\(.*\):\(.*\)$/db_type="\1"; db_file="\2";/'`
+              if [ ! -f %{l_prefix}/RPM/DB/$db_file ]; then
+                  if [ ".$db_type" = .hash -o ".$db_type" = .btree ]; then
+                      ( echo "VERSION=3"
+                        echo "format=bytevalue"
+                        echo "type=${db_type}"
+                        echo "db_pagesize=16384"
+                        echo "HEADER=END"
+                        echo "DATA=END"
+                      ) | %{l_prefix}/lib/openpkg/rpmdb_load \
+                          %{l_prefix}/RPM/DB/$db_file
+                  else
+                      touch %{l_prefix}/RPM/DB/$db_file
+                  fi
+              fi
+          done
+
+          #   fix ownership and permissions of (especially newly created)
+          #   RPM database files to make sure they are consistent
           chown %{l_musr}:%{l_mgrp} %{l_prefix}/RPM/DB/* || true
+          chmod 644 %{l_prefix}/RPM/DB/* || true
         ) </dev/null >/dev/null 2>/dev/null &
     fi
 
@@ -1789,7 +1819,7 @@ Provides:     OpenPKG
     fi
 
     #   delayed removal of top-level directory.
-    ( sleep 10
+    ( sleep 2
       rm -rf %{l_prefix}/RPM/DB/* %{l_prefix}/RPM/DB/.[a-z]* >/dev/null 2>&1 || true
       rmdir %{l_prefix}/RPM/DB >/dev/null 2>&1 || true
       rmdir %{l_prefix}/RPM >/dev/null 2>&1 || true