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 模块之间有一个不兼容的架构。我最终确定这是不可能的,因为目标平台上也会存在数据库问题,并最终解决了这个问题。