python做的批量部署工具的agent端(打包好rpm的)需要做自升级,自升级需要验证rpm包,所以找了下相关文档
参考资料
/>
官方文档
http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-rpm-programming-python.html
-
import rpm
-
#这个是rpm那个什么对象,反正必须有
-
ts = rpm.ts()
-
-
#从rpm数据库中获取rpm包,之表示获取name为为middleware-lib的rpm包,不带参数返回所有数据库里的rpm
-
#mi = ts.dbMatch('name','middleware-lib')
-
#print len(mi)
-
-
#h = mi.next()
-
#这里是通过文件获取rpm对象
-
f = open('/root/rpmbuild/RPMS/noarch/middleware-lib-1.0.0-6.el6.noarch.rpm','r')
-
h = ts.hdrFromFdno(f)
-
f.close()
-
-
#h这个对象包含的元素
-
print h['Name']
-
print h['ARCH']
-
print h['OS']
-
print h['PLATFORM']
-
print h['Vendor']
-
print h['Size']
-
print h['description']
-
-
#for h in mi:
-
# rpm_name = h['name']
-
# rpm_version = h['version']
-
# rpm_release = h['release']
-
# files = h['FILENAMES']
-
# if rpm_name in ('middleware-lib','middleware-mhj-agent','middleware-mhj'):
-
# print rpm_name,rpm_version,rpm_release
-
# print h.fiFromHeader
rpm包签名验证部分后续补充
重要补充
调用dbMatch以后,进程内会打开两个文件描述符(n个dpMatch会有n*2个描述符打开,关联对象为/var/lib/rpm/Packages /var/lib/rpm/Name)
如果这时候安装rpm容易导致rpm数据库错误
必须在获取rpm数据库信息后关闭掉rpmdb的链接
ts的closeDB方法不能直接关闭rpm数据库
需要如下步骤来关闭rpm数据库
1、必须遍历完dbMatch返回的对象迭代对象(mi)
2、删除这个对象(mi),不能由gc回收,必须手动del mi,当删除掉这个对象的时候,rpm的锁才会释放(其实是mi.next()遍历到的rpm包就就会锁住)
3、调用ts.closeDB()
步骤错误将无法直接关闭掉已经打开的rpm数据库,目前也没有在官方文档里找到相关关闭rpm数据库的说明
需要看_rpm.so的源代码才知道怎么关闭
阅读(2514) | 评论(0) | 转发(0) |