设为首页 收藏本站
查看: 998|回复: 0

[经验分享] python读取rpm数据库和rpm包,以及关闭rpm数据库

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-15 09:29:11 | 显示全部楼层 |阅读模式
python做的批量部署工具的agent端(打包好rpm的)需要做自升级,自升级需要验证rpm包,所以找了下相关文档

参考资料
http://bbs.csdn.net/topics/380068624


官方文档
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的源代码才知道怎么关闭

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151375-1-1.html 上篇帖子: Python【十三】:类的基础 下篇帖子: python enumerate用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表