如何阅读 var/lib/rpm/Packages 内容
How to read var/lib/rpm/Packages content
我在基于 Centos:8 的映像中的路径 var/lib/rpm 中有“Packages”文件。
我如何读取/获取“Packages”文件内容
正如我在一些文档中所读到的,该文件属于 berkeley DB 类型。对此我不确定。
Berkeley DB 是一个嵌入式数据库,运行在应用程序中。存储在其中的所有数据都是二进制格式,特定于将其存储在那里的应用程序。访问数据的最佳选择始终是使用应用程序本身 - 在您的情况下,RPM。
如果您必须做一些非常特别的事情,最好的选择可能是拉下 RPM 的源代码并修改它以执行您想要的操作。
如果您还没有在您的系统上安装它,有一个 db_dump
程序随 Berkeley DB 一起分发。您可以在 RPM 数据库上 运行 它。但由于数据都是二进制的,您需要参考 RPM 源代码来弄清楚如何解释它。
正如 Mike Andrews 所写,使用 rpm。
例如你可以使用这个:
$> cd /wherever/you/put/your/Packages/file
$> rpm -qa --last --dbpath $PWD
或
$> rpm -qa --last --dbpath /wherever/you/put/your/Packages/file
xorg-x11-drv-ati-firmware-7.1.0-3.el6.noarch Fri Nov 29 17:53:35 2013
ql2100-firmware-1.19.38-3.1.el6.noarch Fri Nov 29 17:53:35 2013
...
您可以像下面这样使用 "rpm" python 库,它输出与
相同的结果
rpm -qa --dbpath /some/path/to/rpm/db
JSON格式
您现在可以忽略 _db_backend,因为它的唯一值是 "bdb"
import sys
import rpm
import json
if (len(sys.argv) != 3):
print ('invalid amount of input arguments!')
sys.exit()
# user inputs
dbtype = sys.argv[1]
dbpath = sys.argv[2]
# add macro to be used by rpm
rpm.addMacro("_db_backend", dbtype)
rpm.addMacro("_dbpath", dbpath)
# Open database
ts = rpm.TransactionSet()
ts.openDB()
# remove macro for future cases
rpm.delMacro("_db_backend")
rpm.delMacro("_dbpath")
allPackages = []
# retrieve all packages from BDB
mi = ts.dbMatch()
# build JSON object from all packages for easier parsing
for hdr in mi:
pkgDict = {}
allPackages.append(pkgDict)
pkgDict['NAME'] = hdr[rpm.RPMTAG_NAME]
pkgDict['VERSION'] = hdr[rpm.RPMTAG_VERSION]
pkgDict['RELEASE'] = hdr[rpm.RPMTAG_RELEASE]
pkgDict['ARCH'] = hdr[rpm.RPMTAG_ARCH]
print (json.dumps(allPackages))
我在基于 Centos:8 的映像中的路径 var/lib/rpm 中有“Packages”文件。 我如何读取/获取“Packages”文件内容
正如我在一些文档中所读到的,该文件属于 berkeley DB 类型。对此我不确定。
Berkeley DB 是一个嵌入式数据库,运行在应用程序中。存储在其中的所有数据都是二进制格式,特定于将其存储在那里的应用程序。访问数据的最佳选择始终是使用应用程序本身 - 在您的情况下,RPM。
如果您必须做一些非常特别的事情,最好的选择可能是拉下 RPM 的源代码并修改它以执行您想要的操作。
如果您还没有在您的系统上安装它,有一个 db_dump
程序随 Berkeley DB 一起分发。您可以在 RPM 数据库上 运行 它。但由于数据都是二进制的,您需要参考 RPM 源代码来弄清楚如何解释它。
正如 Mike Andrews 所写,使用 rpm。
例如你可以使用这个:
$> cd /wherever/you/put/your/Packages/file
$> rpm -qa --last --dbpath $PWD
或
$> rpm -qa --last --dbpath /wherever/you/put/your/Packages/file
xorg-x11-drv-ati-firmware-7.1.0-3.el6.noarch Fri Nov 29 17:53:35 2013
ql2100-firmware-1.19.38-3.1.el6.noarch Fri Nov 29 17:53:35 2013
...
您可以像下面这样使用 "rpm" python 库,它输出与
相同的结果rpm -qa --dbpath /some/path/to/rpm/db
JSON格式
您现在可以忽略 _db_backend,因为它的唯一值是 "bdb"
import sys
import rpm
import json
if (len(sys.argv) != 3):
print ('invalid amount of input arguments!')
sys.exit()
# user inputs
dbtype = sys.argv[1]
dbpath = sys.argv[2]
# add macro to be used by rpm
rpm.addMacro("_db_backend", dbtype)
rpm.addMacro("_dbpath", dbpath)
# Open database
ts = rpm.TransactionSet()
ts.openDB()
# remove macro for future cases
rpm.delMacro("_db_backend")
rpm.delMacro("_dbpath")
allPackages = []
# retrieve all packages from BDB
mi = ts.dbMatch()
# build JSON object from all packages for easier parsing
for hdr in mi:
pkgDict = {}
allPackages.append(pkgDict)
pkgDict['NAME'] = hdr[rpm.RPMTAG_NAME]
pkgDict['VERSION'] = hdr[rpm.RPMTAG_VERSION]
pkgDict['RELEASE'] = hdr[rpm.RPMTAG_RELEASE]
pkgDict['ARCH'] = hdr[rpm.RPMTAG_ARCH]
print (json.dumps(allPackages))