Python rpm 模块未使用 rpm.RPMCALLBACK_INST_OPEN_FILE 调用回调
Python rpm module not calling callback with rpm.RPMCALLBACK_INST_OPEN_FILE
我有一个嵌入式平台,我在该平台上使用 RPM 部署应用程序代码。传统上,这是事后在目标平台上完成的(即通过控制台在目标平台上通过命令行安装 rpm)。为了让生活更轻松、更简单(或者我是这么想的),我决定将 RPM 作为主机上构建过程的一部分直接安装到目标文件系统上。我想使用 Python RPM 模块并与驻留在目标文件系统上的 RPM 数据库进行交互。这是我尝试过的(请注意,RPM 数据库位置已被修改为指向目标文件系统上的数据库,而不是主机上的默认值):
#!/usr/bin/python
import os, rpm
rpmtsCallback_fd = None
def runCallback(reason, amount, total, key, client_data):
global rpmtsCallback_fd
print 'callback called with reason' + str(reason)
if reason == rpm.RPMCALLBACK_INST_OPEN_FILE:
print "Opening file."
rpmtsCallback_fd = os.open(key, os.O_RDONLY)
return rpmtsCallback_fd
elif reason == rpm.RPMCALLBACK_INST_CLOSE_FILE:
print "Closing file"
os.close(rpmtsCallback_fd)
def installPackage(ts):
ts.initDB()
fdno = os.open("/home/mbilloo/test_rfs/application.rpm", os.O_RDONLY)
hdr = ts.hdrFromFdno(fdno)
os.close(fdno)
print 'Installing ' + str(hdr['name']) + ' to RFS'
ts.addInstall(hdr, "/home/mbilloo/test_rfs/application.rpm", 'i')
unresolved_deps = ts.check()
if unresolved_deps:
print "Have unresolved dependencies: %s" % (unresolved_deps,)
return
ts.order()
ts.run(runCallback, 1)
def checkPackage(ts):
ts.openDB()
mi = ts.dbMatch()
print 'size of mi = '+ str(len(mi))
rpm.addMacro("_dbpath", "/home/mbilloo/test_rfs/var/lib/rpm/")
trs = rpm.TransactionSet()
trs.setVSFlags(-1)
installPackage(trs)
checkPackage(trs)
在运行上面的脚本之后,回调被调用了3次。首先,原因 rpm.RPMCALLBACK_TRANS_START,然后原因 rpm.RPMCALLBACK_TRANS_PROGRESS,最后原因 rpm.RPMCALLBACK_TRANS_STOP。根据此处的说明:https://docs.fedoraproject.org/ro/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch16s06s04.html,我应该在安装过程中得到一个 rpm.RPMCALLBACK_INST_OPEN_FILE,但这从来没有发生过。
最后,当我在安装 RPM 后查看数据库的内容时(即 "checkingPackage"),我得到长度为 0 的匹配项(意味着数据库中没有任何内容)。
有什么想法吗?
我想通了,只是发布我的观察结果,以防其他人遇到同样的问题。这里的问题是我在应用程序 (ARM) 和 python 库 (x86_64) 使用的底层 RPM 模块之间有一个不兼容的架构。我最终确定这是不可能的,因为目标平台上也会存在数据库问题,并最终解决了这个问题。
我有一个嵌入式平台,我在该平台上使用 RPM 部署应用程序代码。传统上,这是事后在目标平台上完成的(即通过控制台在目标平台上通过命令行安装 rpm)。为了让生活更轻松、更简单(或者我是这么想的),我决定将 RPM 作为主机上构建过程的一部分直接安装到目标文件系统上。我想使用 Python RPM 模块并与驻留在目标文件系统上的 RPM 数据库进行交互。这是我尝试过的(请注意,RPM 数据库位置已被修改为指向目标文件系统上的数据库,而不是主机上的默认值):
#!/usr/bin/python
import os, rpm
rpmtsCallback_fd = None
def runCallback(reason, amount, total, key, client_data):
global rpmtsCallback_fd
print 'callback called with reason' + str(reason)
if reason == rpm.RPMCALLBACK_INST_OPEN_FILE:
print "Opening file."
rpmtsCallback_fd = os.open(key, os.O_RDONLY)
return rpmtsCallback_fd
elif reason == rpm.RPMCALLBACK_INST_CLOSE_FILE:
print "Closing file"
os.close(rpmtsCallback_fd)
def installPackage(ts):
ts.initDB()
fdno = os.open("/home/mbilloo/test_rfs/application.rpm", os.O_RDONLY)
hdr = ts.hdrFromFdno(fdno)
os.close(fdno)
print 'Installing ' + str(hdr['name']) + ' to RFS'
ts.addInstall(hdr, "/home/mbilloo/test_rfs/application.rpm", 'i')
unresolved_deps = ts.check()
if unresolved_deps:
print "Have unresolved dependencies: %s" % (unresolved_deps,)
return
ts.order()
ts.run(runCallback, 1)
def checkPackage(ts):
ts.openDB()
mi = ts.dbMatch()
print 'size of mi = '+ str(len(mi))
rpm.addMacro("_dbpath", "/home/mbilloo/test_rfs/var/lib/rpm/")
trs = rpm.TransactionSet()
trs.setVSFlags(-1)
installPackage(trs)
checkPackage(trs)
在运行上面的脚本之后,回调被调用了3次。首先,原因 rpm.RPMCALLBACK_TRANS_START,然后原因 rpm.RPMCALLBACK_TRANS_PROGRESS,最后原因 rpm.RPMCALLBACK_TRANS_STOP。根据此处的说明:https://docs.fedoraproject.org/ro/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch16s06s04.html,我应该在安装过程中得到一个 rpm.RPMCALLBACK_INST_OPEN_FILE,但这从来没有发生过。
最后,当我在安装 RPM 后查看数据库的内容时(即 "checkingPackage"),我得到长度为 0 的匹配项(意味着数据库中没有任何内容)。
有什么想法吗?
我想通了,只是发布我的观察结果,以防其他人遇到同样的问题。这里的问题是我在应用程序 (ARM) 和 python 库 (x86_64) 使用的底层 RPM 模块之间有一个不兼容的架构。我最终确定这是不可能的,因为目标平台上也会存在数据库问题,并最终解决了这个问题。