使用Python比较RPM软件包 [英] Compare RPM Packages using Python

查看:98
本文介绍了使用Python比较RPM软件包的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将包含所需Linux软件包的csv文件与当前安装的软件包进行比较.比较结果将输出所有未安装的软件包或比当前安装的软件包新的软件包.

I'm trying to compare a csv file containing required Linux packages with the current installed packages. The comparison should output any packages not installed or newer than the current installed packages.

问题是我无法遍历已安装软件包的列表并显示所有匹配,例如具有相同名称和版本的软件包,但是两次显示不同的体系结构(例如compat-libstdc ++-33) ,但下面的脚本才使我大获成功.

The problem is that I'm unable to loop through the list of installed packages and show all hits, for instance packages with the same name and version, but different architecture should be shown twice(for instance compat-libstdc++-33), but I only getting the first hit with the script below.

#!/usr/bin/python

import rpm
import csv
import sys
import os

'''
Script to check installed rpms against a csv file containing the package name and version similar to the list below:
atk,1.12.2
libart_lgpl,2.3
info,4.9
libsepol,1.15.2
libusb,0.1.12
libfontenc,1.4.2

'''

if len(sys.argv) !=2:
        print ''
        print 'Usage: ', sys.argv[0], '/path/to/csv_input_file'
        print ''
        sys.exit(1)

if not os.path.isfile(sys.argv[1]):
        print ''
        print sys.argv[1], 'not found!'
        print ''
        sys.exit(1)

else:
        input_csv = sys.argv[1]

pkgRequired = csv.reader(open(input_csv),delimiter=',')

pkgInstalledName = []
pkgInstalledVersion = []
pkgInstalledArch = []

ts = rpm.TransactionSet()
mi = ts.dbMatch()

for h in mi:
        pkgInstalledName.append((h['name']))
        pkgInstalledVersion.append((h['version']))
        pkgInstalledArch.append((h['arch']))

for row in pkgRequired:
        pkgRequiredName = row[0]
        pkgRequiredVersion = row[1]
        #pkgRequiredArch = row[2]

        if pkgRequiredName in pkgInstalledName:

                if pkgInstalledVersion[pkgInstalledName.index(pkgRequiredName)] >= pkgRequiredVersion:
                        pass
                else:
                        print '\nInstalled:  ',pkgInstalledName[pkgInstalledName.index(pkgRequiredName)], pkgInstalledVersion[pkgInstalledName.index(pkgRequiredName)], pkgInstalledArch[pkgInstalledName.index(pkgRequiredName)], ' \nRequired: ', ' ', pkgRequiredName,pkgRequiredVersion

推荐答案

这是我最终为使此工作可用的方法.该脚本当前不检查所需软件包的体系结构,但至少它显示已安装的arch.该脚本有效(据我所知),但是可以作为我在python上的第一个脚本加以改进:)

This is what I ended up doing to get this working. The script currently is not checking for the architecture of required packages, but at least it shows the arch installed. The script works (as far as I know) but can be improved as its my first at python :)

    #!/usr/bin/python

import rpm
import csv
import sys
import os

'''
Script to check installed rpms against a csv file containing the package name and version similar to the list below:
atk,1.12.2
libart_lgpl,2.3
info,4.9
libsepol,1.15.2
libusb,0.1.12
libfontenc,1.4.2

'''

#silverbullet - 20120301

if len(sys.argv) !=2:
        print ''
        print 'Usage: ', sys.argv[0], '/path/to/csv_input_file'
        print ''
        sys.exit(1)

if not os.path.isfile(sys.argv[1]):
        print ''
        print sys.argv[1], 'not found!'
        print ''
        sys.exit(1)

else:
        input_csv = sys.argv[1]

pkgRequired = csv.reader(open(input_csv),delimiter=',')

pkgInstalledName = []
pkgInstalledVersion = []
pkgInstalledArch = []

ts = rpm.TransactionSet()
mi = ts.dbMatch()

for h in mi:
        pkgInstalledName.append((h['name']))
        pkgInstalledVersion.append((h['version']))
        pkgInstalledArch.append((h['arch']))

for row in pkgRequired:
        try:
                pkgRequiredName = row[0]
                pkgRequiredVersion = row[1]
                #pkgRequiredArch = row[2] - This is not implemented yet, ie, script will ignore architecture in csv input file
        except:
                print "Unexpected Error. Check if input is csv format with no blank lines. "#, sys.exc_info()[1]
                break
        else:
                for pos, pkg in enumerate(pkgInstalledName):
                        if pkg == pkgRequiredName:
                                if pkgInstalledVersion[pos] >= pkgRequiredVersion:
                                        pass
                                else:
                                        print '\nInstalled:', pkgInstalledName[pos], pkgInstalledVersion[pos], pkgInstalledArch[pos], '\nRequired: ', pkg, pkgRequiredVersion

这篇关于使用Python比较RPM软件包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆