2016-04-07 9 views
1

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になります(データベースに何もないことを意味します)。

アイデア?

答えて

1

他の誰かが同じ問題に遭遇した場合に備えて、私はこれを理解して、私の観察を投稿しました。ここでの問題は、アプリケーション(ARM)とPythonライブラリ(x86_64)で使用されるRPMモジュールとの間に互換性のないアーキテクチャがあることでした。最終的には、ターゲットプラットフォームにもデータベースの問題が存在するため、これが不可能であると判断し、この問題を回避することになりました。