RPMを使用してアプリケーションコードをデプロイする組み込みプラットフォームがあります。従来、これはターゲットプラットフォーム上での事実の後に行われた(すなわち、コンソールを介してターゲットプラットフォームにコマンドラインを介してrpmをインストールする)。人生をより簡単で簡単にするために、私はホスト上のビルドプロセスの一部としてRPMをターゲットファイルシステムに直接インストールすることにしました。私は、Python RPMモジュールを使用し、ターゲットファイルシステム上にあるRPMデータベースとやりとりすることを考えました。ここで(RPMデータベースの場所は、ホスト上のデフォルトとは対照的に、ターゲット・ファイル・システム上のデータベースを指すように変更されていることに注意してください)私が試したものです:Python rpmモジュールがrpm.RPMCALLBACK_INST_OPEN_FILEでコールバックを呼び出さない
#!/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になります(データベースに何もないことを意味します)。
アイデア?