Ich habe eine eingebettete Plattform, auf der ich Anwendungscode mit RPMs bereitstellen. Traditionell wurde dies nach der Tat auf der Zielplattform durchgeführt (d. H. Installieren von RPM über eine Befehlszeile auf der Zielplattform durch eine Konsole). Um das Leben leichter und einfacher zu machen (oder so dachte ich), entschied ich, das RPM direkt auf dem Ziel-Dateisystem als Teil des Build-Prozesses auf dem Host zu installieren. Ich dachte, das Python-RPM-Modul zu verwenden und mit der RPM-Datenbank zu interagieren, die sich auf dem Ziel-Dateisystem befindet. Hier ist, was ich versuchte (beachten Sie, dass die RPM-Datenbank Position wird geändert, um die Datenbank auf dem Zieldateisystem-zu-Punkt in Bezug auf den Standard auf dem Host gegen):Python-RPM-Modul ruft Callback nicht mit 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)
Nachdem das Skript ausgeführt wird, wird der Rückruf aufgerufen drei Mal. Zuerst mit dem Grund rpm.RPMCALLBACK_TRANS_START, dann mit dem Grund rpm.RPMCALLBACK_TRANS_PROGRESS, dann mit dem Grund rpm.RPMCALLBACK_TRANS_STOP. Nach den Anweisungen hier: https://docs.fedoraproject.org/ro/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch16s06s04.html, sollte ich eine rpm.RPMCALLBACK_INST_OPEN_FILE während der Installation bekommen, aber das passiert nie.
Schließlich, wenn ich nach der Installation der RPM den Inhalt der Datenbank zu sehen (d. H. "CheckingPackage"), bekomme ich Länge 0 Übereinstimmung (dh es gibt nichts in der Datenbank).
Irgendwelche Ideen?