scripts/clone-errata/rhn-clone-errata.py | 694 +++++++++++++++---------------- 1 file changed, 350 insertions(+), 344 deletions(-)
New commits: commit fcfb0be6701fdcdf00a0b8807df980a1c19115c8 Author: Aron Parsons aronparsons@gmail.com Date: Tue Jan 31 19:35:43 2012 -0500
cleanup whitespace in rhn-clone-errata.py
diff --git a/scripts/clone-errata/rhn-clone-errata.py b/scripts/clone-errata/rhn-clone-errata.py index eb1499b..1950d78 100755 --- a/scripts/clone-errata/rhn-clone-errata.py +++ b/scripts/clone-errata/rhn-clone-errata.py @@ -28,79 +28,79 @@ # # 0.1 - 2009-09-01 - Andy Speagle # -# Initial release. Lots of problems. Oof. +# Initial release. Lots of problems. Oof. # # 0.2 - 2009-09-11 - Andy Speagle # -# Updated methodology for handling errata. Breaking up individual -# errata appended with a channel identifier to better automate publishing -# of errata. +# Updated methodology for handling errata. Breaking up individual +# errata appended with a channel identifier to better automate publishing +# of errata. # -# Some code reworking. I still suck at python. Removed deprecated "sets" -# module. +# Some code reworking. I still suck at python. Removed deprecated "sets" +# module. # # 0.3 - 2009-09-17 - Andy Speagle # -# Fixed a rather glaring bug in the logic regarding relevant channel -# for package selection. Ugh. +# Fixed a rather glaring bug in the logic regarding relevant channel +# for package selection. Ugh. # # 0.4 - 2009-10-01 - Andy Speagle # -# Modified how the publish happens. Now it creates the errata and THEN -# calls the separate errata.publish() function. I was having some -# intermittent time-outs doing the two together in the errata.create() -# function. +# Modified how the publish happens. Now it creates the errata and THEN +# calls the separate errata.publish() function. I was having some +# intermittent time-outs doing the two together in the errata.create() +# function. # # 0.5 - 2010-03-17 - Andy Speagle # -# Moved servers, users and passwords to a config file of your choice. -# Many config options changed as a result. Options on the command line -# override config file options. +# Moved servers, users and passwords to a config file of your choice. +# Many config options changed as a result. Options on the command line +# override config file options. # -# Merged proxy support code from Colin Coe colin.coe@gmail.com (THANKS!) +# Merged proxy support code from Colin Coe colin.coe@gmail.com (THANKS!) # -# Modified some of the formatting for logfile output. +# Modified some of the formatting for logfile output. # -# I continue to suck at Python. +# I continue to suck at Python. # # 0.6 - 2010-03-18 - Andy Speagle # -# Corrected a grievous bug in the new Proxy code. +# Corrected a grievous bug in the new Proxy code. # -# Moved Channel and ChannelSuffix maps to the config file. +# Moved Channel and ChannelSuffix maps to the config file. # # 0.7 - 2010-11-10 - Andy Speagle # -# Minor bugfixes a/o cosmetic changes. +# Minor bugfixes a/o cosmetic changes. # # 0.8.1 - 2011-06-06 - Andy Speagle # -# Testing out new proxy code for handling authenticated proxies also. -# NOT PRODUCTION CODE +# Testing out new proxy code for handling authenticated proxies also. +# NOT PRODUCTION CODE # # 0.8.2 - 2011-06-06 - Andy Speagle # -# Update to new proxy code. +# Update to new proxy code. # # 0.8.3 - 2011-06-06 - Andy Speagle # -# Add selector for which server connections need proxy. This is crude, will cleanup later. +# Add selector for which server connections need proxy. This is crude, will cleanup later. # # 0.8.4 - 2011-06-06 - Andy Speagle # -# Add some code to handle transparent proxies. +# Add some code to handle transparent proxies. # # 0.9.0 - 2011-11-17 - Andy Speagle # -# Included patch from Pierre Casenove pcasenove@gmail.com that gives an option for a -# full sync of all channels listed in the configuration file. +# Included patch from Pierre Casenove pcasenove@gmail.com that gives an option for a +# full sync of all channels listed in the configuration file. # -# Thanks, Pierre! +# Thanks, Pierre! # -# Additionally, changed the default behaviour of how the script handles errata that are -# missing packages on the system. The script now skips any errata that is missing one -# or more packages on the system. However, I've added an option to allow the script -# to ignore missing packages so that the old behaviour remains. +# Additionally, changed the default behaviour of how the script handles errata that are +# missing packages on the system. The script now skips any errata that is missing one +# or more packages on the system. However, I've added an option to allow the script +# to ignore missing packages so that the old behaviour remains. #
import xmlrpclib, httplib @@ -114,19 +114,19 @@ from urllib import unquote, splittype, splithost
class AuthProxyTransport(xmlrpclib.Transport): def set_proxy(self, proxy): - self.proxy = options.proxy + self.proxy = options.proxy
def request(self, host, handler, request_body, verbose=0): - type, r_type = splittype(self.proxy) + type, r_type = splittype(self.proxy)
- if 'http' in type: - phost, XXX = splithost(r_type) - else: - phost = self.proxy + if 'http' in type: + phost, XXX = splithost(r_type) + else: + phost = self.proxy
- puser_pass = None - if '@' in phost: - user_pass, phost = phost.split('@', 1) + puser_pass = None + if '@' in phost: + user_pass, phost = phost.split('@', 1) if ':' in user_pass: user, password = user_pass.split(':', 1) puser_pass = base64.encodestring('%s:%s' % (unquote(user),unquote(password))).strip() @@ -137,7 +137,7 @@ class AuthProxyTransport(xmlrpclib.Transport): else: urlopener.addheaders = [('User-agent', self.user_agent),('Proxy-authorization', 'Basic ' + puser_pass)]
- host = unquote(host) + host = unquote(host) f = urlopener.open("http://%s%s%22%(host,handler), request_body)
self.verbose = verbose @@ -161,54 +161,54 @@ class RHNServer: self.login = user self.password = passwd self.rhnUrl = 'https://%27+self.rhnServerName+%27/rpc/api' - self.proxy_enable = proxy_enable - if self.proxy_enable: -# if options.proxy is None: -# self.server = xmlrpclib.Server(self.rhnUrl) -# else: -# proxy = ProxiedTransport() - proxy = AuthProxyTransport() - proxy.set_proxy(options.proxy); - self.server = xmlrpclib.Server(self.rhnUrl, transport=proxy) - else: - self.server = xmlrpclib.Server(self.rhnUrl) + self.proxy_enable = proxy_enable + if self.proxy_enable: +# if options.proxy is None: +# self.server = xmlrpclib.Server(self.rhnUrl) +# else: +# proxy = ProxiedTransport() + proxy = AuthProxyTransport() + proxy.set_proxy(options.proxy); + self.server = xmlrpclib.Server(self.rhnUrl, transport=proxy) + else: + self.server = xmlrpclib.Server(self.rhnUrl) self.rhnSession = self.rhnLogin(self.login,self.password,0)
- def rhnLogin(self, login, password, retry): + def rhnLogin(self, login, password, retry): try: rhnSession=self.server.auth.login(login,password) except xmlrpclib.Fault, f: - if options.verbose: - print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) + if options.verbose: + print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(login,password,retry) else: print "Failed to login",f raise - except xmlrpclib.ProtocolError, err: - if options.verbose: + except xmlrpclib.ProtocolError, err: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) - if retry > 3: - raise - else: - return self.rhnLogin(login,password, (retry + 1)) + if retry > 3: + raise + else: + return self.rhnLogin(login,password, (retry + 1)) return rhnSession
def getErrataChannels(self,advisory,retry): - channels = [] - try: - details = self.server.errata.applicableToChannels(self.rhnSession,advisory) - except xmlrpclib.Fault, f: - if options.verbose: + channels = [] + try: + details = self.server.errata.applicableToChannels(self.rhnSession,advisory) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(self.login,self.password,0) return self.server.errata.applicableToChannels(self.rhnSession,advisory) - elif f.faultCode == -208: - if options.verbose: + elif f.faultCode == -208: + if options.verbose: print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName) return [] - else: + else: raise except xmlrpclib.ProtocolError, err: if options.verbose: @@ -217,57 +217,57 @@ class RHNServer: raise else: return self.getErrataChannels(advisory, (retry + 1)) - return channels + return channels
def getErrataDetails(self,advisory,retry): - details = [] - try: - details = self.server.errata.getDetails(self.rhnSession,advisory) - except xmlrpclib.Fault, f: - if options.verbose: + details = [] + try: + details = self.server.errata.getDetails(self.rhnSession,advisory) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) - if f.faultCode == -20 or f.faultCode == -1: - self.rhnLogin(self.login,self.password,0) - return self.server.errata.getDetails(self.rhnSession,advisory) - elif f.faultCode == -208: - if options.verbose: + if f.faultCode == -20 or f.faultCode == -1: + self.rhnLogin(self.login,self.password,0) + return self.server.errata.getDetails(self.rhnSession,advisory) + elif f.faultCode == -208: + if options.verbose: print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName) - return [] - else: - raise + return [] + else: + raise except xmlrpclib.ProtocolError, err: - if options.verbose: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.getErrataDetails(advisory, (retry + 1)) - return details + return details
def getErrataKeywords(self,advisory,retry): - keywords = [] - try: - keywords = self.server.errata.listKeywords(self.rhnSession,advisory) - except xmlrpclib.Fault, f: - if options.verbose: + keywords = [] + try: + keywords = self.server.errata.listKeywords(self.rhnSession,advisory) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) - if f.faultCode == -20 or f.faultCode == -1: - self.rhnLogin(self.login,self.password,0) - return self.server.errata.listKeywords(self.rhnSession,advisory) + if f.faultCode == -20 or f.faultCode == -1: + self.rhnLogin(self.login,self.password,0) + return self.server.errata.listKeywords(self.rhnSession,advisory) elif f.faultCode == -208: - if options.verbose: + if options.verbose: print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName) return [] - else: - print "Error Getting Keywords : "+advisory + else: + print "Error Getting Keywords : "+advisory except xmlrpclib.ProtocolError, err: - if options.verbose: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.getErrataKeywords(advisory, (retry + 1)) - return keywords + return keywords
def getErrataCVEs(self,advisory,retry): keywords = [] @@ -295,100 +295,100 @@ class RHNServer: return keywords
def getErrataBugs(self,advisory,retry): - bugs = [] - try: - bugs = self.server.errata.bugzillaFixes(self.rhnSession,advisory) - except xmlrpclib.Fault, f: - if options.verbose: + bugs = [] + try: + bugs = self.server.errata.bugzillaFixes(self.rhnSession,advisory) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) - if f.faultCode == -20 or f.faultCode == -1: - self.rhnLogin(self.login,self.password,0) - return self.server.errata.bugzillaFixes(self.rhnSession,advisory) + if f.faultCode == -20 or f.faultCode == -1: + self.rhnLogin(self.login,self.password,0) + return self.server.errata.bugzillaFixes(self.rhnSession,advisory) elif f.faultCode == -208: - if options.verbose: + if options.verbose: print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName) return [] - else: - print "Error Getting Bugs : "+advisory + else: + print "Error Getting Bugs : "+advisory except xmlrpclib.ProtocolError, err: - if options.verbose: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.getErrataBugs(advisory, (retry + 1)) - return bugs + return bugs
def getErrataCVEs(self,advisory,retry): - cves=[] - try: - cves = self.server.errata.listCves(self.rhnSession,advisory) - except xmlrpclib.Fault, f: - if options.verbose: + cves=[] + try: + cves = self.server.errata.listCves(self.rhnSession,advisory) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(self.login,self.password,0) return self.server.errata.listCves(self.rhnSession,advisory) elif f.faultCode == -208: - if options.verbose: + if options.verbose: print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName) return [] else: print "Error Getting CVEs : %s" % advisory except xmlrpclib.ProtocolError, err: - if options.verbose: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.getErrataCVEs(advisory, (retry + 1)) return cves
def getErrataPackages(self,advisory,retry): - packages=[] - try: - packages = self.server.errata.listPackages(self.rhnSession,advisory) - except xmlrpclib.Fault, f: - if options.verbose: + packages=[] + try: + packages = self.server.errata.listPackages(self.rhnSession,advisory) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(self.login,self.password,0) - return self.server.errata.listPackages(self.rhnSession,advisory) + return self.server.errata.listPackages(self.rhnSession,advisory) elif f.faultCode == -208: - if options.verbose: + if options.verbose: print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName) return [] - else: - print "Error Getting Packages : %s" % advisory - except xmlrpclib.ProtocolError, err: - if options.verbose: + else: + print "Error Getting Packages : %s" % advisory + except xmlrpclib.ProtocolError, err: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.getErrataPackages(advisory, (retry + 1)) - return packages + return packages
def listChannelErrata(self,dest_chan,dateStart,dateEnd,retry): - out = [] - try: - out = self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd) - except xmlrpclib.Fault, f: - if options.verbose: + out = [] + try: + out = self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) - if f.faultCode == -20 or f.faultCode == -1: - self.rhnLogin(self.login,self.password,0) - return self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd) - else: - raise + if f.faultCode == -20 or f.faultCode == -1: + self.rhnLogin(self.login,self.password,0) + return self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd) + else: + raise except xmlrpclib.ProtocolError, err: - if options.verbose: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1)) - return out + return out
def findPackageChannels(self,pkgid,retry): channels=[] @@ -427,30 +427,30 @@ class RHNServer: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.cloneErrata(dest_chan,errata, (retry + 1)) return out
class SPWServer(RHNServer):
def searchNVREA(self,name,version,release,epoch,archlabel,retry): - package=[] - try: - package = self.server.packages.findByNvrea(self.rhnSession,name,version,release,epoch,archlabel) - except xmlrpclib.Fault, f: - if options.verbose: + package=[] + try: + package = self.server.packages.findByNvrea(self.rhnSession,name,version,release,epoch,archlabel) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(self.login,self.password,0) - return self.server.packages.findByNvrea(self.rhnSession,name,version,release,archlabel) - else: - print "Error Finding Package via NVREA : %s" % name - except xmlrpclib.ProtocolError, err: - if options.verbose: + return self.server.packages.findByNvrea(self.rhnSession,name,version,release,archlabel) + else: + print "Error Finding Package via NVREA : %s" % name + except xmlrpclib.ProtocolError, err: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1)) return package
@@ -476,16 +476,16 @@ class SPWServer(RHNServer): return out
def errataPublish(self,name,channels,retry): - errata=[] - try: - errata = self.server.errata.publish(self.rhnSession,name,channels) - except xmlrpclib.Fault, f: + errata=[] + try: + errata = self.server.errata.publish(self.rhnSession,name,channels) + except xmlrpclib.Fault, f: if options.verbose: print "Fault Code: %d - %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(self.login,self.password,0) return self.server.errata.publish(self.rhnSession,name,channels) - elif f.faultCode == 2601: + elif f.faultCode == 2601: print "Errata Already Exists..." return [] else: @@ -498,30 +498,30 @@ class SPWServer(RHNServer): raise else: return self.errataPublish(name,channels, (retry + 1)) - return errata + return errata
def errataCreate(self,info,bugs,keywords,packages,publish,channels,retry): - new_errata=[] - try: - new_errata = self.server.errata.create(self.rhnSession,info,bugs,keywords,packages,publish,channels) - except xmlrpclib.Fault, f: - if options.verbose: + new_errata=[] + try: + new_errata = self.server.errata.create(self.rhnSession,info,bugs,keywords,packages,publish,channels) + except xmlrpclib.Fault, f: + if options.verbose: print "Fault Code: %d - %s" % (f.faultCode,f.faultString) if f.faultCode == -20 or f.faultCode == -1: self.rhnLogin(self.login,self.password,0) return self.server.errata.create(self.rhnSession,info,bugs,keywords,packages,publish,channels) - elif f.faultCode == 2601: - print "Errata Already Exists..." - return [] - else: + elif f.faultCode == 2601: + print "Errata Already Exists..." + return [] + else: print "Error Creating Errata!" - raise - except xmlrpclib.ProtocolError, err: - if options.verbose: + raise + except xmlrpclib.ProtocolError, err: + if options.verbose: print "ProtocolError: %d - %s" % (err.errcode,err.errmsg) if retry > 3: raise - else: + else: return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1)) return new_errata
@@ -550,44 +550,44 @@ class SPWServer(RHNServer): def parse_args(): parser = OptionParser() parser.add_option("-s", "--spw-server", type="string", dest="spw_server", - help="Spacewalk Server (spacewalk.mydomain.org)") + help="Spacewalk Server (spacewalk.mydomain.org)") parser.add_option("-S", "--rhn-server", type="string", dest="rhn_server", - help="RHN Server (rhn.redhat.com)") + help="RHN Server (rhn.redhat.com)") parser.add_option("-u", "--spw-user", type="string", dest="spw_user", help="Spacewalk User") parser.add_option("-p", "--spw-pass", type="string", dest="spw_pass", help="Spacewalk Password") parser.add_option("-U", "--rhn-user", type="string", dest="rhn_user", - help="RHN User") + help="RHN User") parser.add_option("-P", "--rhn-pass", type="string", dest="rhn_pass", - help="RHN Password") + help="RHN Password") parser.add_option("-f", "--config-file", type="string", dest="cfg_file", - help="Config file for servers, users and passwords.") + help="Config file for servers, users and passwords.") parser.add_option("-c", "--src-channel", type="string", dest="src_channel", - help="Source Channel Label: ie."rhel-x86_64-server-5"") + help="Source Channel Label: ie."rhel-x86_64-server-5"") parser.add_option("-b", "--begin-date", type="string", dest="bdate", - help="Beginning Date: ie. "19000101" (defaults to "19000101")") + help="Beginning Date: ie. "19000101" (defaults to "19000101")") parser.add_option("-e", "--end-date", type="string", dest="edate", - help="Ending Date: ie. "19001231" (defaults to TODAY)") + help="Ending Date: ie. "19001231" (defaults to TODAY)") parser.add_option("-i", "--publish", action="store_true", dest="publish", default=False, - help="Publish Errata (into destination channels)") + help="Publish Errata (into destination channels)") parser.add_option("-I", "--ignore-missing-packages", action="store_true", dest="ignoremissing", default=False, - help="Ignore Missing Packages") + help="Ignore Missing Packages") parser.add_option("-x", "--proxy", type="string", dest="proxy", - help="Proxy server and port to use (e.g. proxy.company.com:3128)") + help="Proxy server and port to use (e.g. proxy.company.com:3128)") parser.add_option("--no-spw-proxy", action="store_true", dest="nospwproxy", default=False, - help="Don't proxy the Spacewalk server connection. (Proxy by default, if proxy is set)") + help="Don't proxy the Spacewalk server connection. (Proxy by default, if proxy is set)") parser.add_option("--no-rhn-proxy", action="store_true", dest="norhnproxy", default=False, - help="Don't proxy the RHN server connection. (Proxy by default, if proxy is set)") + help="Don't proxy the RHN server connection. (Proxy by default, if proxy is set)") parser.add_option("-F", "--format-header", action="store_true", dest="format", default=False, - help="Format header for logfiles") + help="Format header for logfiles") parser.add_option("-A", "--sync-all-channels", action="store_true", dest="fullsync", default=False, - help="Synchronize erratas of all channels listed in the provided configuration file") + help="Synchronize erratas of all channels listed in the provided configuration file") parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False) parser.add_option("-q", "--quiet", action="store_true", dest="quiet", default=False)
(options,args) = parser.parse_args() - return options + return options
def main(): global chanMap @@ -605,63 +605,63 @@ def main(): # option=value
if (options.cfg_file): - config = ConfigParser.ConfigParser() - config.read (options.cfg_file) - - if options.spw_server is None: - options.spw_server = config.get ('Spacewalk', 'spw_server') - if options.spw_user is None: - options.spw_user = config.get ('Spacewalk', 'spw_user') - if options.spw_pass is None: - options.spw_pass = config.get ('Spacewalk', 'spw_pass') - if options.rhn_server is None: - options.rhn_server = config.get ('RHN', 'rhn_server') - if options.rhn_user is None: - options.rhn_user = config.get ('RHN', 'rhn_user') - if options.rhn_pass is None: - options.rhn_pass = config.get ('RHN', 'rhn_pass') - -# Here we setup our mappings from RHN to Spacewalk software channels. -# These are read from the config file in this format: -# -# [ChanMap] -# RHNChannel = SPWChannel -# -# Example: -# rhn-tools-rhel-x86_64-server-5 = rhel-x86_64-server-rhntools-5 - - chanMap = {} - - if options.fullsync: - for chan in config.options('ChanMap'): - chanMap[chan] = config.get('ChanMap', chan) - else: - if options.src_channel is None: - print "Source channel not given, aborting" - sys.exit(2) - chanMap[options.src_channel] = config.get('ChanMap', options.src_channel) - -# Here we also setup mappings from RHN channels to errata suffixes. -# Since we can't easily publish automagically, while ensuring that -# the right packages go into the right channels, we're going to -# split multi-channel affecting errata into individual errata -# that are suffixed with something meaningful that identifies -# each sub-errata per channel... blah blah... Of course, modify this -# as you will. I'm not sure if this will be required in the future. -# -# [ChanSuffixMap] -# RHNChannel = ErrataSuffix -# -# Example: -# rhn-tools-rhel-x86_64-server-5 = R5-64-T - - chanSuffixMap = {} - - for chan in config.options('ChanSuffixMap'): - chanSuffixMap[chan] = config.get('ChanSuffixMap', chan) + config = ConfigParser.ConfigParser() + config.read (options.cfg_file) + + if options.spw_server is None: + options.spw_server = config.get ('Spacewalk', 'spw_server') + if options.spw_user is None: + options.spw_user = config.get ('Spacewalk', 'spw_user') + if options.spw_pass is None: + options.spw_pass = config.get ('Spacewalk', 'spw_pass') + if options.rhn_server is None: + options.rhn_server = config.get ('RHN', 'rhn_server') + if options.rhn_user is None: + options.rhn_user = config.get ('RHN', 'rhn_user') + if options.rhn_pass is None: + options.rhn_pass = config.get ('RHN', 'rhn_pass') + +# Here we setup our mappings from RHN to Spacewalk software channels. +# These are read from the config file in this format: +# +# [ChanMap] +# RHNChannel = SPWChannel +# +# Example: +# rhn-tools-rhel-x86_64-server-5 = rhel-x86_64-server-rhntools-5 + + chanMap = {} + + if options.fullsync: + for chan in config.options('ChanMap'): + chanMap[chan] = config.get('ChanMap', chan) + else: + if options.src_channel is None: + print "Source channel not given, aborting" + sys.exit(2) + chanMap[options.src_channel] = config.get('ChanMap', options.src_channel) + +# Here we also setup mappings from RHN channels to errata suffixes. +# Since we can't easily publish automagically, while ensuring that +# the right packages go into the right channels, we're going to +# split multi-channel affecting errata into individual errata +# that are suffixed with something meaningful that identifies +# each sub-errata per channel... blah blah... Of course, modify this +# as you will. I'm not sure if this will be required in the future. +# +# [ChanSuffixMap] +# RHNChannel = ErrataSuffix +# +# Example: +# rhn-tools-rhel-x86_64-server-5 = R5-64-T + + chanSuffixMap = {} + + for chan in config.options('ChanSuffixMap'): + chanSuffixMap[chan] = config.get('ChanSuffixMap', chan)
if (options.spw_server and options.spw_user and options.spw_pass and - options.rhn_server and options.rhn_user and options.rhn_pass) is None: + options.rhn_server and options.rhn_user and options.rhn_pass) is None: print "try: "+sys.argv[0]+" --help" sys.exit(2)
@@ -669,10 +669,10 @@ def main(): spwProxy = 0
if options.proxy is not None: - if not options.norhnproxy: - rhnProxy = 1 + if not options.norhnproxy: + rhnProxy = 1 if not options.nospwproxy: - spwProxy = 1 + spwProxy = 1
myRHN = RHNServer(options.rhn_server, options.rhn_user, options.rhn_pass, rhnProxy) mySPW = SPWServer(options.spw_server, options.spw_user, options.spw_pass, spwProxy) @@ -687,59 +687,59 @@ def main(): sys.exit(2)
if options.format: - print >>sys.stdout, "%s:CLONE:%s" % (dateToday, chan) - print >>sys.stderr, "%s:CLONE:%s" % (dateToday, chan) + print >>sys.stdout, "%s:CLONE:%s" % (dateToday, chan) + print >>sys.stderr, "%s:CLONE:%s" % (dateToday, chan)
for rhnErrata in myRHN.listChannelErrata(chan,dateStart,dateEnd,0): - if not options.quiet and not options.format: + if not options.quiet and not options.format: print rhnErrata['errata_advisory']
-# Now, let's check if we already have this errata locally... - spwErrataName = rhnErrata['errata_advisory']+':'+chanSuffixMap[chan] - spwErrCheck = mySPW.getErrataDetails (spwErrataName,0) +# Now, let's check if we already have this errata locally... + spwErrataName = rhnErrata['errata_advisory']+':'+chanSuffixMap[chan] + spwErrCheck = mySPW.getErrataDetails (spwErrataName,0)
- if not spwErrCheck: + if not spwErrCheck: # Ok, so the errata doesn't already exists... let's get busy creating it. - spwErrSolution = "Before applying this update, make sure that all "+\ - "previously-released errata relevant to your system have been applied." - - spwErrPackages = [] - - missingcheck = 0 - - for pkg in myRHN.getErrataPackages(rhnErrata['errata_advisory'],0): - pkgFind = mySPW.searchNVREA(pkg['package_name'],\ - pkg['package_version'],\ - pkg['package_release'],\ - '',\ - pkg['package_arch_label'],\ - 0) - - for pkgChan in pkg['providing_channels']: - if pkgChan != chan: - continue - else: - if not pkgFind: - missingcheck += 1 - - if options.format: - print >>sys.stderr, "%s:%s:Hmmm... "+\ - "Package Missing: %s" % (dateToday, rhnErrata['errata_advisory'], pkg['package_name']) - else: - print "Hmmm... Package Missing: %s" % pkg['package_name'] - - else: - spwErrPackages.append(pkgFind[0]['id']) - break - - if missingcheck: - if options.ignoremissing: + spwErrSolution = "Before applying this update, make sure that all "+\ + "previously-released errata relevant to your system have been applied." + + spwErrPackages = [] + + missingcheck = 0 + + for pkg in myRHN.getErrataPackages(rhnErrata['errata_advisory'],0): + pkgFind = mySPW.searchNVREA(pkg['package_name'],\ + pkg['package_version'],\ + pkg['package_release'],\ + '',\ + pkg['package_arch_label'],\ + 0) + + for pkgChan in pkg['providing_channels']: + if pkgChan != chan: + continue + else: + if not pkgFind: + missingcheck += 1 + + if options.format: + print >>sys.stderr, "%s:%s:Hmmm... "+\ + "Package Missing: %s" % (dateToday, rhnErrata['errata_advisory'], pkg['package_name']) + else: + print "Hmmm... Package Missing: %s" % pkg['package_name'] + + else: + spwErrPackages.append(pkgFind[0]['id']) + break + + if missingcheck: + if options.ignoremissing: skiptext = "Ignoring missing package(s) and continuing..."
- if options.format: - print >>sys.stderr, "%s" % skiptext - else: - print "%s" % skiptext + if options.format: + print >>sys.stderr, "%s" % skiptext + else: + print "%s" % skiptext else: skiptext = "Skipping errata due to missing package(s)..."
@@ -748,67 +748,67 @@ def main(): else: print "%s" % skiptext
- continue + continue
- spwErrDetails = myRHN.getErrataDetails(rhnErrata['errata_advisory'],0) + spwErrDetails = myRHN.getErrataDetails(rhnErrata['errata_advisory'],0) spwErrKeywords = myRHN.getErrataKeywords(rhnErrata['errata_advisory'],0) - spwErrCVEs = myRHN.getErrataCVEs(rhnErrata['errata_advisory'],0) + spwErrCVEs = myRHN.getErrataCVEs(rhnErrata['errata_advisory'],0)
- spwErrBugs = [] + spwErrBugs = [] tmpBugs = myRHN.getErrataBugs(rhnErrata['errata_advisory'],0)
for bug in tmpBugs: href = 'https://bugzilla.redhat.com/show_bug.cgi?id=%s' % bug spwErrBugs.append({'id': int(bug), 'summary': tmpBugs[bug], 'url' : href})
- if not options.quiet and not options.format: - print "\t%s - %s" % (spwErrDetails['errata_issue_date'],spwErrDetails['errata_synopsis']) - - spwErrObject = mySPW.errataCreate ({ 'synopsis': spwErrDetails['errata_synopsis'],\ - 'advisory_name': spwErrataName,\ - 'advisory_release': 1,\ - 'advisory_type': spwErrDetails['errata_type'],\ - 'product': 'RHEL',\ - 'topic': spwErrDetails['errata_topic'],\ - 'description': spwErrDetails['errata_description'],\ - 'references': spwErrDetails['errata_references'],\ - 'notes': spwErrDetails['errata_notes'],\ - 'solution': spwErrSolution },\ - spwErrBugs,\ - spwErrKeywords,\ - spwErrPackages,\ - 0,\ - [chanMap[chan]],\ - 0) - - if options.format: - print "%s#%s#Errata Created#" % (dateToday, spwErrataName), - else: - print "\tErrata Created: %d" % spwErrObject['id'] - - if options.publish: - spwPublish = mySPW.errataPublish (spwErrataName, [chanMap[chan]], 0) - if options.format: - print "Errata Published" - else: - print "\tErrata Published!" - - # we must add the CVEs after publishing because the foreign key - # constraint on 'rhnErrataCve' is for the 'rhnErrata' table, not - # the 'rhnErrataTmp' table - if len(spwErrCVEs): - mySPW.setDetails(spwErrataName, { 'cves' : spwErrCVEs }, 0) - else: - if options.format: - print "Errata Not Published" - else: - print "\tErrata Not Published!" - else: - if options.format: - print "%s#%s#Errata Already Exists" % (dateToday, spwErrataName) + if not options.quiet and not options.format: + print "\t%s - %s" % (spwErrDetails['errata_issue_date'],spwErrDetails['errata_synopsis']) + + spwErrObject = mySPW.errataCreate ({ 'synopsis': spwErrDetails['errata_synopsis'],\ + 'advisory_name': spwErrataName,\ + 'advisory_release': 1,\ + 'advisory_type': spwErrDetails['errata_type'],\ + 'product': 'RHEL',\ + 'topic': spwErrDetails['errata_topic'],\ + 'description': spwErrDetails['errata_description'],\ + 'references': spwErrDetails['errata_references'],\ + 'notes': spwErrDetails['errata_notes'],\ + 'solution': spwErrSolution },\ + spwErrBugs,\ + spwErrKeywords,\ + spwErrPackages,\ + 0,\ + [chanMap[chan]],\ + 0) + + if options.format: + print "%s#%s#Errata Created#" % (dateToday, spwErrataName), + else: + print "\tErrata Created: %d" % spwErrObject['id'] + + if options.publish: + spwPublish = mySPW.errataPublish (spwErrataName, [chanMap[chan]], 0) + if options.format: + print "Errata Published" + else: + print "\tErrata Published!" + + # we must add the CVEs after publishing because the foreign key + # constraint on 'rhnErrataCve' is for the 'rhnErrata' table, not + # the 'rhnErrataTmp' table + if len(spwErrCVEs): + mySPW.setDetails(spwErrataName, { 'cves' : spwErrCVEs }, 0) + else: + if options.format: + print "Errata Not Published" + else: + print "\tErrata Not Published!" + else: + if options.format: + print "%s#%s#Errata Already Exists" % (dateToday, spwErrataName) elif not options.quiet: print "\tErrata Already Exists. %s" % spwErrataName - continue + continue
if __name__ == "__main__": main()
commit cdb746282e644c74be89c2dcd5b71b67353dd4ab Author: Aron Parsons aronparsons@gmail.com Date: Tue Jan 31 19:20:56 2012 -0500
add CVEs to errata in rhn-clone-errata.py
diff --git a/scripts/clone-errata/rhn-clone-errata.py b/scripts/clone-errata/rhn-clone-errata.py index 7362cad..eb1499b 100755 --- a/scripts/clone-errata/rhn-clone-errata.py +++ b/scripts/clone-errata/rhn-clone-errata.py @@ -792,6 +792,12 @@ def main(): print "Errata Published" else: print "\tErrata Published!" + + # we must add the CVEs after publishing because the foreign key + # constraint on 'rhnErrataCve' is for the 'rhnErrata' table, not + # the 'rhnErrataTmp' table + if len(spwErrCVEs): + mySPW.setDetails(spwErrataName, { 'cves' : spwErrCVEs }, 0) else: if options.format: print "Errata Not Published"