Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1102442
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: 系统运维

2015-06-25 17:55:16

python做的批量部署工具的agent端(打包好rpm的)需要做自升级,自升级需要验证rpm包,所以找了下相关文档

参考资料
/>

官方文档
http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-rpm-programming-python.html


点击(此处)折叠或打开

  1. import rpm
  2. #这个是rpm那个什么对象,反正必须有
  3. ts = rpm.ts()

  4. #从rpm数据库中获取rpm包,之表示获取name为为middleware-lib的rpm包,不带参数返回所有数据库里的rpm
  5. #mi = ts.dbMatch('name','middleware-lib')
  6. #print len(mi)

  7. #h = mi.next()
  8. #这里是通过文件获取rpm对象
  9. f = open('/root/rpmbuild/RPMS/noarch/middleware-lib-1.0.0-6.el6.noarch.rpm','r')
  10. h = ts.hdrFromFdno(f)
  11. f.close()

  12. #h这个对象包含的元素
  13. print h['Name']
  14. print h['ARCH']
  15. print h['OS']
  16. print h['PLATFORM']
  17. print h['Vendor']
  18. print h['Size']
  19. print h['description']

  20. #for h in mi:
  21. # rpm_name = h['name']
  22. # rpm_version = h['version']
  23. # rpm_release = h['release']
  24. # files = h['FILENAMES']
  25. # if rpm_name in ('middleware-lib','middleware-mhj-agent','middleware-mhj'):
  26. # print rpm_name,rpm_version,rpm_release
  27. # 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的源代码才知道怎么关闭


阅读(2409) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~