2016-04-07 8 views
1

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?

Antwort

1

Ich habe das herausgefunden und nur meine Beobachtungen gepostet, für den Fall, dass jemand anderes auf dasselbe Problem stößt. Das Problem hier war, dass ich eine inkompatible Architektur zwischen der Anwendung (ARM) und dem zugrunde liegenden RPM-Modul hatte, das von der Python-Bibliothek (x86_64) verwendet wurde. Letztendlich habe ich festgestellt, dass dies nicht möglich ist, da es auch Datenbankprobleme auf der Zielplattform geben wird, und habe dieses Problem behoben.