backend/server
by Tomas Lestach
backend/server/rhnServer/server_token.py | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
New commits:
commit 46647b316f5c8d3b06cd35de0f442286899261be
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Thu Jan 21 10:12:01 2010 +0100
526696 - checking whether server already uses a token
if so, token doesn't consume extra usage slot
diff --git a/backend/server/rhnServer/server_token.py b/backend/server/rhnServer/server_token.py
index dcd691a..755e1c8 100644
--- a/backend/server/rhnServer/server_token.py
+++ b/backend/server/rhnServer/server_token.py
@@ -460,11 +460,19 @@ _query_server_token_used = rhnSQL.Statement("""
values (:server_id, :token_id)
""")
+_query_check_server_uses_token = rhnSQL.Statement("""
+ select 1 from rhnServerTokenRegs
+ where server_id = :server_id
+ and token_id = :token_id
+""")
+
def server_used_token(server_id, token_id):
- h = rhnSQL.prepare(_query_server_token_used)
+ h = rhnSQL.prepare(_query_check_server_uses_token)
h.execute(server_id=server_id, token_id=token_id)
-
-
+ ret = h.fetchone_dict()
+ if not ret:
+ h = rhnSQL.prepare(_query_server_token_used)
+ h.execute(server_id=server_id, token_id=token_id)
_query_check_token_limits = rhnSQL.Statement("""
select
14 years, 3 months
client/rhel
by Milan Zazrivec
client/rhel/rhn-client-tools/src/up2date_client/hardware.py | 6 ++++++
1 file changed, 6 insertions(+)
New commits:
commit 6391fe2b663ec7cbfdb2cedaf898483df170ee64
Author: Milan Zazrivec <mzazrivec(a)redhat.com>
Date: Thu Jan 21 10:03:11 2010 +0100
557370 - put dmidecode import warnings into log
diff --git a/client/rhel/rhn-client-tools/src/up2date_client/hardware.py b/client/rhel/rhn-client-tools/src/up2date_client/hardware.py
index 3d11bb3..f11b075 100644
--- a/client/rhel/rhn-client-tools/src/up2date_client/hardware.py
+++ b/client/rhel/rhn-client-tools/src/up2date_client/hardware.py
@@ -93,7 +93,13 @@ PCI_CLASS_SERIAL_USB = 3
PCI_CLASS_SERIAL_FIBER = 4
PCI_CLASS_SERIAL_SMBUS = 5
+dmi_warnings = None
+if hasattr(dmidecode, 'get_warnings'):
+ dmi_warnings = dmidecode.get_warnings()
+if dmi_warnings:
+ log = up2dateLog.initLog()
+ log.log_debug("Warnings collected during dmidecode import: %s" % dmi_warnings)
# Some systems don't have the _locale module installed
try:
14 years, 3 months
2 commits - java/code proxy/installer web/html
by Justin Sherrill
java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java | 40 +++++++---
java/code/src/com/redhat/rhn/manager/download/DownloadManager.java | 1
java/code/src/com/redhat/rhn/manager/kickstart/KickstartManager.java | 28 ++++++-
proxy/installer/configure-proxy.sh | 1
web/html/applications/rhn-proxy/5.3/httpd/cobbler-proxy.conf | 2
5 files changed, 58 insertions(+), 14 deletions(-)
New commits:
commit a11267710081ed3d70f41d67b631e8dc053ce625
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Wed Jan 20 17:42:24 2010 -0500
543879 - adding support to the proxy side to redirect to a url that will rewrite kickstarts with the proxy name for /cblr urls
diff --git a/proxy/installer/configure-proxy.sh b/proxy/installer/configure-proxy.sh
index c37a530..2418b33 100755
--- a/proxy/installer/configure-proxy.sh
+++ b/proxy/installer/configure-proxy.sh
@@ -381,6 +381,7 @@ if [ $USE_SSL -eq 1 ]; then
fi
echo "ProxyPass /cobbler_api $PROTO://$RHN_PARENT/cobbler_api" > $HTTPDCONFD_DIR/cobbler-proxy.conf
echo "ProxyPassReverse /cobbler_api $PROTO://$RHN_PARENT/cobbler_api" >> $HTTPDCONFD_DIR/cobbler-proxy.conf
+echo "RewriteRule ^/cblr/svc/op/ks/(.*)$ /download/$0 [P,L]" >> $HTTPDCONFD_DIR/cobbler-proxy.conf
echo "ProxyPass /cblr $PROTO://$RHN_PARENT/cblr" >> $HTTPDCONFD_DIR/cobbler-proxy.conf
echo "ProxyPassReverse /cblr $PROTO://$RHN_PARENT/cblr" >> $HTTPDCONFD_DIR/cobbler-proxy.conf
echo "ProxyPass /cobbler $PROTO://$RHN_PARENT/cobbler" >> $HTTPDCONFD_DIR/cobbler-proxy.conf
diff --git a/web/html/applications/rhn-proxy/5.3/httpd/cobbler-proxy.conf b/web/html/applications/rhn-proxy/5.3/httpd/cobbler-proxy.conf
index 79fb06d..2e16519 100644
--- a/web/html/applications/rhn-proxy/5.3/httpd/cobbler-proxy.conf
+++ b/web/html/applications/rhn-proxy/5.3/httpd/cobbler-proxy.conf
@@ -1,6 +1,8 @@
ProxyPass /cobbler_api https://${session.rhn_parent}/cobbler_api
ProxyPassReverse /cobbler_api https://${session.rhn_parent}/cobbler_api
+RewriteRule ^/cblr/svc/op/ks/(.*)$ /download/$0 [P,L]
+
ProxyPass /cblr https://${session.rhn_parent}/cblr
ProxyPassReverse /cblr https://${session.rhn_parent}/cblr
commit 4020f83a33f6a4ecb332b0af67f956810ba9fab3
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Wed Jan 20 17:22:05 2010 -0500
543879 - adding support for downloading kickstart profiles through the /cblr handler through a proxy
diff --git a/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java b/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
index f57ccc6..e31f447 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
@@ -35,10 +35,12 @@ import com.redhat.rhn.domain.rhnpackage.Patch;
import com.redhat.rhn.domain.rhnpackage.PatchSet;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.domain.user.UserFactory;
+import com.redhat.rhn.frontend.action.kickstart.KickstartHelper;
import com.redhat.rhn.frontend.struts.RhnHelper;
import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.download.DownloadManager;
import com.redhat.rhn.manager.download.UnknownDownloadTypeException;
+import com.redhat.rhn.manager.kickstart.KickstartManager;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
@@ -86,6 +88,7 @@ public class DownloadFile extends DownloadAction {
private static final String TREE = "tree";
private static final String PATH = "path";
private static final String SESSION = "session";
+ private static final String URL = "url";
/** {@inheritDoc} */
public ActionForward execute(ActionMapping mapping,
@@ -98,21 +101,22 @@ public class DownloadFile extends DownloadAction {
log.debug("url : [" + url + "]");
}
if (url.startsWith("/ks/dist")) {
- if (log.isDebugEnabled()) {
- log.debug("URL is ks dist..");
- }
+ log.debug("URL is ks dist..");
ActionForward error = handleKickstartDownload(request, response,
url, mapping);
- if (log.isDebugEnabled()) {
- log.debug("Done handling ks download");
- }
+ log.debug("Done handling ks download");
if (error != null) {
- if (log.isDebugEnabled()) {
- log.debug("returning null");
- }
+ log.debug("returning null");
return null;
}
}
+ else if (url.startsWith("/cblr/svc/op/ks/")) {
+ Map params = new HashMap();
+ params.put(TYPE, DownloadManager.DOWNLOAD_TYPE_COBBLER);
+ params.put(URL, url);
+ request.setAttribute(PARAMS, params);
+ return super.execute(mapping, formIn, request, response);
+ }
else {
ActionForward error = handleUserDownload(request, url, mapping);
if (error != null) {
@@ -120,9 +124,7 @@ public class DownloadFile extends DownloadAction {
}
}
try {
- if (log.isDebugEnabled()) {
- log.debug("Calling super.execute");
- }
+ log.debug("Calling super.execute");
super.execute(mapping, formIn, request, response);
}
catch (Exception e) {
@@ -317,6 +319,20 @@ public class DownloadFile extends DownloadAction {
if (type.equals(DownloadManager.DOWNLOAD_TYPE_KICKSTART)) {
return getStreamInfoKickstart(mapping, form, request, response, path);
}
+ else if (type.equals(DownloadManager.DOWNLOAD_TYPE_COBBLER)) {
+ String url = ConfigDefaults.get().getCobblerServerUrl() +
+ (String) params.get(URL);
+ KickstartHelper helper = new KickstartHelper(request);
+ String data = "";
+ if (helper.isProxyRequest()) {
+ data = KickstartManager.getInstance().renderKickstart(
+ helper.getKickstartHost(), url);
+ }
+ else {
+ data = KickstartManager.getInstance().renderKickstart(url);
+ }
+ return getStreamForText(data.getBytes());
+ }
else {
Long fileId = (Long) params.get(FILEID);
Long userid = (Long) params.get(USERID);
diff --git a/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java b/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
index 12e469d..372effb 100644
--- a/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
+++ b/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
@@ -39,6 +39,7 @@ import java.util.List;
public class DownloadManager extends BaseManager {
public static final String DOWNLOAD_TYPE_KICKSTART = "kickstart";
+ public static final String DOWNLOAD_TYPE_COBBLER = "cobbler";
public static final String DOWNLOAD_TYPE_PACKAGE = "package";
public static final String DOWNLOAD_TYPE_SOURCE = "srpm";
public static final String DOWNLOAD_TYPE_ISO = "iso";
diff --git a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartManager.java b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartManager.java
index e78edba..31657cb 100644
--- a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartManager.java
+++ b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartManager.java
@@ -66,7 +66,20 @@ public class KickstartManager extends BaseManager {
* @return the rendered kickstart contents
*/
public String renderKickstart(String host, KickstartData data) {
- String retval = renderKickstart(data);
+ return renderKickstart(host, KickstartUrlHelper.getCobblerProfileUrl(data));
+ }
+
+ /**
+ * Render the kickstart using cobbler and return the contents with the Cobbler host
+ * search/replaced.
+ *
+ * @param host the host to force into the ks file. searches and replaces all
+ * instances of the Cobbler Host with whatever you pass in. Use with Proxies.
+ * @param url The url to fetch
+ * @return the rendered kickstart contents
+ */
+ public String renderKickstart(String host, String url) {
+ String retval = renderKickstart(url);
// Search/replacing all instances of cobbler host with host
// we pass in, for use with rhn proxy.
retval = retval.replaceAll(ConfigDefaults.get().getCobblerHost(), host);
@@ -79,8 +92,19 @@ public class KickstartManager extends BaseManager {
* @return the rendered kickstart contents
*/
public String renderKickstart(KickstartData data) {
- return DownloadUtils.downloadUrl(KickstartUrlHelper.getCobblerProfileUrl(data));
+ return renderKickstart(KickstartUrlHelper.getCobblerProfileUrl(data));
}
+
+
+ /**
+ * Render the kickstart using cobbler and return the contents
+ * @param url the url to fetch
+ * @return the rendered kickstart contents
+ */
+ public String renderKickstart(String url) {
+ return DownloadUtils.downloadUrl(url);
+ }
+
/**
* Simple method to validate a generated kickstart
14 years, 3 months
scripts/clone-errata
by Justin Sherrill
scripts/clone-errata/rhn-clone-errata.py | 1174 +++++++++++++++----------------
scripts/clone-errata/spw-clone-errata.py | 1164 +++++++++++++++---------------
2 files changed, 1169 insertions(+), 1169 deletions(-)
New commits:
commit 7983fc6acec2695ca8a9ef6490ef3fc8e8a6b2c6
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Wed Jan 20 16:35:50 2010 -0500
fixing newlines on scripts
diff --git a/scripts/clone-errata/rhn-clone-errata.py b/scripts/clone-errata/rhn-clone-errata.py
index 1458d6e..d1b66f3 100644
--- a/scripts/clone-errata/rhn-clone-errata.py
+++ b/scripts/clone-errata/rhn-clone-errata.py
@@ -1,587 +1,587 @@
-#!/bin/env python
-# Script that uses RHN API to clone RHN Errata to Satellite
-# or Spacewalk server.
-# Copyright (C) 2008 Red Hat
-#
-# Author: Andy Speagle (andy.speagle(a)wichita.edu)
-#
-# This script was written based on the "rhn-clone-errata.py"
-# script written by: Lars Jonsson (ljonsson(a)redhat.com)
-#
-# (THANKS!)
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Version Information:
-#
-# 0.1 - 2009-09-01 - Andy Speagle
-#
-# 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.
-#
-# 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.
-#
-# 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.
-
-import xmlrpclib
-from optparse import OptionParser
-from time import time, localtime, strftime
-from datetime import datetime, timedelta
-import sys
-import os
-import re
-
-class RHNServer:
- def __init__(self,servername,user,passwd):
- self.rhnServerName = servername
- self.login = user
- self.password = passwd
- self.rhnUrl = 'https://'+self.rhnServerName+'/rpc/api'
- self.server = xmlrpclib.Server(self.rhnUrl)
- self.rhnSession = self.rhnLogin(self.login,self.password,0)
-
- 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 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:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- 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:
- 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:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataChannels(advisory, (retry + 1))
- return channels
-
- def getErrataDetails(self,advisory,retry):
- 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:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataDetails(advisory, (retry + 1))
- return details
-
- def getErrataKeywords(self,advisory,retry):
- 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)
- elif f.faultCode == -208:
- if options.verbose:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- print "Error Getting Keywords : "+advisory
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataKeywords(advisory, (retry + 1))
- return keywords
-
- def getErrataBugs(self,advisory,retry):
- 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)
- elif f.faultCode == -208:
- if options.verbose:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- print "Error Getting Bugs : "+advisory
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataBugs(advisory, (retry + 1))
- return bugs
-
- def getErrataCVEs(self,advisory,retry):
- 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:
- 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:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- 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:
- 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)
- elif f.faultCode == -208:
- 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:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataPackages(advisory, (retry + 1))
- 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:
- 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
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1))
- return out
-
- def findPackageChannels(self,pkgid,retry):
- channels=[]
- try:
- channels = self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
- 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.listProvidingChannels(self.rhnSession,pkgid)
- else:
- print "Error Finding Channels for Package : %s" % pkgid
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.server.packages.findPackageChannels(pkgid, (retrun + 1))
- return channels
-
- def cloneErrata(self,dest_chan,errata,retry):
- out=[]
- try:
- print "Clone errata in progress, please be patient.."
- out = self.server.errata.clone(self.rhnSession,dest_chan,errata)
- except xmlrpclib.Fault, f:
- 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.self.server.errata.clone(self.rhnSession,dest_chan,errata)
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- 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:
- 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:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1))
- return package
-
- def listChannelErrata(self,dest_chan,retry):
- out = []
- try:
- out = self.server.channel.software.listErrata(self.rhnSession,dest_chan)
- 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)
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.listChannelErrata(dest_chan,(retry + 1))
- return out
-
- def errataPublish(self,name,channels,retry):
- 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:
- print "Errata Already Exists..."
- return []
- else:
- print "Error Creating Errata!"
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.errataPublish(name,channels, (retry + 1))
- 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:
- 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:
- print "Error Creating Errata!"
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1))
- return new_errata
-
-def parse_args():
- parser = OptionParser()
- parser.add_option("-s", "--spw-server", type="string", dest="src_server",
- help="Spacewalk Server (spacewalk.mydomain.org)")
- parser.add_option("-l", "--login", type="string", dest="login",
- help="RHN Login")
- parser.add_option("-p", "--password", type="string", dest="passwd",
- help="RHN password")
- parser.add_option("-c", "--src-channel", type="string", dest="src_channel",
- 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\")")
- parser.add_option("-e", "--end-date", type="string", dest="edate",
- help="Ending Date: ie. \"19001231\" (defaults to TODAY)")
- parser.add_option("-u", "--publish", action="store_true", dest="publish", default=False,
- help="Publish Errata (into destination channels)")
- parser.add_option("-f", "--format-header", action="store_true", dest="format", default=False,
- help="Format header for logfiles")
- 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
-
-def main():
- global chanMap
- global chanSuffixMap
- global RHNServer
- global RHNUser
- global RHNPass
- global options
-
- options = parse_args()
-
- if (options.src_server and options.login and options.passwd) is None:
- print "try: "+sys.argv[0]+" --help"
- sys.exit(2)
-
- if options.format:
- strYest = datetime.today() - timedelta(1)
- print >>sys.stdout, "CLONE:%s:%s" % (options.src_channel, strYest.strftime("%Y%m%d"))
- print >>sys.stderr, "CLONE:%s:%s" % (options.src_channel, strYest.strftime("%Y%m%d"))
-
-# I don't reckon this should change anytime soon...
-#
- svrRHN = 'rhn.redhat.com'
-
-# Ok, configure your RHN credentials here...
-#
- userRHN = 'wsuadmin'
- passRHN = 'W$youAdm'
-
-# Here we setup our mappings from RHN to Local software channels.
-# Set these to what you have created for your SPW.
-# They are paired as:
-#
-# RHNChannel: SPWChannel
-#
- chanMap = {
- 'rhel-x86_64-server-5': 'rhel-x86_64-server-5',
- 'rhn-tools-rhel-x86_64-server-5': 'rhel-x86_64-server-rhntools-5',
- 'rhel-x86_64-server-productivity-5': 'rhel-x86_64-server-productivity-5',
- 'rhel-x86_64-server-supplementary-5': 'rhel-x86_64-server-supplementary-5',
- 'rhel-x86_64-server-vt-5': 'rhel-x86_64-server-vt-5',
- 'rhel-i386-server-5': 'rhel-i386-server-5',
- 'rhn-tools-rhel-i386-server-5': 'rhel-i386-server-rhntools-5',
- 'rhel-i386-server-productivity-5': 'rhel-i386-server-productivity-5',
- 'rhel-i386-server-supplementary-5': 'rhel-i386-server-supplementary-5',
- 'rhel-i386-server-vt-5': 'rhel-i386-server-vt-5',
- 'rhel-x86_64-as-4': 'rhel-x86_64-server-4',
- 'rhel-x86_64-as-4-extras': 'rhel-x86_64-server-extras-4',
- 'rhn-tools-rhel-4-as-x86_64': 'rhel-x86_64-server-rhntools-4',
- 'rhel-i386-as-4': 'rhel-i386-server-4',
- 'rhel-i386-as-4-extras': 'rhel-i386-server-extras-4',
- 'rhn-tools-rhel-4-as-i386': 'rhel-i386-server-rhntools-4'
- };
-
-# 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.
-#
-# RHNChannel: ErrataSuffix
-#
- chanSuffixMap = {
- 'rhel-x86_64-server-5': 'R5-64',
- 'rhn-tools-rhel-x86_64-server-5': 'R5-64-T',
- 'rhel-x86_64-server-productivity-5': 'R5-64-P',
- 'rhel-x86_64-server-supplementary-5': 'R5-64-S',
- 'rhel-x86_64-server-vt-5': 'R5-64-V',
- 'rhel-i386-server-5': 'R5-32',
- 'rhn-tools-rhel-i386-server-5': 'R5-32-T',
- 'rhel-i386-server-productivity-5': 'R5-32-P',
- 'rhel-i386-server-supplementary-5': 'R5-32-S',
- 'rhel-i386-server-vt-5': 'R5-32-V',
- 'rhel-x86_64-as-4': 'R4-64',
- 'rhel-x86_64-as-4-extras': 'R4-64-E',
- 'rhn-tools-rhel-4-as-x86_64': 'R4-64-T',
- 'rhel-i386-as-4': 'R4-32',
- 'rhel-i386-as-4-extras': 'R4-32-E',
- 'rhn-tools-rhel-4-as-i386': 'R4-32-T'
- };
-
- if chanMap[options.src_channel] is None:
- print "Invalid Channel!"
- sys.exit(2)
-
- myRHN = RHNServer(svrRHN,userRHN,passRHN)
- mySPW = SPWServer(options.src_server,options.login,options.passwd)
-
- dateStart = options.bdate or '19000101'
- dateEnd = options.edate or strftime("%Y%m%d", localtime())
-
- for rhnErrata in myRHN.listChannelErrata(options.src_channel,dateStart,dateEnd,0):
- if not options.quiet:
- print rhnErrata['errata_advisory']
-
-# Now, let's check if we already have this errata locally...
- spwErrataName = rhnErrata['errata_advisory']+':'+chanSuffixMap[options.src_channel]
- spwErrCheck = mySPW.getErrataDetails (spwErrataName,0)
-
- 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 = []
- 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 != options.src_channel:
- continue
- else:
- if not pkgFind:
- print "Hmmm... Package Missing: %s" % pkg['package_name']
- else:
- spwErrPackages.append(pkgFind[0]['id'])
- break
-
- spwErrDetails = myRHN.getErrataDetails(rhnErrata['errata_advisory'],0)
- spwErrKeywords = myRHN.getErrataKeywords(rhnErrata['errata_advisory'],0)
-
- spwErrBugs = []
- tmpBugs = myRHN.getErrataBugs(rhnErrata['errata_advisory'],0)
-
- for bug in tmpBugs:
- spwErrBugs.append({'id': int(bug), 'summary': tmpBugs[bug]})
-
- if not options.quiet:
- 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[options.src_channel]],\
- 0)
-
- print "\tErrata Created: %d" % spwErrObject['id']
-
- if options.publish:
- spwPublish = mySPW.errataPublish (spwErrataName, [chanMap[options.src_channel]], 0)
- print "\tErrata Published!"
- else:
- print "\t Errata Not Published!"
- else:
- if not options.quiet:
- print "\tErrata already exists. %s" % spwErrataName
- continue
-
-if __name__ == "__main__":
- main()
+#!/bin/env python
+# Script that uses RHN API to clone RHN Errata to Satellite
+# or Spacewalk server.
+# Copyright (C) 2008 Red Hat
+#
+# Author: Andy Speagle (andy.speagle(a)wichita.edu)
+#
+# This script was written based on the "rhn-clone-errata.py"
+# script written by: Lars Jonsson (ljonsson(a)redhat.com)
+#
+# (THANKS!)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Version Information:
+#
+# 0.1 - 2009-09-01 - Andy Speagle
+#
+# 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.
+#
+# 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.
+#
+# 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.
+
+import xmlrpclib
+from optparse import OptionParser
+from time import time, localtime, strftime
+from datetime import datetime, timedelta
+import sys
+import os
+import re
+
+class RHNServer:
+ def __init__(self,servername,user,passwd):
+ self.rhnServerName = servername
+ self.login = user
+ self.password = passwd
+ self.rhnUrl = 'https://'+self.rhnServerName+'/rpc/api'
+ self.server = xmlrpclib.Server(self.rhnUrl)
+ self.rhnSession = self.rhnLogin(self.login,self.password,0)
+
+ 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 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ 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:
+ 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:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataChannels(advisory, (retry + 1))
+ return channels
+
+ def getErrataDetails(self,advisory,retry):
+ 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:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataDetails(advisory, (retry + 1))
+ return details
+
+ def getErrataKeywords(self,advisory,retry):
+ 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)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Keywords : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataKeywords(advisory, (retry + 1))
+ return keywords
+
+ def getErrataBugs(self,advisory,retry):
+ 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)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Bugs : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataBugs(advisory, (retry + 1))
+ return bugs
+
+ def getErrataCVEs(self,advisory,retry):
+ 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:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ 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)
+ elif f.faultCode == -208:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataPackages(advisory, (retry + 1))
+ 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:
+ 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
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1))
+ return out
+
+ def findPackageChannels(self,pkgid,retry):
+ channels=[]
+ try:
+ channels = self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
+ 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.listProvidingChannels(self.rhnSession,pkgid)
+ else:
+ print "Error Finding Channels for Package : %s" % pkgid
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.server.packages.findPackageChannels(pkgid, (retrun + 1))
+ return channels
+
+ def cloneErrata(self,dest_chan,errata,retry):
+ out=[]
+ try:
+ print "Clone errata in progress, please be patient.."
+ out = self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ except xmlrpclib.Fault, f:
+ 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.self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1))
+ return package
+
+ def listChannelErrata(self,dest_chan,retry):
+ out = []
+ try:
+ out = self.server.channel.software.listErrata(self.rhnSession,dest_chan)
+ 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)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,(retry + 1))
+ return out
+
+ def errataPublish(self,name,channels,retry):
+ 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:
+ print "Errata Already Exists..."
+ return []
+ else:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataPublish(name,channels, (retry + 1))
+ 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:
+ 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:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1))
+ return new_errata
+
+def parse_args():
+ parser = OptionParser()
+ parser.add_option("-s", "--spw-server", type="string", dest="src_server",
+ help="Spacewalk Server (spacewalk.mydomain.org)")
+ parser.add_option("-l", "--login", type="string", dest="login",
+ help="RHN Login")
+ parser.add_option("-p", "--password", type="string", dest="passwd",
+ help="RHN password")
+ parser.add_option("-c", "--src-channel", type="string", dest="src_channel",
+ 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\")")
+ parser.add_option("-e", "--end-date", type="string", dest="edate",
+ help="Ending Date: ie. \"19001231\" (defaults to TODAY)")
+ parser.add_option("-u", "--publish", action="store_true", dest="publish", default=False,
+ help="Publish Errata (into destination channels)")
+ parser.add_option("-f", "--format-header", action="store_true", dest="format", default=False,
+ help="Format header for logfiles")
+ 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
+
+def main():
+ global chanMap
+ global chanSuffixMap
+ global RHNServer
+ global RHNUser
+ global RHNPass
+ global options
+
+ options = parse_args()
+
+ if (options.src_server and options.login and options.passwd) is None:
+ print "try: "+sys.argv[0]+" --help"
+ sys.exit(2)
+
+ if options.format:
+ strYest = datetime.today() - timedelta(1)
+ print >>sys.stdout, "CLONE:%s:%s" % (options.src_channel, strYest.strftime("%Y%m%d"))
+ print >>sys.stderr, "CLONE:%s:%s" % (options.src_channel, strYest.strftime("%Y%m%d"))
+
+# I don't reckon this should change anytime soon...
+#
+ svrRHN = 'rhn.redhat.com'
+
+# Ok, configure your RHN credentials here...
+#
+ userRHN = 'wsuadmin'
+ passRHN = 'W$youAdm'
+
+# Here we setup our mappings from RHN to Local software channels.
+# Set these to what you have created for your SPW.
+# They are paired as:
+#
+# RHNChannel: SPWChannel
+#
+ chanMap = {
+ 'rhel-x86_64-server-5': 'rhel-x86_64-server-5',
+ 'rhn-tools-rhel-x86_64-server-5': 'rhel-x86_64-server-rhntools-5',
+ 'rhel-x86_64-server-productivity-5': 'rhel-x86_64-server-productivity-5',
+ 'rhel-x86_64-server-supplementary-5': 'rhel-x86_64-server-supplementary-5',
+ 'rhel-x86_64-server-vt-5': 'rhel-x86_64-server-vt-5',
+ 'rhel-i386-server-5': 'rhel-i386-server-5',
+ 'rhn-tools-rhel-i386-server-5': 'rhel-i386-server-rhntools-5',
+ 'rhel-i386-server-productivity-5': 'rhel-i386-server-productivity-5',
+ 'rhel-i386-server-supplementary-5': 'rhel-i386-server-supplementary-5',
+ 'rhel-i386-server-vt-5': 'rhel-i386-server-vt-5',
+ 'rhel-x86_64-as-4': 'rhel-x86_64-server-4',
+ 'rhel-x86_64-as-4-extras': 'rhel-x86_64-server-extras-4',
+ 'rhn-tools-rhel-4-as-x86_64': 'rhel-x86_64-server-rhntools-4',
+ 'rhel-i386-as-4': 'rhel-i386-server-4',
+ 'rhel-i386-as-4-extras': 'rhel-i386-server-extras-4',
+ 'rhn-tools-rhel-4-as-i386': 'rhel-i386-server-rhntools-4'
+ };
+
+# 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.
+#
+# RHNChannel: ErrataSuffix
+#
+ chanSuffixMap = {
+ 'rhel-x86_64-server-5': 'R5-64',
+ 'rhn-tools-rhel-x86_64-server-5': 'R5-64-T',
+ 'rhel-x86_64-server-productivity-5': 'R5-64-P',
+ 'rhel-x86_64-server-supplementary-5': 'R5-64-S',
+ 'rhel-x86_64-server-vt-5': 'R5-64-V',
+ 'rhel-i386-server-5': 'R5-32',
+ 'rhn-tools-rhel-i386-server-5': 'R5-32-T',
+ 'rhel-i386-server-productivity-5': 'R5-32-P',
+ 'rhel-i386-server-supplementary-5': 'R5-32-S',
+ 'rhel-i386-server-vt-5': 'R5-32-V',
+ 'rhel-x86_64-as-4': 'R4-64',
+ 'rhel-x86_64-as-4-extras': 'R4-64-E',
+ 'rhn-tools-rhel-4-as-x86_64': 'R4-64-T',
+ 'rhel-i386-as-4': 'R4-32',
+ 'rhel-i386-as-4-extras': 'R4-32-E',
+ 'rhn-tools-rhel-4-as-i386': 'R4-32-T'
+ };
+
+ if chanMap[options.src_channel] is None:
+ print "Invalid Channel!"
+ sys.exit(2)
+
+ myRHN = RHNServer(svrRHN,userRHN,passRHN)
+ mySPW = SPWServer(options.src_server,options.login,options.passwd)
+
+ dateStart = options.bdate or '19000101'
+ dateEnd = options.edate or strftime("%Y%m%d", localtime())
+
+ for rhnErrata in myRHN.listChannelErrata(options.src_channel,dateStart,dateEnd,0):
+ if not options.quiet:
+ print rhnErrata['errata_advisory']
+
+# Now, let's check if we already have this errata locally...
+ spwErrataName = rhnErrata['errata_advisory']+':'+chanSuffixMap[options.src_channel]
+ spwErrCheck = mySPW.getErrataDetails (spwErrataName,0)
+
+ 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 = []
+ 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 != options.src_channel:
+ continue
+ else:
+ if not pkgFind:
+ print "Hmmm... Package Missing: %s" % pkg['package_name']
+ else:
+ spwErrPackages.append(pkgFind[0]['id'])
+ break
+
+ spwErrDetails = myRHN.getErrataDetails(rhnErrata['errata_advisory'],0)
+ spwErrKeywords = myRHN.getErrataKeywords(rhnErrata['errata_advisory'],0)
+
+ spwErrBugs = []
+ tmpBugs = myRHN.getErrataBugs(rhnErrata['errata_advisory'],0)
+
+ for bug in tmpBugs:
+ spwErrBugs.append({'id': int(bug), 'summary': tmpBugs[bug]})
+
+ if not options.quiet:
+ 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[options.src_channel]],\
+ 0)
+
+ print "\tErrata Created: %d" % spwErrObject['id']
+
+ if options.publish:
+ spwPublish = mySPW.errataPublish (spwErrataName, [chanMap[options.src_channel]], 0)
+ print "\tErrata Published!"
+ else:
+ print "\t Errata Not Published!"
+ else:
+ if not options.quiet:
+ print "\tErrata already exists. %s" % spwErrataName
+ continue
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/clone-errata/spw-clone-errata.py b/scripts/clone-errata/spw-clone-errata.py
index e964382..3ad5cc4 100644
--- a/scripts/clone-errata/spw-clone-errata.py
+++ b/scripts/clone-errata/spw-clone-errata.py
@@ -1,582 +1,582 @@
-#!/bin/env python
-# Script that uses RHN API to clone RHN Errata to Satellite
-# or Spacewalk server.
-# Copyright (C) 2008 Red Hat
-#
-# Author: Andy Speagle (andy.speagle(a)wichita.edu)
-#
-# This script was written based on the "rhn-clone-errata.py"
-# script written by: Lars Jonsson (ljonsson(a)redhat.com)
-#
-# (THANKS!)
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#
-# Version Information:
-#
-# 0.1 - 2009-09-01 - Andy Speagle
-#
-# 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.
-#
-# 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.
-
-import xmlrpclib
-from optparse import OptionParser
-from time import time, localtime, strftime
-import sys
-import os
-import re
-
-class RHNServer:
- def __init__(self,servername,user,passwd):
- self.rhnServerName = servername
- self.login = user
- self.password = passwd
- self.rhnUrl = 'https://'+self.rhnServerName+'/rpc/api'
- self.server = xmlrpclib.Server(self.rhnUrl)
- self.rhnSession = self.rhnLogin(self.login,self.password,0)
-
- 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 f.faultCode==-20:
- self.rhnLogin(login,password,retry)
- else:
- print "Failed to login",f
- raise
- 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))
- return rhnSession
-
- def getErrataChannels(self,advisory,retry):
- 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:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.applicableToChannels(self.rhnSession,advisory)
- elif f.faultCode == -208:
- if options.verbose:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataChannels(advisory, (retry + 1))
- return channels
-
- def getErrataDetails(self,advisory,retry):
- 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:
- self.rhnLogin(self.login,self.password)
- 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
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataDetails(advisory, (retry + 1))
- return details
-
- def getErrataKeywords(self,advisory,retry):
- 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:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.listKeywords(self.rhnSession,advisory)
- elif f.faultCode == -208:
- if options.verbose:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- print "Error Getting Keywords : "+advisory
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataKeywords(advisory, (retry + 1))
- return keywords
-
- def getErrataBugs(self,advisory,retry):
- 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:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.bugzillaFixes(self.rhnSession,advisory)
- elif f.faultCode == -208:
- if options.verbose:
- print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
- return []
- else:
- print "Error Getting Bugs : "+advisory
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataBugs(advisory, (retry + 1))
- return bugs
-
- def getErrataCVEs(self,advisory,retry):
- 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:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.listCves(self.rhnSession,advisory)
- elif f.faultCode == -208:
- 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:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- 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:
- print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.listPackages(self.rhnSession,advisory)
- elif f.faultCode == -208:
- 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:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.getErrataPackages(advisory, (retry + 1))
- 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:
- print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd)
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1))
- return out
-
- def findPackageChannels(self,pkgid,retry):
- channels=[]
- try:
- channels = self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
- except xmlrpclib.Fault, f:
- if options.verbose:
- print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
- else:
- print "Error Finding Channels for Package : %s" % pkgid
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.server.packages.findPackageChannels(pkgid, (retrun + 1))
- return channels
-
- def cloneErrata(self,dest_chan,errata,retry):
- out=[]
- try:
- print "Clone errata in progress, please be patient.."
- out = self.server.errata.clone(self.rhnSession,dest_chan,errata)
- except xmlrpclib.Fault, f:
- print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.self.server.errata.clone(self.rhnSession,dest_chan,errata)
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- 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:
- print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- 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:
- return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1))
- return package
-
- def listChannelErrata(self,dest_chan,retry):
- out = []
- try:
- out = self.server.channel.software.listErrata(self.rhnSession,dest_chan)
- except xmlrpclib.Fault, f:
- if options.verbose:
- print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.server.channel.software.listErrata(self.rhnSession,dest_chan)
- else:
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.listChannelErrata(dest_chan,(retry + 1))
- return out
-
- def errataPublish(self,name,channels,retry):
- 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:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.publish(self.rhnSession,name,channels)
- elif f.faultCode == 2601:
- print "Errata Already Exists..."
- return []
- else:
- print "Error Creating Errata!"
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.errataPublish(name,channels, (retry + 1))
- return errata
-
- def errataClone(self,channel,errata,retry):
- clone=[]
- try:
- clone = self.server.errata.clone(self.rhnSession,channel,errata)
- except xmlrpclib.Fault, f:
- if options.verbose:
- print "Fault Code: %d - %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.clone(self.rhnSession,channel,errata)
- elif f.faultCode == -208:
- print "Errata Doesn't Exist..."
- return []
- else:
- print "Error Cloning Errata!"
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 5:
- return []
- else:
- return self.errataClone(channel,errata, (retry + 1))
- return clone
-
- 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:
- print "Fault Code: %d - %s" % (f.faultCode,f.faultString)
- if f.faultCode == -20:
- self.rhnLogin(self.login,self.password)
- return self.server.errata.create(self.rhnSession,info,bugs,keywords,packages,publish,channels)
- elif f.faultCode == 2601:
- print "Errata Already Exists..."
- return []
- else:
- print "Error Creating Errata!"
- raise
- except xmlrpclib.ProtocolError, err:
- if options.verbose:
- print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
- if retry > 3:
- raise
- else:
- return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1))
- return new_errata
-
-def parse_args():
- parser = OptionParser()
- parser.add_option("-s", "--server", type="string", dest="server",
- help="Spacewalk Server (spacewalk.mydomain.org)")
- parser.add_option("-l", "--login", type="string", dest="login",
- help="RHN Login")
- parser.add_option("-p", "--password", type="string", dest="passwd",
- help="RHN password")
- parser.add_option("-c", "--channel", type="string", dest="channel",
- help="Dest channel for cloning.")
- parser.add_option("-b", "--begin-date", type="string", dest="bdate",
- 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)")
- parser.add_option("-n", "--named-errata", type="string", dest="errata",
- help="Name of errata: (RHSA-XXXX:XXXX:XX-XX)")
- parser.add_option("-r", "--pattern", type="string", dest="pattern",
- help="Name pattern of errata: (RHSA, 2005, Foo)")
- 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
-
-def main():
- global chanMap
- global chanSuffixMap
- global RHNServer
- global RHNUser
- global RHNPass
- global options
-
- options = parse_args()
-
- if (options.server and options.login and options.passwd) is None:
- print "try: "+sys.argv[0]+" --help"
- sys.exit(2)
-
-# I don't reckon this should change anytime soon...
-#
- svrRHN = 'rhn.redhat.com'
-
-# Ok, configure your RHN credentials here...
-#
- userRHN = 'wsuadmin'
- passRHN = 'W$youAdm'
-
-# Here we setup our mappings from RHN to Local software channels.
-# Set these to what you have created for your SPW.
-# They are paired as:
-#
-# RHNChannel: SPWChannel
-#
-
- chanMapRHN = {
- 'rhel-x86_64-server-5': 'rhel-x86_64-server-5',
- 'rhel-x86_64-server-rhntools-5': 'rhn-tools-rhel-x86_64-server-5',
- 'rhel-x86_64-server-productivity-5': 'rhel-x86_64-server-productivity-5',
- 'rhel-x86_64-server-supplementary-5': 'rhel-x86_64-server-supplementary-5',
- 'rhel-x86_64-server-vt-5': 'rhel-x86_64-server-vt-5',
- 'rhel-i386-server-5': 'rhel-i386-server-5',
- 'rhel-i386-server-rhntools-5': 'rhn-tools-rhel-i386-server-5',
- 'rhel-i386-server-productivity-5': 'rhel-i386-server-productivity-5',
- 'rhel-i386-server-supplementary-5': 'rhel-i386-server-supplementary-5',
- 'rhel-i386-server-vt-5': 'rhel-i386-server-vt-5',
- 'rhel-x86_64-server-4': 'rhel-x86_64-as-4',
- 'rhel-x86_64-server-extras-4': 'rhel-x86_64-as-4-extras',
- 'rhel-x86_64-server-rhntools-4': 'rhn-tools-rhel-4-as-x86_64',
- 'rhel-i386-server-4': 'rhel-i386-as-4',
- 'rhel-i386-server-extras-4': 'rhel-i386-as-4-extras',
- 'rhel-i386-server-rhntools-4': 'rhn-tools-rhel-4-as-i386'
- };
-
-# Here I setup the production to authoritative channel mapping...
-
- chanMapSPW = {
- 'rhel-x86_64-server-prod-5-3': 'rhel-x86_64-server-5',
- 'rhel-x86_64-server-rhntools-prod-5-3': 'rhel-x86_64-server-rhntools-5',
- 'rhel-x86_64-server-productivity-prod-5-3': 'rhel-x86_64-server-productivity-5',
- 'rhel-x86_64-server-supplementary-prod-5-3': 'rhel-x86_64-server-supplementary-5',
- 'rhel-x86_64-server-vt-prod-5-3': 'rhel-x86_64-server-vt-5',
- 'rhel-i386-server-prod-5-3': 'rhel-i386-server-5',
- 'rhel-i386-server-rhntools-prod-5-3': 'rhel-i386-server-rhntools-5',
- 'rhel-i386-server-productivity-prod-5-3': 'rhel-i386-server-productivity-5',
- 'rhel-i386-server-supplementary-prod-5-3': 'rhel-i386-server-supplementary-5',
- 'rhel-i386-server-vt-prod-5-3': 'rhel-i386-server-vt-5',
- 'rhel-x86_64-server-prod-4-7': 'rhel-x86_64-server-4',
- 'rhel-x86_64-server-extras-prod-4-7': 'rhel-x86_64-server-extras-4',
- 'rhel-x86_64-server-rhntools-prod-4-7': 'rhel-x86_64-server-rhntools-4',
- 'rhel-i386-server-prod-4-7': 'rhel-i386-server-4',
- 'rhel-i386-server-extras-prod-4-7': 'rhel-i386-server-extras-4',
- 'rhel-i386-server-rhntools-prod-4-7': 'rhel-i386-server-rhntools-4'
- };
-
-# 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.
-#
-# RHNChannel: ErrataSuffix
-#
- chanSuffixMap = {
- 'rhel-x86_64-server-5': 'R5-64',
- 'rhn-tools-rhel-x86_64-server-5': 'R5-64-T',
- 'rhel-x86_64-server-productivity-5': 'R5-64-P',
- 'rhel-x86_64-server-supplementary-5': 'R5-64-S',
- 'rhel-x86_64-server-vt-5': 'R5-64-V',
- 'rhel-i386-server-5': 'R5-32',
- 'rhn-tools-rhel-i386-server-5': 'R5-32-T',
- 'rhel-i386-server-productivity-5': 'R5-32-P',
- 'rhel-i386-server-supplementary-5': 'R5-32-S',
- 'rhel-i386-server-vt-5': 'R5-32-V',
- 'rhel-x86_64-as-4': 'R4-64',
- 'rhel-x86_64-as-4-extras': 'R4-64-E',
- 'rhn-tools-rhel-4-as-x86_64': 'R4-64-T',
- 'rhel-i386-as-4': 'R4-32',
- 'rhel-i386-as-4-extras': 'R4-32-E',
- 'rhn-tools-rhel-4-as-i386': 'R4-32-T'
- };
-
- if chanMapSPW[options.channel] is None:
- print "Invalid Channel!"
- sys.exit(2)
-
- mySPW = SPWServer(options.server,options.login,options.passwd)
-
- dateStart = options.bdate or '19000101'
- dateEnd = options.edate or strftime("%Y%m%d", localtime())
-
- errList = []
-
- if options.errata:
- errList = [ options.errata ]
-
- if options.pattern:
- for spwErrata in mySPW.listChannelErrata(chanMapSPW[options.channel],0):
- if re.search (options.pattern, spwErrata['advisory_name']):
- errList.append (spwErrata['advisory_name'])
-
- if options.bdate or options.edate:
- myRHN = RHNServer(svrRHN,userRHN,passRHN)
- chanRHN = chanMapRHN[chanMapSPW[options.channel]]
-
- for rhnErrata in myRHN.listChannelErrata(chanRHN,dateStart,dateEnd,0):
- errName = rhnErrata['errata_advisory'] + ":" + chanSuffixMap[chanRHN]
- errList.append (errName)
-
- for spwErr in errList:
- print spwErr
-
- spwClone = re.sub ('RH[BES]A', 'CLA', spwErr)
- spwCloneCheck = mySPW.getErrataDetails (spwClone, 0)
-
- if spwCloneCheck:
- print "\tErrata Already Cloned: %s - %s" % (spwClone, spwCloneCheck['synopsis'])
- continue
-
- spwErrClone = mySPW.errataClone (options.channel, [ spwErr ], 0)
-
- if spwErrClone:
- print "\tErrata Cloned:\t%s - %s" % (spwErrClone[0]['advisory_name'], spwErrClone[0]['advisory_synopsis'])
- else:
- print "\tErrata NOT Cloned! - Some Error Occurred."
-
-if __name__ == "__main__":
- main()
+#!/bin/env python
+# Script that uses RHN API to clone RHN Errata to Satellite
+# or Spacewalk server.
+# Copyright (C) 2008 Red Hat
+#
+# Author: Andy Speagle (andy.speagle(a)wichita.edu)
+#
+# This script was written based on the "rhn-clone-errata.py"
+# script written by: Lars Jonsson (ljonsson(a)redhat.com)
+#
+# (THANKS!)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Version Information:
+#
+# 0.1 - 2009-09-01 - Andy Speagle
+#
+# 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.
+#
+# 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.
+
+import xmlrpclib
+from optparse import OptionParser
+from time import time, localtime, strftime
+import sys
+import os
+import re
+
+class RHNServer:
+ def __init__(self,servername,user,passwd):
+ self.rhnServerName = servername
+ self.login = user
+ self.password = passwd
+ self.rhnUrl = 'https://'+self.rhnServerName+'/rpc/api'
+ self.server = xmlrpclib.Server(self.rhnUrl)
+ self.rhnSession = self.rhnLogin(self.login,self.password,0)
+
+ 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 f.faultCode==-20:
+ self.rhnLogin(login,password,retry)
+ else:
+ print "Failed to login",f
+ raise
+ 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))
+ return rhnSession
+
+ def getErrataChannels(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.applicableToChannels(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataChannels(advisory, (retry + 1))
+ return channels
+
+ def getErrataDetails(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ 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
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataDetails(advisory, (retry + 1))
+ return details
+
+ def getErrataKeywords(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.listKeywords(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Keywords : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataKeywords(advisory, (retry + 1))
+ return keywords
+
+ def getErrataBugs(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.bugzillaFixes(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Bugs : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataBugs(advisory, (retry + 1))
+ return bugs
+
+ def getErrataCVEs(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.listCves(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.listPackages(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataPackages(advisory, (retry + 1))
+ 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:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1))
+ return out
+
+ def findPackageChannels(self,pkgid,retry):
+ channels=[]
+ try:
+ channels = self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
+ except xmlrpclib.Fault, f:
+ if options.verbose:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
+ else:
+ print "Error Finding Channels for Package : %s" % pkgid
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.server.packages.findPackageChannels(pkgid, (retrun + 1))
+ return channels
+
+ def cloneErrata(self,dest_chan,errata,retry):
+ out=[]
+ try:
+ print "Clone errata in progress, please be patient.."
+ out = self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ except xmlrpclib.Fault, f:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ 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:
+ return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1))
+ return package
+
+ def listChannelErrata(self,dest_chan,retry):
+ out = []
+ try:
+ out = self.server.channel.software.listErrata(self.rhnSession,dest_chan)
+ except xmlrpclib.Fault, f:
+ if options.verbose:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.channel.software.listErrata(self.rhnSession,dest_chan)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,(retry + 1))
+ return out
+
+ def errataPublish(self,name,channels,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.publish(self.rhnSession,name,channels)
+ elif f.faultCode == 2601:
+ print "Errata Already Exists..."
+ return []
+ else:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataPublish(name,channels, (retry + 1))
+ return errata
+
+ def errataClone(self,channel,errata,retry):
+ clone=[]
+ try:
+ clone = self.server.errata.clone(self.rhnSession,channel,errata)
+ except xmlrpclib.Fault, f:
+ if options.verbose:
+ print "Fault Code: %d - %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.clone(self.rhnSession,channel,errata)
+ elif f.faultCode == -208:
+ print "Errata Doesn't Exist..."
+ return []
+ else:
+ print "Error Cloning Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 5:
+ return []
+ else:
+ return self.errataClone(channel,errata, (retry + 1))
+ return clone
+
+ 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:
+ print "Fault Code: %d - %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.create(self.rhnSession,info,bugs,keywords,packages,publish,channels)
+ elif f.faultCode == 2601:
+ print "Errata Already Exists..."
+ return []
+ else:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1))
+ return new_errata
+
+def parse_args():
+ parser = OptionParser()
+ parser.add_option("-s", "--server", type="string", dest="server",
+ help="Spacewalk Server (spacewalk.mydomain.org)")
+ parser.add_option("-l", "--login", type="string", dest="login",
+ help="RHN Login")
+ parser.add_option("-p", "--password", type="string", dest="passwd",
+ help="RHN password")
+ parser.add_option("-c", "--channel", type="string", dest="channel",
+ help="Dest channel for cloning.")
+ parser.add_option("-b", "--begin-date", type="string", dest="bdate",
+ 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)")
+ parser.add_option("-n", "--named-errata", type="string", dest="errata",
+ help="Name of errata: (RHSA-XXXX:XXXX:XX-XX)")
+ parser.add_option("-r", "--pattern", type="string", dest="pattern",
+ help="Name pattern of errata: (RHSA, 2005, Foo)")
+ 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
+
+def main():
+ global chanMap
+ global chanSuffixMap
+ global RHNServer
+ global RHNUser
+ global RHNPass
+ global options
+
+ options = parse_args()
+
+ if (options.server and options.login and options.passwd) is None:
+ print "try: "+sys.argv[0]+" --help"
+ sys.exit(2)
+
+# I don't reckon this should change anytime soon...
+#
+ svrRHN = 'rhn.redhat.com'
+
+# Ok, configure your RHN credentials here...
+#
+ userRHN = 'wsuadmin'
+ passRHN = 'W$youAdm'
+
+# Here we setup our mappings from RHN to Local software channels.
+# Set these to what you have created for your SPW.
+# They are paired as:
+#
+# RHNChannel: SPWChannel
+#
+
+ chanMapRHN = {
+ 'rhel-x86_64-server-5': 'rhel-x86_64-server-5',
+ 'rhel-x86_64-server-rhntools-5': 'rhn-tools-rhel-x86_64-server-5',
+ 'rhel-x86_64-server-productivity-5': 'rhel-x86_64-server-productivity-5',
+ 'rhel-x86_64-server-supplementary-5': 'rhel-x86_64-server-supplementary-5',
+ 'rhel-x86_64-server-vt-5': 'rhel-x86_64-server-vt-5',
+ 'rhel-i386-server-5': 'rhel-i386-server-5',
+ 'rhel-i386-server-rhntools-5': 'rhn-tools-rhel-i386-server-5',
+ 'rhel-i386-server-productivity-5': 'rhel-i386-server-productivity-5',
+ 'rhel-i386-server-supplementary-5': 'rhel-i386-server-supplementary-5',
+ 'rhel-i386-server-vt-5': 'rhel-i386-server-vt-5',
+ 'rhel-x86_64-server-4': 'rhel-x86_64-as-4',
+ 'rhel-x86_64-server-extras-4': 'rhel-x86_64-as-4-extras',
+ 'rhel-x86_64-server-rhntools-4': 'rhn-tools-rhel-4-as-x86_64',
+ 'rhel-i386-server-4': 'rhel-i386-as-4',
+ 'rhel-i386-server-extras-4': 'rhel-i386-as-4-extras',
+ 'rhel-i386-server-rhntools-4': 'rhn-tools-rhel-4-as-i386'
+ };
+
+# Here I setup the production to authoritative channel mapping...
+
+ chanMapSPW = {
+ 'rhel-x86_64-server-prod-5-3': 'rhel-x86_64-server-5',
+ 'rhel-x86_64-server-rhntools-prod-5-3': 'rhel-x86_64-server-rhntools-5',
+ 'rhel-x86_64-server-productivity-prod-5-3': 'rhel-x86_64-server-productivity-5',
+ 'rhel-x86_64-server-supplementary-prod-5-3': 'rhel-x86_64-server-supplementary-5',
+ 'rhel-x86_64-server-vt-prod-5-3': 'rhel-x86_64-server-vt-5',
+ 'rhel-i386-server-prod-5-3': 'rhel-i386-server-5',
+ 'rhel-i386-server-rhntools-prod-5-3': 'rhel-i386-server-rhntools-5',
+ 'rhel-i386-server-productivity-prod-5-3': 'rhel-i386-server-productivity-5',
+ 'rhel-i386-server-supplementary-prod-5-3': 'rhel-i386-server-supplementary-5',
+ 'rhel-i386-server-vt-prod-5-3': 'rhel-i386-server-vt-5',
+ 'rhel-x86_64-server-prod-4-7': 'rhel-x86_64-server-4',
+ 'rhel-x86_64-server-extras-prod-4-7': 'rhel-x86_64-server-extras-4',
+ 'rhel-x86_64-server-rhntools-prod-4-7': 'rhel-x86_64-server-rhntools-4',
+ 'rhel-i386-server-prod-4-7': 'rhel-i386-server-4',
+ 'rhel-i386-server-extras-prod-4-7': 'rhel-i386-server-extras-4',
+ 'rhel-i386-server-rhntools-prod-4-7': 'rhel-i386-server-rhntools-4'
+ };
+
+# 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.
+#
+# RHNChannel: ErrataSuffix
+#
+ chanSuffixMap = {
+ 'rhel-x86_64-server-5': 'R5-64',
+ 'rhn-tools-rhel-x86_64-server-5': 'R5-64-T',
+ 'rhel-x86_64-server-productivity-5': 'R5-64-P',
+ 'rhel-x86_64-server-supplementary-5': 'R5-64-S',
+ 'rhel-x86_64-server-vt-5': 'R5-64-V',
+ 'rhel-i386-server-5': 'R5-32',
+ 'rhn-tools-rhel-i386-server-5': 'R5-32-T',
+ 'rhel-i386-server-productivity-5': 'R5-32-P',
+ 'rhel-i386-server-supplementary-5': 'R5-32-S',
+ 'rhel-i386-server-vt-5': 'R5-32-V',
+ 'rhel-x86_64-as-4': 'R4-64',
+ 'rhel-x86_64-as-4-extras': 'R4-64-E',
+ 'rhn-tools-rhel-4-as-x86_64': 'R4-64-T',
+ 'rhel-i386-as-4': 'R4-32',
+ 'rhel-i386-as-4-extras': 'R4-32-E',
+ 'rhn-tools-rhel-4-as-i386': 'R4-32-T'
+ };
+
+ if chanMapSPW[options.channel] is None:
+ print "Invalid Channel!"
+ sys.exit(2)
+
+ mySPW = SPWServer(options.server,options.login,options.passwd)
+
+ dateStart = options.bdate or '19000101'
+ dateEnd = options.edate or strftime("%Y%m%d", localtime())
+
+ errList = []
+
+ if options.errata:
+ errList = [ options.errata ]
+
+ if options.pattern:
+ for spwErrata in mySPW.listChannelErrata(chanMapSPW[options.channel],0):
+ if re.search (options.pattern, spwErrata['advisory_name']):
+ errList.append (spwErrata['advisory_name'])
+
+ if options.bdate or options.edate:
+ myRHN = RHNServer(svrRHN,userRHN,passRHN)
+ chanRHN = chanMapRHN[chanMapSPW[options.channel]]
+
+ for rhnErrata in myRHN.listChannelErrata(chanRHN,dateStart,dateEnd,0):
+ errName = rhnErrata['errata_advisory'] + ":" + chanSuffixMap[chanRHN]
+ errList.append (errName)
+
+ for spwErr in errList:
+ print spwErr
+
+ spwClone = re.sub ('RH[BES]A', 'CLA', spwErr)
+ spwCloneCheck = mySPW.getErrataDetails (spwClone, 0)
+
+ if spwCloneCheck:
+ print "\tErrata Already Cloned: %s - %s" % (spwClone, spwCloneCheck['synopsis'])
+ continue
+
+ spwErrClone = mySPW.errataClone (options.channel, [ spwErr ], 0)
+
+ if spwErrClone:
+ print "\tErrata Cloned:\t%s - %s" % (spwErrClone[0]['advisory_name'], spwErrClone[0]['advisory_synopsis'])
+ else:
+ print "\tErrata NOT Cloned! - Some Error Occurred."
+
+if __name__ == "__main__":
+ main()
14 years, 3 months
scripts/clone-errata
by Justin Sherrill
scripts/clone-errata/README | 25 +
scripts/clone-errata/rhn-clone-errata.py | 587 +++++++++++++++++++++++++++++++
scripts/clone-errata/spw-clone-errata.py | 582 ++++++++++++++++++++++++++++++
3 files changed, 1194 insertions(+)
New commits:
commit 51571b9016c238743321a26f4288c1024df59667
Author: Andy Speagle <andy.speagle(a)wichita.edu>
Date: Wed Jan 20 16:26:19 2010 -0500
adding errata cloning scripts
diff --git a/scripts/clone-errata/README b/scripts/clone-errata/README
new file mode 100644
index 0000000..9aab352
--- /dev/null
+++ b/scripts/clone-errata/README
@@ -0,0 +1,25 @@
+rhn-clone-errata.py : This handles pulling errata from RHN and
+publishing them in my "official" RHEL channels. Typical usage for me:
+
+rhn-clone-errata.py -s localhost -l <username> -p <password> \
+ --src-channel=rhel-x86_64-server-5 \
+ -b YYYYMMDD -e YYYYMMDD -u
+
+spw-clone-errata.py : This handles cloning the errata I have in my
+"official" channels into cloned "production" channels. This helps me do
+proper release management of errata for my org. Typical usage:
+
+spw-clone-errata.py -s localhost -l <username> -p <password> -c
+rhel-i386-server-prod-4-7 -e 20080724
+
+(NOTE: This end-date corresponds to the release of RHEL 4.7. This
+allows me to clone to production channels all errata up to that
+release.. more or less.)
+
+These will eventually be thrown together into one script... but I'm
+still actively developing and will get there eventually. I've also been
+lazy about handling credentials... so you'll find these sanitized for my
+protection.
+
+Andy Speagle
+
diff --git a/scripts/clone-errata/rhn-clone-errata.py b/scripts/clone-errata/rhn-clone-errata.py
new file mode 100644
index 0000000..1458d6e
--- /dev/null
+++ b/scripts/clone-errata/rhn-clone-errata.py
@@ -0,0 +1,587 @@
+#!/bin/env python
+# Script that uses RHN API to clone RHN Errata to Satellite
+# or Spacewalk server.
+# Copyright (C) 2008 Red Hat
+#
+# Author: Andy Speagle (andy.speagle(a)wichita.edu)
+#
+# This script was written based on the "rhn-clone-errata.py"
+# script written by: Lars Jonsson (ljonsson(a)redhat.com)
+#
+# (THANKS!)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Version Information:
+#
+# 0.1 - 2009-09-01 - Andy Speagle
+#
+# 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.
+#
+# 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.
+#
+# 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.
+
+import xmlrpclib
+from optparse import OptionParser
+from time import time, localtime, strftime
+from datetime import datetime, timedelta
+import sys
+import os
+import re
+
+class RHNServer:
+ def __init__(self,servername,user,passwd):
+ self.rhnServerName = servername
+ self.login = user
+ self.password = passwd
+ self.rhnUrl = 'https://'+self.rhnServerName+'/rpc/api'
+ self.server = xmlrpclib.Server(self.rhnUrl)
+ self.rhnSession = self.rhnLogin(self.login,self.password,0)
+
+ 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 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ 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:
+ 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:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataChannels(advisory, (retry + 1))
+ return channels
+
+ def getErrataDetails(self,advisory,retry):
+ 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:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataDetails(advisory, (retry + 1))
+ return details
+
+ def getErrataKeywords(self,advisory,retry):
+ 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)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Keywords : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataKeywords(advisory, (retry + 1))
+ return keywords
+
+ def getErrataBugs(self,advisory,retry):
+ 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)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Bugs : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataBugs(advisory, (retry + 1))
+ return bugs
+
+ def getErrataCVEs(self,advisory,retry):
+ 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:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ 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)
+ elif f.faultCode == -208:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataPackages(advisory, (retry + 1))
+ 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:
+ 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
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1))
+ return out
+
+ def findPackageChannels(self,pkgid,retry):
+ channels=[]
+ try:
+ channels = self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
+ 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.listProvidingChannels(self.rhnSession,pkgid)
+ else:
+ print "Error Finding Channels for Package : %s" % pkgid
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.server.packages.findPackageChannels(pkgid, (retrun + 1))
+ return channels
+
+ def cloneErrata(self,dest_chan,errata,retry):
+ out=[]
+ try:
+ print "Clone errata in progress, please be patient.."
+ out = self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ except xmlrpclib.Fault, f:
+ 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.self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1))
+ return package
+
+ def listChannelErrata(self,dest_chan,retry):
+ out = []
+ try:
+ out = self.server.channel.software.listErrata(self.rhnSession,dest_chan)
+ 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)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,(retry + 1))
+ return out
+
+ def errataPublish(self,name,channels,retry):
+ 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:
+ print "Errata Already Exists..."
+ return []
+ else:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataPublish(name,channels, (retry + 1))
+ 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:
+ 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:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1))
+ return new_errata
+
+def parse_args():
+ parser = OptionParser()
+ parser.add_option("-s", "--spw-server", type="string", dest="src_server",
+ help="Spacewalk Server (spacewalk.mydomain.org)")
+ parser.add_option("-l", "--login", type="string", dest="login",
+ help="RHN Login")
+ parser.add_option("-p", "--password", type="string", dest="passwd",
+ help="RHN password")
+ parser.add_option("-c", "--src-channel", type="string", dest="src_channel",
+ 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\")")
+ parser.add_option("-e", "--end-date", type="string", dest="edate",
+ help="Ending Date: ie. \"19001231\" (defaults to TODAY)")
+ parser.add_option("-u", "--publish", action="store_true", dest="publish", default=False,
+ help="Publish Errata (into destination channels)")
+ parser.add_option("-f", "--format-header", action="store_true", dest="format", default=False,
+ help="Format header for logfiles")
+ 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
+
+def main():
+ global chanMap
+ global chanSuffixMap
+ global RHNServer
+ global RHNUser
+ global RHNPass
+ global options
+
+ options = parse_args()
+
+ if (options.src_server and options.login and options.passwd) is None:
+ print "try: "+sys.argv[0]+" --help"
+ sys.exit(2)
+
+ if options.format:
+ strYest = datetime.today() - timedelta(1)
+ print >>sys.stdout, "CLONE:%s:%s" % (options.src_channel, strYest.strftime("%Y%m%d"))
+ print >>sys.stderr, "CLONE:%s:%s" % (options.src_channel, strYest.strftime("%Y%m%d"))
+
+# I don't reckon this should change anytime soon...
+#
+ svrRHN = 'rhn.redhat.com'
+
+# Ok, configure your RHN credentials here...
+#
+ userRHN = 'wsuadmin'
+ passRHN = 'W$youAdm'
+
+# Here we setup our mappings from RHN to Local software channels.
+# Set these to what you have created for your SPW.
+# They are paired as:
+#
+# RHNChannel: SPWChannel
+#
+ chanMap = {
+ 'rhel-x86_64-server-5': 'rhel-x86_64-server-5',
+ 'rhn-tools-rhel-x86_64-server-5': 'rhel-x86_64-server-rhntools-5',
+ 'rhel-x86_64-server-productivity-5': 'rhel-x86_64-server-productivity-5',
+ 'rhel-x86_64-server-supplementary-5': 'rhel-x86_64-server-supplementary-5',
+ 'rhel-x86_64-server-vt-5': 'rhel-x86_64-server-vt-5',
+ 'rhel-i386-server-5': 'rhel-i386-server-5',
+ 'rhn-tools-rhel-i386-server-5': 'rhel-i386-server-rhntools-5',
+ 'rhel-i386-server-productivity-5': 'rhel-i386-server-productivity-5',
+ 'rhel-i386-server-supplementary-5': 'rhel-i386-server-supplementary-5',
+ 'rhel-i386-server-vt-5': 'rhel-i386-server-vt-5',
+ 'rhel-x86_64-as-4': 'rhel-x86_64-server-4',
+ 'rhel-x86_64-as-4-extras': 'rhel-x86_64-server-extras-4',
+ 'rhn-tools-rhel-4-as-x86_64': 'rhel-x86_64-server-rhntools-4',
+ 'rhel-i386-as-4': 'rhel-i386-server-4',
+ 'rhel-i386-as-4-extras': 'rhel-i386-server-extras-4',
+ 'rhn-tools-rhel-4-as-i386': 'rhel-i386-server-rhntools-4'
+ };
+
+# 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.
+#
+# RHNChannel: ErrataSuffix
+#
+ chanSuffixMap = {
+ 'rhel-x86_64-server-5': 'R5-64',
+ 'rhn-tools-rhel-x86_64-server-5': 'R5-64-T',
+ 'rhel-x86_64-server-productivity-5': 'R5-64-P',
+ 'rhel-x86_64-server-supplementary-5': 'R5-64-S',
+ 'rhel-x86_64-server-vt-5': 'R5-64-V',
+ 'rhel-i386-server-5': 'R5-32',
+ 'rhn-tools-rhel-i386-server-5': 'R5-32-T',
+ 'rhel-i386-server-productivity-5': 'R5-32-P',
+ 'rhel-i386-server-supplementary-5': 'R5-32-S',
+ 'rhel-i386-server-vt-5': 'R5-32-V',
+ 'rhel-x86_64-as-4': 'R4-64',
+ 'rhel-x86_64-as-4-extras': 'R4-64-E',
+ 'rhn-tools-rhel-4-as-x86_64': 'R4-64-T',
+ 'rhel-i386-as-4': 'R4-32',
+ 'rhel-i386-as-4-extras': 'R4-32-E',
+ 'rhn-tools-rhel-4-as-i386': 'R4-32-T'
+ };
+
+ if chanMap[options.src_channel] is None:
+ print "Invalid Channel!"
+ sys.exit(2)
+
+ myRHN = RHNServer(svrRHN,userRHN,passRHN)
+ mySPW = SPWServer(options.src_server,options.login,options.passwd)
+
+ dateStart = options.bdate or '19000101'
+ dateEnd = options.edate or strftime("%Y%m%d", localtime())
+
+ for rhnErrata in myRHN.listChannelErrata(options.src_channel,dateStart,dateEnd,0):
+ if not options.quiet:
+ print rhnErrata['errata_advisory']
+
+# Now, let's check if we already have this errata locally...
+ spwErrataName = rhnErrata['errata_advisory']+':'+chanSuffixMap[options.src_channel]
+ spwErrCheck = mySPW.getErrataDetails (spwErrataName,0)
+
+ 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 = []
+ 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 != options.src_channel:
+ continue
+ else:
+ if not pkgFind:
+ print "Hmmm... Package Missing: %s" % pkg['package_name']
+ else:
+ spwErrPackages.append(pkgFind[0]['id'])
+ break
+
+ spwErrDetails = myRHN.getErrataDetails(rhnErrata['errata_advisory'],0)
+ spwErrKeywords = myRHN.getErrataKeywords(rhnErrata['errata_advisory'],0)
+
+ spwErrBugs = []
+ tmpBugs = myRHN.getErrataBugs(rhnErrata['errata_advisory'],0)
+
+ for bug in tmpBugs:
+ spwErrBugs.append({'id': int(bug), 'summary': tmpBugs[bug]})
+
+ if not options.quiet:
+ 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[options.src_channel]],\
+ 0)
+
+ print "\tErrata Created: %d" % spwErrObject['id']
+
+ if options.publish:
+ spwPublish = mySPW.errataPublish (spwErrataName, [chanMap[options.src_channel]], 0)
+ print "\tErrata Published!"
+ else:
+ print "\t Errata Not Published!"
+ else:
+ if not options.quiet:
+ print "\tErrata already exists. %s" % spwErrataName
+ continue
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/clone-errata/spw-clone-errata.py b/scripts/clone-errata/spw-clone-errata.py
new file mode 100644
index 0000000..e964382
--- /dev/null
+++ b/scripts/clone-errata/spw-clone-errata.py
@@ -0,0 +1,582 @@
+#!/bin/env python
+# Script that uses RHN API to clone RHN Errata to Satellite
+# or Spacewalk server.
+# Copyright (C) 2008 Red Hat
+#
+# Author: Andy Speagle (andy.speagle(a)wichita.edu)
+#
+# This script was written based on the "rhn-clone-errata.py"
+# script written by: Lars Jonsson (ljonsson(a)redhat.com)
+#
+# (THANKS!)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Version Information:
+#
+# 0.1 - 2009-09-01 - Andy Speagle
+#
+# 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.
+#
+# 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.
+
+import xmlrpclib
+from optparse import OptionParser
+from time import time, localtime, strftime
+import sys
+import os
+import re
+
+class RHNServer:
+ def __init__(self,servername,user,passwd):
+ self.rhnServerName = servername
+ self.login = user
+ self.password = passwd
+ self.rhnUrl = 'https://'+self.rhnServerName+'/rpc/api'
+ self.server = xmlrpclib.Server(self.rhnUrl)
+ self.rhnSession = self.rhnLogin(self.login,self.password,0)
+
+ 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 f.faultCode==-20:
+ self.rhnLogin(login,password,retry)
+ else:
+ print "Failed to login",f
+ raise
+ 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))
+ return rhnSession
+
+ def getErrataChannels(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.applicableToChannels(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataChannels(advisory, (retry + 1))
+ return channels
+
+ def getErrataDetails(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ 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
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataDetails(advisory, (retry + 1))
+ return details
+
+ def getErrataKeywords(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.listKeywords(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Keywords : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataKeywords(advisory, (retry + 1))
+ return keywords
+
+ def getErrataBugs(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.bugzillaFixes(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ if options.verbose:
+ print "Errata %s Doesn't Exist on %s ..." % (advisory,self.rhnServerName)
+ return []
+ else:
+ print "Error Getting Bugs : "+advisory
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataBugs(advisory, (retry + 1))
+ return bugs
+
+ def getErrataCVEs(self,advisory,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.listCves(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.listPackages(self.rhnSession,advisory)
+ elif f.faultCode == -208:
+ 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:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.getErrataPackages(advisory, (retry + 1))
+ 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:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.channel.software.listErrata(self.rhnSession,dest_chan,dateStart,dateEnd)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,dateStart,dateEnd,(retry + 1))
+ return out
+
+ def findPackageChannels(self,pkgid,retry):
+ channels=[]
+ try:
+ channels = self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
+ except xmlrpclib.Fault, f:
+ if options.verbose:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.packages.listProvidingChannels(self.rhnSession,pkgid)
+ else:
+ print "Error Finding Channels for Package : %s" % pkgid
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.server.packages.findPackageChannels(pkgid, (retrun + 1))
+ return channels
+
+ def cloneErrata(self,dest_chan,errata,retry):
+ out=[]
+ try:
+ print "Clone errata in progress, please be patient.."
+ out = self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ except xmlrpclib.Fault, f:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.self.server.errata.clone(self.rhnSession,dest_chan,errata)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ 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:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ 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:
+ return self.searchNVREA(name,version,release,epoch,archlabel, (retry + 1))
+ return package
+
+ def listChannelErrata(self,dest_chan,retry):
+ out = []
+ try:
+ out = self.server.channel.software.listErrata(self.rhnSession,dest_chan)
+ except xmlrpclib.Fault, f:
+ if options.verbose:
+ print "Fault Code: %d\tFault String: %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.channel.software.listErrata(self.rhnSession,dest_chan)
+ else:
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.listChannelErrata(dest_chan,(retry + 1))
+ return out
+
+ def errataPublish(self,name,channels,retry):
+ 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:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.publish(self.rhnSession,name,channels)
+ elif f.faultCode == 2601:
+ print "Errata Already Exists..."
+ return []
+ else:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataPublish(name,channels, (retry + 1))
+ return errata
+
+ def errataClone(self,channel,errata,retry):
+ clone=[]
+ try:
+ clone = self.server.errata.clone(self.rhnSession,channel,errata)
+ except xmlrpclib.Fault, f:
+ if options.verbose:
+ print "Fault Code: %d - %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.clone(self.rhnSession,channel,errata)
+ elif f.faultCode == -208:
+ print "Errata Doesn't Exist..."
+ return []
+ else:
+ print "Error Cloning Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 5:
+ return []
+ else:
+ return self.errataClone(channel,errata, (retry + 1))
+ return clone
+
+ 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:
+ print "Fault Code: %d - %s" % (f.faultCode,f.faultString)
+ if f.faultCode == -20:
+ self.rhnLogin(self.login,self.password)
+ return self.server.errata.create(self.rhnSession,info,bugs,keywords,packages,publish,channels)
+ elif f.faultCode == 2601:
+ print "Errata Already Exists..."
+ return []
+ else:
+ print "Error Creating Errata!"
+ raise
+ except xmlrpclib.ProtocolError, err:
+ if options.verbose:
+ print "ProtocolError: %d - %s" % (err.errcode,err.errmsg)
+ if retry > 3:
+ raise
+ else:
+ return self.errataCreate(info,bugs,keywords,packages,publish,channels, (retry + 1))
+ return new_errata
+
+def parse_args():
+ parser = OptionParser()
+ parser.add_option("-s", "--server", type="string", dest="server",
+ help="Spacewalk Server (spacewalk.mydomain.org)")
+ parser.add_option("-l", "--login", type="string", dest="login",
+ help="RHN Login")
+ parser.add_option("-p", "--password", type="string", dest="passwd",
+ help="RHN password")
+ parser.add_option("-c", "--channel", type="string", dest="channel",
+ help="Dest channel for cloning.")
+ parser.add_option("-b", "--begin-date", type="string", dest="bdate",
+ 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)")
+ parser.add_option("-n", "--named-errata", type="string", dest="errata",
+ help="Name of errata: (RHSA-XXXX:XXXX:XX-XX)")
+ parser.add_option("-r", "--pattern", type="string", dest="pattern",
+ help="Name pattern of errata: (RHSA, 2005, Foo)")
+ 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
+
+def main():
+ global chanMap
+ global chanSuffixMap
+ global RHNServer
+ global RHNUser
+ global RHNPass
+ global options
+
+ options = parse_args()
+
+ if (options.server and options.login and options.passwd) is None:
+ print "try: "+sys.argv[0]+" --help"
+ sys.exit(2)
+
+# I don't reckon this should change anytime soon...
+#
+ svrRHN = 'rhn.redhat.com'
+
+# Ok, configure your RHN credentials here...
+#
+ userRHN = 'wsuadmin'
+ passRHN = 'W$youAdm'
+
+# Here we setup our mappings from RHN to Local software channels.
+# Set these to what you have created for your SPW.
+# They are paired as:
+#
+# RHNChannel: SPWChannel
+#
+
+ chanMapRHN = {
+ 'rhel-x86_64-server-5': 'rhel-x86_64-server-5',
+ 'rhel-x86_64-server-rhntools-5': 'rhn-tools-rhel-x86_64-server-5',
+ 'rhel-x86_64-server-productivity-5': 'rhel-x86_64-server-productivity-5',
+ 'rhel-x86_64-server-supplementary-5': 'rhel-x86_64-server-supplementary-5',
+ 'rhel-x86_64-server-vt-5': 'rhel-x86_64-server-vt-5',
+ 'rhel-i386-server-5': 'rhel-i386-server-5',
+ 'rhel-i386-server-rhntools-5': 'rhn-tools-rhel-i386-server-5',
+ 'rhel-i386-server-productivity-5': 'rhel-i386-server-productivity-5',
+ 'rhel-i386-server-supplementary-5': 'rhel-i386-server-supplementary-5',
+ 'rhel-i386-server-vt-5': 'rhel-i386-server-vt-5',
+ 'rhel-x86_64-server-4': 'rhel-x86_64-as-4',
+ 'rhel-x86_64-server-extras-4': 'rhel-x86_64-as-4-extras',
+ 'rhel-x86_64-server-rhntools-4': 'rhn-tools-rhel-4-as-x86_64',
+ 'rhel-i386-server-4': 'rhel-i386-as-4',
+ 'rhel-i386-server-extras-4': 'rhel-i386-as-4-extras',
+ 'rhel-i386-server-rhntools-4': 'rhn-tools-rhel-4-as-i386'
+ };
+
+# Here I setup the production to authoritative channel mapping...
+
+ chanMapSPW = {
+ 'rhel-x86_64-server-prod-5-3': 'rhel-x86_64-server-5',
+ 'rhel-x86_64-server-rhntools-prod-5-3': 'rhel-x86_64-server-rhntools-5',
+ 'rhel-x86_64-server-productivity-prod-5-3': 'rhel-x86_64-server-productivity-5',
+ 'rhel-x86_64-server-supplementary-prod-5-3': 'rhel-x86_64-server-supplementary-5',
+ 'rhel-x86_64-server-vt-prod-5-3': 'rhel-x86_64-server-vt-5',
+ 'rhel-i386-server-prod-5-3': 'rhel-i386-server-5',
+ 'rhel-i386-server-rhntools-prod-5-3': 'rhel-i386-server-rhntools-5',
+ 'rhel-i386-server-productivity-prod-5-3': 'rhel-i386-server-productivity-5',
+ 'rhel-i386-server-supplementary-prod-5-3': 'rhel-i386-server-supplementary-5',
+ 'rhel-i386-server-vt-prod-5-3': 'rhel-i386-server-vt-5',
+ 'rhel-x86_64-server-prod-4-7': 'rhel-x86_64-server-4',
+ 'rhel-x86_64-server-extras-prod-4-7': 'rhel-x86_64-server-extras-4',
+ 'rhel-x86_64-server-rhntools-prod-4-7': 'rhel-x86_64-server-rhntools-4',
+ 'rhel-i386-server-prod-4-7': 'rhel-i386-server-4',
+ 'rhel-i386-server-extras-prod-4-7': 'rhel-i386-server-extras-4',
+ 'rhel-i386-server-rhntools-prod-4-7': 'rhel-i386-server-rhntools-4'
+ };
+
+# 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.
+#
+# RHNChannel: ErrataSuffix
+#
+ chanSuffixMap = {
+ 'rhel-x86_64-server-5': 'R5-64',
+ 'rhn-tools-rhel-x86_64-server-5': 'R5-64-T',
+ 'rhel-x86_64-server-productivity-5': 'R5-64-P',
+ 'rhel-x86_64-server-supplementary-5': 'R5-64-S',
+ 'rhel-x86_64-server-vt-5': 'R5-64-V',
+ 'rhel-i386-server-5': 'R5-32',
+ 'rhn-tools-rhel-i386-server-5': 'R5-32-T',
+ 'rhel-i386-server-productivity-5': 'R5-32-P',
+ 'rhel-i386-server-supplementary-5': 'R5-32-S',
+ 'rhel-i386-server-vt-5': 'R5-32-V',
+ 'rhel-x86_64-as-4': 'R4-64',
+ 'rhel-x86_64-as-4-extras': 'R4-64-E',
+ 'rhn-tools-rhel-4-as-x86_64': 'R4-64-T',
+ 'rhel-i386-as-4': 'R4-32',
+ 'rhel-i386-as-4-extras': 'R4-32-E',
+ 'rhn-tools-rhel-4-as-i386': 'R4-32-T'
+ };
+
+ if chanMapSPW[options.channel] is None:
+ print "Invalid Channel!"
+ sys.exit(2)
+
+ mySPW = SPWServer(options.server,options.login,options.passwd)
+
+ dateStart = options.bdate or '19000101'
+ dateEnd = options.edate or strftime("%Y%m%d", localtime())
+
+ errList = []
+
+ if options.errata:
+ errList = [ options.errata ]
+
+ if options.pattern:
+ for spwErrata in mySPW.listChannelErrata(chanMapSPW[options.channel],0):
+ if re.search (options.pattern, spwErrata['advisory_name']):
+ errList.append (spwErrata['advisory_name'])
+
+ if options.bdate or options.edate:
+ myRHN = RHNServer(svrRHN,userRHN,passRHN)
+ chanRHN = chanMapRHN[chanMapSPW[options.channel]]
+
+ for rhnErrata in myRHN.listChannelErrata(chanRHN,dateStart,dateEnd,0):
+ errName = rhnErrata['errata_advisory'] + ":" + chanSuffixMap[chanRHN]
+ errList.append (errName)
+
+ for spwErr in errList:
+ print spwErr
+
+ spwClone = re.sub ('RH[BES]A', 'CLA', spwErr)
+ spwCloneCheck = mySPW.getErrataDetails (spwClone, 0)
+
+ if spwCloneCheck:
+ print "\tErrata Already Cloned: %s - %s" % (spwClone, spwCloneCheck['synopsis'])
+ continue
+
+ spwErrClone = mySPW.errataClone (options.channel, [ spwErr ], 0)
+
+ if spwErrClone:
+ print "\tErrata Cloned:\t%s - %s" % (spwErrClone[0]['advisory_name'], spwErrClone[0]['advisory_synopsis'])
+ else:
+ print "\tErrata NOT Cloned! - Some Error Occurred."
+
+if __name__ == "__main__":
+ main()
14 years, 3 months
backend/server
by Michael Mraka
backend/server/importlib/backendLib.py | 2 ++
1 file changed, 2 insertions(+)
New commits:
commit 1561c9278dca728a67d3c22505d64075553260e9
Author: Joshua Roys <joshua.roys(a)gtri.gatech.edu>
Date: Wed Jan 20 11:38:56 2010 -0500
528214 - Encode DBstrings as utf-8 bytes before truncating
If they are left as utf-8 strings and not converted to their
corresponding byte sequence, python treats a multi-byte utf-8
character as one unit. This causes confusion for things like
splices, especially the one right below this patch; that splice
tries to limit the length of the string to the maximum supported
by the database schema, but fails to do so as it is operating on
a utf-8 string rather than a byte string.
Side note: NLS_LANG must be set to an appropriate utf-8 locale.
diff --git a/backend/server/importlib/backendLib.py b/backend/server/importlib/backendLib.py
index b7e4145..1166892 100644
--- a/backend/server/importlib/backendLib.py
+++ b/backend/server/importlib/backendLib.py
@@ -464,6 +464,8 @@ def sanitizeValue(value, datatype):
if isinstance(datatype, DBstring):
if value is None:
value = ''
+ elif isinstance(value, unicode):
+ value = unicode.encode(value, 'utf-8')
return value[:datatype.limit]
if isinstance(datatype, DBblob):
if value is None:
14 years, 3 months
Changes to 'refs/tags/spacewalk-backend-0.8.33-1'
by Michael Mraka
Tag 'spacewalk-backend-0.8.33-1' created by Michael Mraka <michael.mraka(a)redhat.com> at 2010-01-20 16:38 +0000
Tagging package [spacewalk-backend] version [0.8.33-1] in directory [backend/].
Changes since rhnlib-2.5.19-1:
Michael Mraka (7):
removed dead code; oldest supported is RHEL4 / Python 2.3.4
removed dead code; oldest supported is RHEL4 / rpm-pyhton 4.3.3
removed always true conditions
made code more readable
replaced evil use of getattr
fixed payload_size always = 0 error
Automatic commit of package [spacewalk-backend] release [0.8.33-1].
---
backend/spacewalk-backend.spec | 6 +-
backend/spacewalk/common/rhn_rpm.py | 98 +++++++++---------------------------
rel-eng/packages/spacewalk-backend | 2
3 files changed, 33 insertions(+), 73 deletions(-)
---
14 years, 3 months
7 commits - backend/spacewalk backend/spacewalk-backend.spec rel-eng/packages
by Michael Mraka
backend/spacewalk-backend.spec | 6 +-
backend/spacewalk/common/rhn_rpm.py | 98 +++++++++---------------------------
rel-eng/packages/spacewalk-backend | 2
3 files changed, 33 insertions(+), 73 deletions(-)
New commits:
commit 1540ce542c88df92fb4c575cb97ac04d5667eab8
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 17:38:10 2010 +0100
Automatic commit of package [spacewalk-backend] release [0.8.33-1].
diff --git a/backend/spacewalk-backend.spec b/backend/spacewalk-backend.spec
index 614dde3..37b09be 100644
--- a/backend/spacewalk-backend.spec
+++ b/backend/spacewalk-backend.spec
@@ -8,7 +8,7 @@ Name: spacewalk-backend
Summary: Common programs needed to be installed on the Spacewalk servers/proxies
Group: Applications/Internet
License: GPLv2
-Version: 0.8.32
+Version: 0.8.33
Release: 1%{?dist}
URL: https://fedorahosted.org/spacewalk
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
@@ -609,6 +609,10 @@ rm -f %{rhnconf}/rhnSecret.py*
# $Id$
%changelog
+* Wed Jan 20 2010 Michael Mraka <michael.mraka(a)redhat.com> 0.8.33-1
+- fixed payload_size always = 0 error
+- removed dead code in rhn_rpm.py
+
* Tue Jan 19 2010 Michael Mraka <michael.mraka(a)redhat.com> 0.8.32-1
- 556460 - time values are <long> on Fedora 12
- fixed DeprecationWarnings on Fedora 12
diff --git a/rel-eng/packages/spacewalk-backend b/rel-eng/packages/spacewalk-backend
index 58d24bd..20c7c28 100644
--- a/rel-eng/packages/spacewalk-backend
+++ b/rel-eng/packages/spacewalk-backend
@@ -1 +1 @@
-0.8.32-1 backend/
+0.8.33-1 backend/
commit a6f4a83c53c1bb5431df14dc21e17f9cb4cfcacf
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 17:28:19 2010 +0100
fixed payload_size always = 0 error
it reverted code which fixed bz 487621, read the comment in case of
regression
diff --git a/backend/spacewalk/common/rhn_rpm.py b/backend/spacewalk/common/rhn_rpm.py
index 72ef2dc..2c6cbe4 100644
--- a/backend/spacewalk/common/rhn_rpm.py
+++ b/backend/spacewalk/common/rhn_rpm.py
@@ -257,11 +257,19 @@ def get_package_header(filename=None, file=None, fd=None):
else:
file_desc = f.fileno()
- if hasattr(rpm, 'readHeaderFromFD'):
- header_start, header_end = \
- get_header_byte_range(os.fdopen(os.dup(file_desc)))
- os.lseek(file_desc, header_start, 0)
- hdr, offset = rpm.readHeaderFromFD(file_desc)
+# FIXME:
+ if None:
+ pass
+# - readHeaderFromFD() doesn't set hdr['archivesize'] which makes payload_size = 0
+# for all imported packages
+# - this code was introduced as a fix of bz 487621; if it re-appears then uncomment
+# and try to fix missing hdr['archivesize'] another way
+# #if hasattr(rpm, 'readHeaderFromFD'):
+#
+# header_start, header_end = \
+# get_header_byte_range(os.fdopen(os.dup(file_desc)))
+# os.lseek(file_desc, header_start, 0)
+# hdr, offset = rpm.readHeaderFromFD(file_desc)
else:
# RHEL-4 and older, do the old way
ts = RPMReadOnlyTransaction()
commit 126984919993cfd02128fae2d7fee7af22728865
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 14:02:50 2010 +0100
replaced evil use of getattr
diff --git a/backend/spacewalk/common/rhn_rpm.py b/backend/spacewalk/common/rhn_rpm.py
index 5af1725..72ef2dc 100644
--- a/backend/spacewalk/common/rhn_rpm.py
+++ b/backend/spacewalk/common/rhn_rpm.py
@@ -265,14 +265,12 @@ def get_package_header(filename=None, file=None, fd=None):
else:
# RHEL-4 and older, do the old way
ts = RPMReadOnlyTransaction()
- nomd5 = getattr(rpm, 'RPMVSF_NOMD5')
- needpayload = getattr(rpm, 'RPMVSF_NEEDPAYLOAD')
- ts.pushVSFlags(~(nomd5 | needpayload))
+ ts.pushVSFlags(~(rpm.RPMVSF_NOMD5 | rpm.RPMVSF_NEEDPAYLOAD))
hdr = RPMReadOnlyTransaction().hdrFromFdno(file_desc)
ts.popVSFlags()
if hdr is None:
raise InvalidPackageError
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
+ is_source = hdr[rpm.RPMTAG_SOURCEPACKAGE]
return RPM_Header(hdr, is_source)
@@ -303,13 +301,13 @@ class MatchIterator:
if hdr is None:
return None
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
+ is_source = hdr[rpm.RPMTAG_SOURCEPACKAGE]
return RPM_Header(hdr, is_source)
def headerLoad(data):
hdr = rpm.headerLoad(data)
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
+ is_source = hdr[rpm.RPMTAG_SOURCEPACKAGE]
return RPM_Header(hdr, is_source)
def labelCompare(t1, t2):
commit 588f6850ea4162f2b9ec13f3c33208e2110be5b1
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 10:14:00 2010 +0100
made code more readable
diff --git a/backend/spacewalk/common/rhn_rpm.py b/backend/spacewalk/common/rhn_rpm.py
index 8efc2d1..5af1725 100644
--- a/backend/spacewalk/common/rhn_rpm.py
+++ b/backend/spacewalk/common/rhn_rpm.py
@@ -78,30 +78,25 @@ class RPMTransaction:
# easier
def pushVSFlags(self, flags):
self.tsflags.append(flags)
- f = getattr(self.ts, 'setVSFlags')
- f(self.tsflags[-1])
+ self.ts.setVSFlags(self.tsflags[-1])
def popVSFlags(self):
del self.tsflags[-1]
- f = getattr(self.ts, 'setVSFlags')
- f(self.tsflags[-1])
+ self.ts.setVSFlags(self.tsflags[-1])
def addInstall(self, arg1, arg2, mode):
"""Install a package"""
hdr = arg1.hdr
- f = getattr(self.ts, 'addInstall')
- return f(hdr, arg2, mode)
+ return self.ts.addInstall(hdr, arg2, mode)
def addErase(self, arg1):
"""Erase a package"""
hdr = arg1.hdr
- f = getattr(self.ts, 'addErase')
- return f(hdr)
+ return self.ts.addErase(hdr)
def check(self):
"""Check dependencies"""
- f = getattr(self.ts, 'check')
- return f()
+ return self.ts.check()
def setFlags(self, flag):
"""Set transaction flags"""
commit 9f689f920e4244d59b4ce6ec1bcc8099e92b98d1
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 10:09:25 2010 +0100
removed always true conditions
diff --git a/backend/spacewalk/common/rhn_rpm.py b/backend/spacewalk/common/rhn_rpm.py
index 5275b69..8efc2d1 100644
--- a/backend/spacewalk/common/rhn_rpm.py
+++ b/backend/spacewalk/common/rhn_rpm.py
@@ -78,38 +78,29 @@ class RPMTransaction:
# easier
def pushVSFlags(self, flags):
self.tsflags.append(flags)
- if hasattr(self.ts, 'setVSFlags'):
- f = getattr(self.ts, 'setVSFlags')
- f(self.tsflags[-1])
+ f = getattr(self.ts, 'setVSFlags')
+ f(self.tsflags[-1])
def popVSFlags(self):
del self.tsflags[-1]
- if hasattr(self.ts, 'setVSFlags'):
- f = getattr(self.ts, 'setVSFlags')
- f(self.tsflags[-1])
+ f = getattr(self.ts, 'setVSFlags')
+ f(self.tsflags[-1])
def addInstall(self, arg1, arg2, mode):
"""Install a package"""
hdr = arg1.hdr
- if hasattr(self.ts, 'addInstall'):
- f = getattr(self.ts, 'addInstall')
- return f(hdr, arg2, mode)
- return self.ts.add(hdr, arg2, mode)
+ f = getattr(self.ts, 'addInstall')
+ return f(hdr, arg2, mode)
def addErase(self, arg1):
"""Erase a package"""
hdr = arg1.hdr
- if hasattr(self.ts, 'addErase'):
- f = getattr(self.ts, 'addErase')
- return f(hdr)
- return self.ts.add(hdr, hdr, "e")
+ f = getattr(self.ts, 'addErase')
+ return f(hdr)
def check(self):
"""Check dependencies"""
- if hasattr(self.ts, 'check'):
- f = getattr(self.ts, 'check')
- else:
- f = getattr(self.ts, 'depcheck')
+ f = getattr(self.ts, 'check')
return f()
def setFlags(self, flag):
commit 26b3ade9ce5f7d813d7efa94892bce6ff6dfe407
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 10:00:09 2010 +0100
removed dead code; oldest supported is RHEL4 / rpm-pyhton 4.3.3
diff --git a/backend/spacewalk/common/rhn_rpm.py b/backend/spacewalk/common/rhn_rpm.py
index 82e624f..5275b69 100644
--- a/backend/spacewalk/common/rhn_rpm.py
+++ b/backend/spacewalk/common/rhn_rpm.py
@@ -62,15 +62,8 @@ class InvalidPackageError(Exception):
class RPMTransaction:
read_only = 0
def __init__(self):
- if hasattr(rpm, 'opendb'):
- db = getattr(rpm, 'opendb')(not self.read_only)
- self.ts = rpm.TransactionSet('/', db)
- else:
- self.ts = rpm.TransactionSet()
+ self.ts = rpm.TransactionSet()
self.tsflags = []
- # For rpm 4.0.4
- self._flags = 0
- self._prob_filter = 0
def __getattr__(self, attr):
return getattr(self.ts, attr)
@@ -121,27 +114,13 @@ class RPMTransaction:
def setFlags(self, flag):
"""Set transaction flags"""
- if hasattr(rpm, 'headerFromPackage'):
- # Old style rpm
- old_flags = self._flags
- self._flags = flag
- return old_flags
return self.ts.setFlags(flag)
def setProbFilter(self, flag):
"""Set problem flags"""
- if hasattr(rpm, 'headerFromPackage'):
- # Old style rpm
- old_flags = self._prob_filter
- self._prob_filter = flag
- return old_flags
return self.ts.setProbFilter(flag)
def run(self, callback, user_data):
- if hasattr(rpm, 'headerFromPackage'):
- # Old style rpm
- return self.ts.run(self._flags, self._prob_filter, callback,
- user_data)
return self.ts.run(callback, user_data)
@@ -317,15 +296,10 @@ class MatchIterator:
if not tag_name:
tag_name = "name"
- if hasattr(rpm, "headerFromPackage"):
- # rpm 4.0.4 or earlier
- self.db = rpm.opendb()
- method = self.db.match
- else:
- # rpm 4.1 or later
- self.ts = rpm.TransactionSet()
- self.ts.setVSFlags(8)
- method = self.ts.dbMatch
+ # rpm 4.1 or later
+ self.ts = rpm.TransactionSet()
+ self.ts.setVSFlags(8)
+ method = self.ts.dbMatch
if value:
self.mi = method(tag_name, value)
@@ -343,19 +317,13 @@ class MatchIterator:
if hdr is None:
return None
- if hasattr(rpm, "headerFromPackage"):
- is_source = not hdr[rpm.RPMTAG_SOURCERPM]
- else:
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
+ is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
return RPM_Header(hdr, is_source)
def headerLoad(data):
hdr = rpm.headerLoad(data)
- if hasattr(rpm, "headerFromPackage"):
- is_source = not hdr[rpm.RPMTAG_SOURCERPM]
- else:
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
+ is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
return RPM_Header(hdr, is_source)
def labelCompare(t1, t2):
commit b0fd5532a2bff4e6270a70f720cfc4759aba77db
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Wed Jan 20 09:49:02 2010 +0100
removed dead code; oldest supported is RHEL4 / Python 2.3.4
diff --git a/backend/spacewalk/common/rhn_rpm.py b/backend/spacewalk/common/rhn_rpm.py
index 06a5995..82e624f 100644
--- a/backend/spacewalk/common/rhn_rpm.py
+++ b/backend/spacewalk/common/rhn_rpm.py
@@ -19,10 +19,6 @@ import rpm
import struct
import exceptions
-if not hasattr(exceptions, 'StopIteration'):
- # Presumably python 1.5.2
- class StopIteration(Exception):
- pass
# Expose a bunch of useful constants from rpm
error = rpm.error
14 years, 3 months
Changes to 'refs/tags/rhnlib-2.5.19-1'
by Miroslav Suchý
Tag 'rhnlib-2.5.19-1' created by Miroslav Suchý <msuchy(a)redhat.com> at 2010-01-20 13:39 +0000
Tagging package [rhnlib] version [2.5.19-1] in directory [client/rhel/rhnlib/].
Changes since spacewalk-backend-0.8.32-1:
Justin Sherrill (2):
small fix that was keeping package remove from working correctly
fixing some sloppy code
Michael Mraka (1):
removed dead code - headerFromPackage() is more then 7 years dead
Miroslav Suchý (1):
Automatic commit of package [rhnlib] release [2.5.19-1].
Tomas Lestach (2):
493176 - introducing kickstart.tree.getDetails API call
fixed UserHandlerTest CreateOrgCommandTest
---
backend/spacewalk/common/rhn_rpm.py | 35 ++++------
client/rhel/rhnlib/rhnlib.spec | 5 +
java/code/src/com/redhat/rhn/frontend/xmlrpc/kickstart/tree/KickstartTreeHandler.java | 24 ++++++
java/code/src/com/redhat/rhn/manager/channel/ChannelEditor.java | 4 -
java/code/src/com/redhat/rhn/manager/user/CreateUserCommand.java | 14 ++--
rel-eng/packages/rhnlib | 2
6 files changed, 54 insertions(+), 30 deletions(-)
---
14 years, 3 months
client/rhel rel-eng/packages
by Miroslav Suchý
client/rhel/rhnlib/rhnlib.spec | 5 ++++-
rel-eng/packages/rhnlib | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
New commits:
commit 3c9f53701844de38ee6469bdbc2c6fa138c7362f
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Wed Jan 20 14:39:08 2010 +0100
Automatic commit of package [rhnlib] release [2.5.19-1].
diff --git a/client/rhel/rhnlib/rhnlib.spec b/client/rhel/rhnlib/rhnlib.spec
index 0242fb6..f723523 100644
--- a/client/rhel/rhnlib/rhnlib.spec
+++ b/client/rhel/rhnlib/rhnlib.spec
@@ -4,7 +4,7 @@ Summary: Python libraries for the RHN project
Name: rhnlib
URL: https://fedorahosted.org/spacewalk
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
-Version: 2.5.18
+Version: 2.5.19
Release: 1%{?dist}
Group: Development/Libraries
@@ -54,6 +54,9 @@ rm -rf $RPM_BUILD_ROOT
%{python_sitelib}/*
%changelog
+* Wed Jan 20 2010 Miroslav Suchý <msuchy(a)redhat.com> 2.5.19-1
+- code cleanup
+
* Mon Dec 07 2009 Michael Mraka <michael.mraka(a)redhat.com> 2.5.18-1
- moved code from rhnlib to spacewalk-backend-libs
diff --git a/rel-eng/packages/rhnlib b/rel-eng/packages/rhnlib
index 6fd34c7..2ac1e48 100644
--- a/rel-eng/packages/rhnlib
+++ b/rel-eng/packages/rhnlib
@@ -1 +1 @@
-2.5.18-1 client/rhel/rhnlib/
+2.5.19-1 client/rhel/rhnlib/
14 years, 3 months