#!/usr/bin/python -tt
'''
Author: Brian Stinson <brian@bstinson.com>
Check rpminfo attributes that must be set before release in the repositories (e.g. Vendor, Packager)
'''
from __future__ import print_function, with_statement
import os
import sys
import yum
from datetime import datetime
from fnmatch import fnmatch
def log(methodstring):
localtime = datetime.now()
print("[+] {0} -> {1}".format(localtime.strftime("%a %b %e %H:%M:%S %Z %Y"), methodstring))
def fail(failstring):
log('FAIL {0}'.format(failstring))
def skip(skipstring):
log('SKIP {0}'.format(skipstring))
log('Running check-rpminfo.py - Check rpminfo Attributes')
# Set the required attributes and their values here. You may use shell-style
# globs in the value if necessary.
required_attrs = {
'vendor': 'CentOS',
'packager': '*centos.org*',
}
# special_overrides is a dictionary of packages and a list of attributes
# to ignore for that package. When updating this list add a comment to
# the line describing why the override is in place
special_overrides = {
'epel-release': ['vendor', 'packager'], #Rebuilt directly from Fedora, so the vendor remains Fedora Project
'elrepo-release': ['vendor', 'packager'], #Imported from elrepo, so the vendor remains "The ELRepo Project"
'redhat-support-lib-python': ['vendor'],
'redhat-support-tool': ['vendor'],
}
# you can also add the NVR, and the attribute to ignore to the special_overrides.txt file
with open(os.path.join(sys.path[0],'special_overrides.txt'),'r') as thefile:
for line in thefile.readlines():
if not line.strip() or line.startswith('#'):
continue
pkg, ignoreattr = map(str.strip,line.split(':'))
special_overrides.setdefault(pkg, []).append(ignoreattr)
yb = yum.YumBase()
yb.conf.cache = 0
yb.repos.doSetup()
log("Checking repos: {0}".format(', '.join([r.name for r in yb.repos.listEnabled()])))
sack = yb.pkgSack
finalret = 0
for pkg in sack:
for attr, val in required_attrs.iteritems():
nvr = '{0}-{1}-{2}'.format(pkg['name'], pkg['version'], pkg['release'])
nvra = '{0}-{1}-{2}.{3}'.format(pkg['name'], pkg['version'], pkg['release'], pkg['arch'])
if pkg.name in special_overrides:
if attr in special_overrides[pkg.name]:
skip('{0}: {1} listed in special_overrides'.format(pkg.remote_path, attr))
continue
elif nvr in special_overrides:
if attr in special_overrides[nvr]:
skip('{0}: {1} listed in special_overrides'.format(pkg.remote_path, attr))
continue
elif nvra in special_overrides:
if attr in special_overrides[nvra]:
skip('{0}: {1} listed in special_overrides'.format(pkg.remote_path, attr))
continue
if not pkg[attr]:
fail('{0}: Missing {1}'.format(pkg.remote_path, attr))
finalret = 1
continue
if not fnmatch(str.upper(pkg[attr]), str.upper(val)):
fail('{0}: {1}: {2} does not match {3}'.format(pkg.remote_path, attr, pkg[attr], val))
finalret = 1
sys.exit(finalret)