rel-eng/packages spacewalk/certs-tools
by Michael Mraka
rel-eng/packages/spacewalk-certs-tools | 2 +-
spacewalk/certs-tools/spacewalk-certs-tools.spec | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
New commits:
commit 8cba6199ddf9aa5a966570aa7c66e90acec44caf
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:39:50 2009 +0100
Automatic commit of package [spacewalk-certs-tools] release [0.8.1-1].
diff --git a/rel-eng/packages/spacewalk-certs-tools b/rel-eng/packages/spacewalk-certs-tools
index cb1efef..b7c0748 100644
--- a/rel-eng/packages/spacewalk-certs-tools
+++ b/rel-eng/packages/spacewalk-certs-tools
@@ -1 +1 @@
-0.7.2-1 spacewalk/certs-tools/
+0.8.1-1 spacewalk/certs-tools/
diff --git a/spacewalk/certs-tools/spacewalk-certs-tools.spec b/spacewalk/certs-tools/spacewalk-certs-tools.spec
index 385647b..3f882d1 100644
--- a/spacewalk/certs-tools/spacewalk-certs-tools.spec
+++ b/spacewalk/certs-tools/spacewalk-certs-tools.spec
@@ -2,7 +2,7 @@ Name: spacewalk-certs-tools
Summary: Spacewalk SSL Key/Cert Tool
Group: Applications/Internet
License: GPLv2 and Python
-Version: 0.8.0
+Version: 0.8.1
Release: 1%{?dist}
URL: https://fedorahosted.org/spacewalk
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
@@ -56,6 +56,10 @@ rm -rf $RPM_BUILD_ROOT
%{_var}/www/html/pub/bootstrap/client_config_update.py*
%changelog
+* Fri Dec 04 2009 Michael Mraka <michael.mraka(a)redhat.com> 0.8.1-1
+- rhn_rpm/rhn_mpm moved to rhnlib
+- bumping Version to 0.8.0
+
* Wed Nov 18 2009 Miroslav Suchý <msuchy(a)redhat.com> 0.7.2-1
- 538046 - Polish the spec according Fedora Packaging Guidelines
14 years, 4 months
Changes to 'refs/tags/spacewalk-backend-0.8.1-1'
by Michael Mraka
Tag 'spacewalk-backend-0.8.1-1' created by Michael Mraka <michael.mraka(a)redhat.com> at 2009-12-04 11:38 +0000
Tagging package [spacewalk-backend] version [0.8.1-1] in directory [backend/].
Changes since rhnpush-5.4.3-1:
Michael Mraka (1):
Automatic commit of package [spacewalk-backend] release [0.8.1-1].
---
backend/spacewalk-backend.spec | 6 +++++-
rel-eng/packages/spacewalk-backend | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
---
14 years, 4 months
backend/spacewalk-backend.spec rel-eng/packages
by Michael Mraka
backend/spacewalk-backend.spec | 6 +++++-
rel-eng/packages/spacewalk-backend | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
New commits:
commit 6ac069011e647b8834ca4fe0a94def443bd5572e
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:38:29 2009 +0100
Automatic commit of package [spacewalk-backend] release [0.8.1-1].
diff --git a/backend/spacewalk-backend.spec b/backend/spacewalk-backend.spec
index c841239..f0ca787 100644
--- a/backend/spacewalk-backend.spec
+++ b/backend/spacewalk-backend.spec
@@ -7,7 +7,7 @@ Name: spacewalk-backend
Summary: Common programs needed to be installed on the Spacewalk servers/proxies
Group: Applications/Internet
License: GPLv2
-Version: 0.8.0
+Version: 0.8.1
Release: 1%{?dist}
URL: https://fedorahosted.org/spacewalk
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
@@ -578,6 +578,10 @@ rm -f %{rhnconf}/rhnSecret.py*
# $Id$
%changelog
+* Fri Dec 04 2009 Michael Mraka <michael.mraka(a)redhat.com> 0.8.1-1
+- rhn_rpm/rhn_mpm moved to rhnlib
+- bumping Version to 0.8.0
+
* Tue Dec 1 2009 Miroslav Suchý <msuchy(a)redhat.com> 0.7.18-1
- 449167 - time.strptime can not handle None values
diff --git a/rel-eng/packages/spacewalk-backend b/rel-eng/packages/spacewalk-backend
index 456a29d..42d30cc 100644
--- a/rel-eng/packages/spacewalk-backend
+++ b/rel-eng/packages/spacewalk-backend
@@ -1 +1 @@
-0.7.18-1 backend/
+0.8.1-1 backend/
14 years, 4 months
Changes to 'refs/tags/rhnpush-5.4.3-1'
by Michael Mraka
Tag 'rhnpush-5.4.3-1' created by Michael Mraka <michael.mraka(a)redhat.com> at 2009-12-04 11:37 +0000
Tagging package [rhnpush] version [5.4.3-1] in directory [client/tools/rhnpush/].
Changes since rhnlib-2.5.16-1:
Michael Mraka (2):
rhn_rpm/rhn_mpm merge: fixed minimal version of rhnlib
Automatic commit of package [rhnpush] release [5.4.3-1].
---
backend/spacewalk-backend.spec | 2 +-
client/tools/rhnpush/rhnpush.spec | 7 +++++--
rel-eng/packages/rhnpush | 2 +-
spacewalk/certs-tools/spacewalk-certs-tools.spec | 2 +-
4 files changed, 8 insertions(+), 5 deletions(-)
---
14 years, 4 months
2 commits - backend/spacewalk-backend.spec client/tools rel-eng/packages spacewalk/certs-tools
by Michael Mraka
backend/spacewalk-backend.spec | 2 +-
client/tools/rhnpush/rhnpush.spec | 7 +++++--
rel-eng/packages/rhnpush | 2 +-
spacewalk/certs-tools/spacewalk-certs-tools.spec | 2 +-
4 files changed, 8 insertions(+), 5 deletions(-)
New commits:
commit 1e42f80a10cfd3e60f9b1369b7a24a4a71487a74
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:37:39 2009 +0100
Automatic commit of package [rhnpush] release [5.4.3-1].
diff --git a/client/tools/rhnpush/rhnpush.spec b/client/tools/rhnpush/rhnpush.spec
index 64212df..10b8318 100644
--- a/client/tools/rhnpush/rhnpush.spec
+++ b/client/tools/rhnpush/rhnpush.spec
@@ -5,7 +5,7 @@ Summary: Common programs needed to be installed on the RHN servers/proxies
Group: Applications/System
License: GPLv2
URL: http://fedorahosted.org/spacewalk
-Version: 5.4.2
+Version: 5.4.3
Release: 1%{?dist}
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -49,6 +49,9 @@ rm -rf $RPM_BUILD_ROOT
%{_mandir}/man8/solaris2mpm.8*
%changelog
+* Fri Dec 04 2009 Michael Mraka <michael.mraka(a)redhat.com> 5.4.3-1
+- rhn_rpm/rhn_mpm moved to rhnlib
+
* Thu Jun 25 2009 John Matthews <jmatthew(a)redhat.com> 5.4.2-1
- merging missed chances from previous commit (pkilambi(a)redhat.com)
- removing unused modules and some clean up (pkilambi(a)redhat.com)
diff --git a/rel-eng/packages/rhnpush b/rel-eng/packages/rhnpush
index 48880cc..1f00051 100644
--- a/rel-eng/packages/rhnpush
+++ b/rel-eng/packages/rhnpush
@@ -1 +1 @@
-5.4.2-1 client/tools/rhnpush/
+5.4.3-1 client/tools/rhnpush/
commit 5f6d1d8dab580096e6ef876a47e814010bef612f
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:36:24 2009 +0100
rhn_rpm/rhn_mpm merge: fixed minimal version of rhnlib
diff --git a/backend/spacewalk-backend.spec b/backend/spacewalk-backend.spec
index 309fddb..c841239 100644
--- a/backend/spacewalk-backend.spec
+++ b/backend/spacewalk-backend.spec
@@ -16,7 +16,7 @@ BuildArch: noarch
Requires: python, rpm-python
# /etc/rhn is provided by spacewalk-proxy-common or by spacewalk-config
Requires: /etc/rhn
-Requires: rhnlib >= 2.2.16
+Requires: rhnlib >= 2.5.16
BuildRequires: /usr/bin/msgfmt
BuildRequires: /usr/bin/docbook2man
BuildRequires: docbook-utils
diff --git a/client/tools/rhnpush/rhnpush.spec b/client/tools/rhnpush/rhnpush.spec
index 4bcdf37..64212df 100644
--- a/client/tools/rhnpush/rhnpush.spec
+++ b/client/tools/rhnpush/rhnpush.spec
@@ -10,7 +10,7 @@ Release: 1%{?dist}
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
-Requires: rpm-python, rhnlib >= 2.2.16
+Requires: rpm-python, rhnlib >= 2.5.16
BuildRequires: docbook-utils, gettext
Summary: Package uploader for the Red Hat Network Satellite Server
diff --git a/spacewalk/certs-tools/spacewalk-certs-tools.spec b/spacewalk/certs-tools/spacewalk-certs-tools.spec
index 3ac18e5..385647b 100644
--- a/spacewalk/certs-tools/spacewalk-certs-tools.spec
+++ b/spacewalk/certs-tools/spacewalk-certs-tools.spec
@@ -10,7 +10,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
Requires: openssl rpm-build
Requires: rhn-client-tools
-Requires: rhnlib >= 2.2.16
+Requires: rhnlib >= 2.5.16
BuildRequires: docbook-utils
BuildRequires: python
Obsoletes: rhns-certs < 5.3.0
14 years, 4 months
Changes to 'refs/tags/rhnlib-2.5.16-1'
by Michael Mraka
Tag 'rhnlib-2.5.16-1' created by Michael Mraka <michael.mraka(a)redhat.com> at 2009-12-04 11:33 +0000
Tagging package [rhnlib] version [2.5.16-1] in directory [client/rhel/rhnlib/].
Changes since spacewalk-java-0.7.24-1:
Flavio Leitner (1):
543577 - report permanent hw addr for all slaves in network bonding
Jan Pazdziora (1):
543543 - require latest hal, to get full / correct DMI Info.
Justin Sherrill (3):
529483 - adding referer check for HTTP requests to java stack
updating configchannel.createOrUpdatePath to include documentation about Selinux, and make it optional
529483 - adding referer check to perl stack
Michael Mraka (15):
replaced installPackages.py & company with several lines in perl
rhn_rpm/rhn_mpm merge: added rhn_rpm.py to rhnlib
rhn_rpm/rhn_mpm merge: added common subdir into rpm package
rhn_rpm/rhn_mpm merge: added rhn_mpm.py to rhnlib
rhn_rpm/rhn_mpm merge: let backend use rhn_rpm/rhn_mpm from rhnlib
rhn_rpm/rhn_mpm merge: fixed spec to reflect rhn_rpm/rhn_mpm move
rhn_rpm/rhn_mpm merge: fixed list of files in Makefile
rhn_rpm/rhn_mpm merge: let certs-tools use rhn_rpm from rhnlib
rhn_rpm/rhn_mpm merge: fixed spec and Makefile to reflect rhn_rpm move
rhn_rpm/rhn_mpm merge: remove copy of rhn_rpm from certs-tools
rhn_rpm/rhn_mpm merge: merged changes from rhnpush/rhn_mpm.py
rhn_rpm/rhn_mpm merge: let rhnpush use rhn_rpm/rhn_mpm from rhnlib
rhn_rpm/rhn_mpm merge: fixed spec and Makefile to reflect rhn_rpm move
fixed rpmlint error: rhnlib.noarch: E: non-executable-script /usr/lib/python2.6/site-packages/rhn/common/rhn_rpm.py 0644 /usr/bin/python
Automatic commit of package [rhnlib] release [2.5.16-1].
Milan Zazrivec (1):
send an empty list rather than empty hash
Miroslav Suchý (5):
add contributed script apply_errata
bumping Version to 0.8.0
216808 - polish man page
216808 - if username and password is not given on command line, script will prompt for it
nightly is now build to 0.8-candidate tags
---
backend/common/Makefile | 2
backend/common/rhnRepository.py | 2
backend/common/rhn_mpm.py | 278 ------
backend/common/rhn_rpm.py | 429 ----------
backend/satellite_tools/reposync.py | 5
backend/satellite_tools/satCerts.py | 2
backend/satellite_tools/satComputePkgHeaders.py | 2
backend/satellite_tools/satsync.py | 3
backend/satellite_tools/updatePackages.py | 3
backend/server/basePackageUpload.py | 2
backend/server/handlers/app/rhn_mpm.py | 2
backend/server/handlers/applet/applet.py | 4
backend/server/handlers/xmlrpc/up2date.py | 3
backend/server/handlers/xp/rhnlint.py | 3
backend/server/importlib/backend.py | 3
backend/server/importlib/packageUpload.py | 3
backend/server/rhnChannel.py | 3
backend/server/rhnPackageUpload.py | 2
backend/server/rhnServer/server_class.py | 3
backend/server/rhnServer/server_packages.py | 3
backend/spacewalk-backend.spec | 6
branding/spacewalk-branding.spec | 2
client/rhel/rhn-client-tools/man/en/spacewalk-channel.8 | 22
client/rhel/rhn-client-tools/rhn-client-tools.spec | 4
client/rhel/rhn-client-tools/src/bin/rhnreg_ks.py | 2
client/rhel/rhn-client-tools/src/bin/spacewalk-channel.py | 7
client/rhel/rhn-client-tools/src/up2date_client/hardware.py | 31
client/rhel/rhnlib/rhn/common/rhn_mpm.py | 283 ++++++
client/rhel/rhnlib/rhn/common/rhn_rpm.py | 428 +++++++++
client/rhel/rhnlib/rhnlib.spec | 5
client/rhel/rhnlib/setup.py.in | 2
client/rhel/yum-rhn-plugin/yum-rhn-plugin.spec | 2
client/tools/rhnpush/Makefile.rhnpush | 2
client/tools/rhnpush/connection.py | 2
client/tools/rhnpush/rhn_mpm.py | 289 ------
client/tools/rhnpush/rhn_rpm.py | 370 --------
client/tools/rhnpush/rhnpush.py | 2
client/tools/rhnpush/rhnpush.spec | 2
client/tools/rhnpush/rpm2mpm.py | 3
client/tools/rhnpush/solaris2mpm.py | 2
client/tools/rhnpush/uploadLib.py | 4
java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java | 20
java/code/src/com/redhat/rhn/frontend/servlets/AuthFilter.java | 28
java/code/src/com/redhat/rhn/frontend/xmlrpc/configchannel/ConfigChannelHandler.java | 5
java/spacewalk-java.spec | 2
monitoring/spacewalk-monitoring/spacewalk-monitoring.spec | 2
monitoring/spacewalk-proxy-monitoring/spacewalk-proxy-monitoring.spec | 2
proxy/installer/spacewalk-proxy-installer.spec | 2
proxy/proxy-docs/spacewalk-proxy-docs.spec | 2
proxy/proxy-html/spacewalk-proxy-html.spec | 2
proxy/proxy/spacewalk-proxy.spec | 2
rel-eng/build-missing-builds-in-koji.sh | 2
rel-eng/packages/rhnlib | 2
satellite/install/install.pl | 13
satellite/install/installPackages.py | 234 -----
satellite/install/rhn_rpm.py | 364 --------
satellite/install/satErrors.py | 380 --------
satellite/install/satLog.py | 116 --
satellite/install/translate.py | 112 --
schema/spacewalk/spacewalk-schema.spec | 2
search-server/spacewalk-doc-indexes/spacewalk-doc-indexes.spec | 2
search-server/spacewalk-search.spec | 2
selinux/spacewalk-monitoring-selinux/spacewalk-monitoring-selinux.spec | 2
selinux/spacewalk-proxy-selinux/spacewalk-proxy-selinux.spec | 2
selinux/spacewalk-selinux/spacewalk-selinux.spec | 2
spacewalk/admin/spacewalk-admin.spec | 2
spacewalk/certs-tools/Makefile.certs | 2
spacewalk/certs-tools/rhn_bootstrap.py | 2
spacewalk/certs-tools/rhn_rpm.py | 375 --------
spacewalk/certs-tools/rhn_ssl_tool.py | 2
spacewalk/certs-tools/spacewalk-certs-tools.spec | 5
spacewalk/config/spacewalk-config.spec | 2
spacewalk/package/spacewalk.spec | 2
spacewalk/setup/spacewalk-setup.spec | 2
utils/Makefile | 2
utils/apply_errata | 287 ++++++
utils/spacewalk-utils.spec | 2
web/modules/pxt/PXT/ApacheHandler.pm | 11
web/spacewalk-web.spec | 2
79 files changed, 1201 insertions(+), 3026 deletions(-)
---
14 years, 4 months
client/rhel rel-eng/packages
by Michael Mraka
client/rhel/rhnlib/rhnlib.spec | 5 ++++-
rel-eng/packages/rhnlib | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
New commits:
commit 20ab17ad8a95b48620da413de06758efe7e745d0
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:33:50 2009 +0100
Automatic commit of package [rhnlib] release [2.5.16-1].
diff --git a/client/rhel/rhnlib/rhnlib.spec b/client/rhel/rhnlib/rhnlib.spec
index a1792a7..3f987f1 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.15
+Version: 2.5.16
Release: 1%{?dist}
Group: Development/Libraries
@@ -54,6 +54,9 @@ rm -rf $RPM_BUILD_ROOT
%{python_sitelib}/*
%changelog
+* Fri Dec 04 2009 Michael Mraka <michael.mraka(a)redhat.com> 2.5.16-1
+- added rhn_rpm and rhn_mpm
+
* Wed Nov 25 2009 Miroslav Suchý <msuchy(a)redhat.com> 2.5.15-1
- aamt is not Null in most cases, move it more to right
- replace len() with ==
diff --git a/rel-eng/packages/rhnlib b/rel-eng/packages/rhnlib
index 66bfa13..543e357 100644
--- a/rel-eng/packages/rhnlib
+++ b/rel-eng/packages/rhnlib
@@ -1 +1 @@
-2.5.15-1 client/rhel/rhnlib/
+2.5.16-1 client/rhel/rhnlib/
14 years, 4 months
13 commits - backend/common backend/satellite_tools backend/server backend/spacewalk-backend.spec client/rhel client/tools spacewalk/certs-tools
by Michael Mraka
backend/common/Makefile | 2
backend/common/rhnRepository.py | 2
backend/common/rhn_mpm.py | 278 --------------
backend/common/rhn_rpm.py | 429 -----------------------
backend/satellite_tools/reposync.py | 5
backend/satellite_tools/satCerts.py | 2
backend/satellite_tools/satComputePkgHeaders.py | 2
backend/satellite_tools/satsync.py | 3
backend/satellite_tools/updatePackages.py | 3
backend/server/basePackageUpload.py | 2
backend/server/handlers/app/rhn_mpm.py | 2
backend/server/handlers/applet/applet.py | 4
backend/server/handlers/xmlrpc/up2date.py | 3
backend/server/handlers/xp/rhnlint.py | 3
backend/server/importlib/backend.py | 3
backend/server/importlib/packageUpload.py | 3
backend/server/rhnChannel.py | 3
backend/server/rhnPackageUpload.py | 2
backend/server/rhnServer/server_class.py | 3
backend/server/rhnServer/server_packages.py | 3
backend/spacewalk-backend.spec | 4
client/rhel/rhnlib/rhn/common/rhn_mpm.py | 283 +++++++++++++++
client/rhel/rhnlib/rhn/common/rhn_rpm.py | 428 ++++++++++++++++++++++
client/rhel/rhnlib/setup.py.in | 2
client/tools/rhnpush/Makefile.rhnpush | 2
client/tools/rhnpush/connection.py | 2
client/tools/rhnpush/rhn_mpm.py | 289 ---------------
client/tools/rhnpush/rhn_rpm.py | 370 -------------------
client/tools/rhnpush/rhnpush.py | 2
client/tools/rhnpush/rhnpush.spec | 2
client/tools/rhnpush/rpm2mpm.py | 3
client/tools/rhnpush/solaris2mpm.py | 2
client/tools/rhnpush/uploadLib.py | 4
spacewalk/certs-tools/Makefile.certs | 2
spacewalk/certs-tools/rhn_bootstrap.py | 2
spacewalk/certs-tools/rhn_rpm.py | 375 --------------------
spacewalk/certs-tools/rhn_ssl_tool.py | 2
spacewalk/certs-tools/spacewalk-certs-tools.spec | 3
38 files changed, 755 insertions(+), 1779 deletions(-)
New commits:
commit 52053b203dd566ff7657a0e67a5ac2add8f18b32
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:30:28 2009 +0100
fixed rpmlint error: rhnlib.noarch: E: non-executable-script /usr/lib/python2.6/site-packages/rhn/common/rhn_rpm.py 0644 /usr/bin/python
diff --git a/client/rhel/rhnlib/rhn/common/rhn_mpm.py b/client/rhel/rhnlib/rhn/common/rhn_mpm.py
index 9713867..0d339d8 100644
--- a/client/rhel/rhnlib/rhn/common/rhn_mpm.py
+++ b/client/rhel/rhnlib/rhn/common/rhn_mpm.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
#
# Copyright (c) 2008 Red Hat, Inc.
#
diff --git a/client/rhel/rhnlib/rhn/common/rhn_rpm.py b/client/rhel/rhnlib/rhn/common/rhn_rpm.py
index 0ff9965..66a46e1 100644
--- a/client/rhel/rhnlib/rhn/common/rhn_rpm.py
+++ b/client/rhel/rhnlib/rhn/common/rhn_rpm.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python
#
# Copyright (c) 2008 Red Hat, Inc.
#
commit 3954f368a20fe6c579bbcf18c6da881cc2fb046f
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:27:53 2009 +0100
rhn_rpm/rhn_mpm merge: fixed spec and Makefile to reflect rhn_rpm move
deleted copy of rhn_rpm/rhn_mpm
diff --git a/client/tools/rhnpush/Makefile.rhnpush b/client/tools/rhnpush/Makefile.rhnpush
index fc80e4c..247aa1e 100644
--- a/client/tools/rhnpush/Makefile.rhnpush
+++ b/client/tools/rhnpush/Makefile.rhnpush
@@ -9,7 +9,7 @@ INSTALL_DATA = $(INSTALL) -m 644
SUBDIR = rhnpush
FILES = rhnpush rhnpush_v2 uploadLib __init__ connection \
- rhn_rpm rhn_mpm rpm2mpm solaris2mpm utils rhnpush_cache \
+ rpm2mpm solaris2mpm utils rhnpush_cache \
rhnpush_config rhnpush_confmanager archive
RHN_CONF_DIR = /etc/sysconfig/rhn
diff --git a/client/tools/rhnpush/rhn_mpm.py b/client/tools/rhnpush/rhn_mpm.py
deleted file mode 100644
index 8d195e6..0000000
--- a/client/tools/rhnpush/rhn_mpm.py
+++ /dev/null
@@ -1,289 +0,0 @@
-#
-# Copyright (c) 2008 Red Hat, Inc.
-#
-# This software is licensed to you under the GNU General Public License,
-# version 2 (GPLv2). There is NO WARRANTY for this software, express or
-# implied, including the implied warranties of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
-# along with this software; if not, see
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
-#
-# Red Hat trademarks are not licensed under GPLv2. No permission is
-# granted to use or replicate Red Hat trademarks that are incorporated
-# in this software or its documentation.
-#
-#
-# Meta-package manager
-#
-# $Id$
-#
-# Author: Mihai Ibanescu <misa(a)redhat.com>
-
-import os
-import gzip
-import cStringIO
-import tempfile
-from rhn.rpclib import xmlrpclib
-
-import struct
-
-from types import ListType, TupleType, DictType
-
-def labelCompare(l1, l2):
- try:
- import rhn_rpm
- except ImportError:
- # rhn_rpm not avalable; return a dummy comparison function
- return -1
- return rhn_rpm.labelCompare(l1, l2)
-
-def get_package_header(filename=None, file=None, fd=None):
- return load(filename=filename, file=file, fd=fd)[0]
-
-# Loads an MPM and returns its header and its payload
-def load(filename=None, file=None, fd=None):
- if (filename is None and file is None and fd is None):
- raise ValueError, "No parameters passed"
-
- if filename is not None:
- f = open(filename)
- elif file is not None:
- f = file
- else: # fd is not None
- f = os.fdopen(os.dup(fd), "r")
-
- f.seek(0, 0)
-
- p = MPM_Package()
- try:
- p.load(f)
- except InvalidPackageError, e:
- try:
- return load_rpm(f)
- except InvalidPackageError:
- raise e
-
- return p.header, p.payload_stream
-
-def load_rpm(stream):
- # Hmm, maybe an rpm
-
- try:
- import rhn_rpm
- except ImportError:
- raise InvalidPackageError
-
- # Dup the file descriptor, we don't want it to get closed before we read
- # the payload
- newfd = os.dup(stream.fileno())
- stream = os.fdopen(newfd, "r")
-
- stream.flush()
- stream.seek(0, 0)
-
- try:
- header = rhn_rpm.get_package_header(file=stream)
- except rhn_rpm.InvalidPackageError, e:
- raise apply(InvalidPackageError, e.args)
- except rhn_rpm.error, e:
- raise InvalidPackageError(e)
- stream.seek(0, 0)
-
- return header, stream
-
-class MPM_Header:
- "Wrapper class for an mpm header - we need to store a flag is_source"
- def __init__(self, hdr):
- self.hdr = hdr
- self.is_source = hdr.get('is_source')
- self.packaging = 'mpm'
- self.signatures = []
-
- def __getitem__(self, name):
- return self.hdr.get(name)
-
- def __setitem__(self, name, item):
- self.hdr[name] = item
-
- def __delitem__(self, name):
- del self.hdr[name]
-
- def __getattr__(self, name):
- return getattr(self.hdr, name)
-
- def is_signed(self):
- return 0
-
-class InvalidPackageError(Exception):
- pass
-
-MPM_HEADER_COMPRESSED_GZIP = 1
-MPM_PAYLOAD_COMPRESSED_GZIP = 1
-
-class MPM_Package:
- _lead_format = '!16sB3s4L92s'
- _magic = 'mpmpackage012345'
- def __init__(self):
- self.header = None
- self.payload_stream = None
- self.header_flags = MPM_HEADER_COMPRESSED_GZIP
- self.payload_flags = 0
- assert(len(self._magic) == 16)
- self._buffer_size = 16384
-
- def _read_lead(self, stream):
- # Lead has the following format:
- # 16 bytes magic
- # 1 bytes version
- # 3 bytes unused
- # 4 bytes header flags
- # 4 bytes payload flags
- # 4 bytes header length
- # 4 bytes payload length
- # 92 bytes padding to 128 bytes
- lead = self._read_bytes(stream, 128)
- if len(lead) != 128:
- raise InvalidPackageError()
-
- arr = struct.unpack(self._lead_format, lead)
- return arr
-
- def load(self, input_stream):
- # Clean up
- self.__init__()
- arr = self._read_lead(input_stream)
- magic = arr[0]
- if magic != self._magic:
- raise InvalidPackageError()
- header_len, payload_len = int(arr[5]), int(arr[6])
- header_flags, payload_flags = arr[3], arr[4]
- file_size = 128 + header_len + payload_len
- input_stream.seek(file_size)
- if file_size != input_stream.tell():
- raise InvalidPackageError()
- # Read the header
- input_stream.seek(128, 0)
- header_data = self._read_bytes(input_stream, header_len)
- payload_stream = tempfile.TemporaryFile()
- self.stream_copy(input_stream, payload_stream)
-
- self._read_header(header_data, header_flags)
- self._read_payload(payload_stream, payload_flags)
-
- def _read_bytes(self, stream, amt):
- ret = ""
- while amt:
- buf = stream.read(min(amt, self._buffer_size))
- if not buf:
- return ret
- ret = ret + buf
- amt = amt - len(buf)
- return ret
-
- def _read_header(self, header_data, header_flags):
- if header_flags & MPM_HEADER_COMPRESSED_GZIP:
- t = cStringIO.StringIO(header_data)
- g = gzip.GzipFile(None, "r", 0, t)
- header_data = g.read()
- g.close()
- t.close()
-
- try:
- params, foo = xmlrpclib.loads(header_data)
- except:
- # XXX
- raise
-
- self.header = MPM_Header(params[0])
-
- def _read_payload(self, payload_stream, payload_flags):
- payload_stream.seek(0, 0)
- if payload_flags & MPM_PAYLOAD_COMPRESSED_GZIP:
- g = gzip.GzipFile(None, "r", 0, payload_stream)
- t = tempfile.TemporaryFile()
- self.stream_copy(g, t)
- g.close()
- payload_stream = t
-
- self.payload_stream = payload_stream
-
- def write(self, output_stream):
- if self.header is None:
- raise Exception()
-
- header_stream, header_size = self._encode_header()
- payload_stream, payload_size = self._encode_payload()
-
- lead_arr = (self._magic, 1, "\0" * 3, self.header_flags,
- self.payload_flags, header_size, payload_size, '\0' * 92)
- # lead
- lead = apply(struct.pack, (self._lead_format, ) + lead_arr)
- output_stream.write(lead)
- self.stream_copy(header_stream, output_stream)
- self.stream_copy(payload_stream, output_stream)
-
- def add_header_flag(self, flag):
- self.header_flags = self.header_flags | flag
-
- def add_payload_flag(self, flag):
- self.payload_flags = self.payload_flags | flag
-
- def reset_header_flags(self):
- self.header_flags = 0
-
- def reset_payload_flags(self):
- self.payload_flags = 0
-
- def _encode_header(self):
- assert(self.header is not None)
- stream = tempfile.TemporaryFile()
- data = xmlrpclib.dumps((_replace_null(self.header), ))
- if self.header_flags & MPM_HEADER_COMPRESSED_GZIP:
- f = gzip.GzipFile(None, "wb", 9, stream)
- f.write(data)
- f.close()
- else:
- stream.write(data)
- stream.flush()
- stream.seek(0, 2)
- size = stream.tell()
- stream.seek(0, 0)
- return stream, size
-
- def _encode_payload(self):
- assert(self.payload_stream is not None)
- stream = tempfile.TemporaryFile()
- if self.payload_flags & MPM_PAYLOAD_COMPRESSED_GZIP:
- f = gzip.GzipFile(None, "wb", 9, stream)
- self.stream_copy(self.payload_stream, f)
- f.close()
- else:
- stream = self.payload_stream
- stream.flush()
- stream.seek(0, 2)
- size = stream.tell()
- stream.seek(0, 0)
- return stream, size
-
- def stream_copy(self, source, dest):
- "Copies data from the source stream to the destination stream"
- while 1:
- buf = source.read(self._buffer_size)
- if not buf:
- break
- dest.write(buf)
-
-
-def _replace_null(obj):
- if obj is None:
- return ''
- if isinstance(obj, ListType):
- return map(_replace_null, obj)
- if isinstance(obj, TupleType):
- return tuple(_replace_null(list(obj)))
- if hasattr(obj, 'items'):
- dict = {}
- for k, v in obj.items():
- dict[_replace_null(k)] = _replace_null(v)
- return dict
- return obj
diff --git a/client/tools/rhnpush/rhn_rpm.py b/client/tools/rhnpush/rhn_rpm.py
deleted file mode 100644
index 5c762a0..0000000
--- a/client/tools/rhnpush/rhn_rpm.py
+++ /dev/null
@@ -1,370 +0,0 @@
-#
-# Copyright (c) 2008 Red Hat, Inc.
-#
-# This software is licensed to you under the GNU General Public License,
-# version 2 (GPLv2). There is NO WARRANTY for this software, express or
-# implied, including the implied warranties of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
-# along with this software; if not, see
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
-#
-# Red Hat trademarks are not licensed under GPLv2. No permission is
-# granted to use or replicate Red Hat trademarks that are incorporated
-# in this software or its documentation.
-#
-
-import os
-import sys
-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
-for sym, val in rpm.__dict__.items():
- if sym[:3] == 'RPM':
- # A constant, probably - import it into our namespace
- globals()[sym] = val
-del sym, val
-
-class InvalidPackageError(Exception):
- pass
-
-# wrapper/proxy class for rpm.Transaction so we can
-# instrument it, etc easily
-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.tsflags = []
- # For rpm 4.0.4
- self._flags = 0
- self._prob_filter = 0
-
- def __getattr__(self, attr):
- return getattr(self.ts, attr)
-
- def getMethod(self, method):
- # in theory, we can override this with
- # profile/etc info
- return getattr(self.ts, method)
-
- # push/pop methods so we don't lose the previous
- # set value, and we can potentially debug a bit
- # easier
- def pushVSFlags(self, flags):
- self.tsflags.append(flags)
- if hasattr(self.ts, 'setVSFlags'):
- 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])
-
- 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)
-
- 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")
-
- def check(self):
- """Check dependencies"""
- if hasattr(self.ts, 'check'):
- f = getattr(self.ts, 'check')
- else:
- f = getattr(self.ts, 'depcheck')
- return f()
-
- 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)
-
-
-
-
-class SharedStateTransaction:
- _shared_state = {}
-
- def __init__(self):
- self.__dict__ = self._shared_state
-
-class RPMReadOnlyTransaction(SharedStateTransaction, RPMTransaction):
- read_only = 1
- def __init__(self):
- SharedStateTransaction.__init__(self)
- if not hasattr(self, 'ts'):
- RPMTransaction.__init__(self)
- # FIXME: replace with macro defination
- self.pushVSFlags(8)
-
-class RPM_Header:
- "Wrapper class for an rpm header - we need to store a flag is_source"
- def __init__(self, hdr, is_source=None):
- self.hdr = hdr
- self.is_source = is_source
- self.packaging = 'rpm'
- self.signatures = []
- self._extract_signatures()
-
- def __getitem__(self, name):
- return self.hdr[name]
-
- def __getattr__(self, name):
- return getattr(self.hdr, name)
-
- def is_signed(self):
- if hasattr(rpm, "RPMTAG_DSAHEADER"):
- dsaheader = self.hdr["dsaheader"]
- else:
- dsaheader = 0
- if self.hdr["siggpg"] or self.hdr["sigpgp"] or dsaheader:
- return 1
- return 0
-
- def _extract_signatures(self):
- header_tags = [
- [rpm.RPMTAG_DSAHEADER, "dsa"],
- [rpm.RPMTAG_RSAHEADER, "rsa"],
- [rpm.RPMTAG_SIGGPG, "gpg"],
- [rpm.RPMTAG_SIGPGP, 'pgp'],
- ]
- for ht, sig_type in header_tags:
- ret = self.hdr[ht]
- if not ret or len(ret) < 17:
- continue
- # Get the key id - hopefully we get it right
- key_id = ret[9:17]
- key_id_len = len(key_id)
- format = "%dB" % key_id_len
- t = struct.unpack(format, key_id)
- format = "%02x" * key_id_len
- key_id = format % t
- self.signatures.append({
- 'signature_type' : sig_type,
- 'key_id' : key_id,
- 'signature' : ret,
- })
-
-
-# Loads the package header from a file / stream / file descriptor
-# Raises rpm.error if an error is found, or InvalidPacageError if package is
-# busted
-# XXX Deal with exceptions better
-def get_package_header(filename=None, file=None, fd=None):
- if (filename is None and file is None and fd is None):
- raise ValueError, "No parameters passed"
-
- if filename is not None:
- f = open(filename)
- elif file is not None:
- f = file
- f.seek(0, 0)
- else: # fd is not None
- f = None
-
- if f is None:
- os.lseek(fd, 0, 0)
- file_desc = fd
- else:
- file_desc = f.fileno()
-
- if hasattr(rpm, 'headerFromPackage'):
- hdr, is_source = rpm.headerFromPackage(file_desc)
- if hdr is None:
- raise InvalidPackageError
- else:
- ts = RPMReadOnlyTransaction()
- nomd5 = getattr(rpm, 'RPMVSF_NOMD5')
- needpayload = getattr(rpm, 'RPMVSF_NEEDPAYLOAD')
- ts.pushVSFlags(~(nomd5 | needpayload))
- hdr = RPMReadOnlyTransaction().hdrFromFdno(file_desc)
- ts.popVSFlags()
- if hdr is None:
- raise InvalidPackageError
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
-
- return RPM_Header(hdr, is_source)
-
-class MatchIterator:
- def __init__(self, tag_name=None, value=None):
- # Query by name, by default
- 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
-
- if value:
- self.mi = method(tag_name, value)
- else:
- self.mi = method(tag_name)
-
- def pattern(self, tag_name, mode, pattern):
- self.mi.pattern(tag_name, mode, pattern)
-
- def next(self):
- try:
- hdr = self.mi.next()
- except StopIteration:
- hdr = None
-
- 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')]
- 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')]
- return RPM_Header(hdr, is_source)
-
-def labelCompare(t1, t2):
- return rpm.labelCompare(t1, t2)
-
-def nvre_compare(t1, t2):
- def build_evr(p):
- evr = [p[3], p[1], p[2]]
- evr = map(str, evr)
- if evr[0] == "":
- evr[0] = None
- return evr
- if t1[0] != t2[0]:
- raise ValueError("You should only compare packages with the same name")
- evr1, evr2 = (build_evr(t1), build_evr(t2))
- return rpm.labelCompare(evr1, evr2)
-
-
-def hdrLabelCompare(hdr1, hdr2):
- """ take two RPMs or headers and compare them for order """
-
- if hdr1['name'] == hdr2['name']:
- hdr1 = [hdr1['epoch'] or None, hdr1['version'], hdr1['release']]
- hdr2 = [hdr2['epoch'] or None, hdr2['version'], hdr2['release']]
- if hdr1[0]:
- hdr1[0] = str(hdr1[0])
- if hdr2[0]:
- hdr2[0] = str(hdr2[0])
- return rpm.labelCompare(hdr1, hdr2)
- elif hdr1['name'] < hdr2['name']:
- return -1
- return 1
-
-
-def rpmLabelCompare(rpmFilename1, rpmFilename2):
- """ take two RPMs and compare them for order """
- return hdrLabelCompare(get_package_header(rpmFilename1),
- get_package_header(rpmFilename2))
-
-
-def sortHeaders(hdrs):
- """ Sorts a list of RPM headers (or RPMs).
- Assertion: they *must* exist.
- """
-
- assert isinstance(hdrs, type([]))
-
- sorted = hdrs[:]
- sorted.sort(hdrLabelCompare)
- return sorted
-
-
-def sortRPMs(rpms):
- """ Sorts a list of RPM files. They *must* exist. """
-
- assert isinstance(rpms, type([]))
-
- # We don't want to use rpmLabelCompare as a sorting mechanism, it would
- # extract the rpm header for each comparison.
- # Build a list of (header, rpm)
- helper = map(lambda x: (get_package_header(x), x), rpms)
-
- # Sort the list using the headers as a comparison
- helper.sort(lambda x, y: hdrLabelCompare(x[0], y[0]))
-
- # Extract the rpm names now
- return map(lambda x: x[1], helper)
-
-
-def getInstalledHeader(rpmName):
- """ quieries the RPM DB for a header matching rpmName. """
-
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_STRCMP, rpmName)
- return mi.next()
-
-
-if __name__ == '__main__':
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_GLOB, "*ker*")
- while 1:
- h = mi.next()
- if not h:
- break
- print h['name']
- sys.exit(1)
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.i386.rpm")
- print dir(hdr)
- # Sources
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.src.rpm")
- hdr2 = headerLoad(hdr.unload())
- print hdr2
- print len(hdr2.keys())
-
-
diff --git a/client/tools/rhnpush/rhnpush.spec b/client/tools/rhnpush/rhnpush.spec
index 9a9f6e9..4bcdf37 100644
--- a/client/tools/rhnpush/rhnpush.spec
+++ b/client/tools/rhnpush/rhnpush.spec
@@ -10,7 +10,7 @@ Release: 1%{?dist}
Source0: https://fedorahosted.org/releases/s/p/spacewalk/%{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
-Requires: rpm-python, rhnlib
+Requires: rpm-python, rhnlib >= 2.2.16
BuildRequires: docbook-utils, gettext
Summary: Package uploader for the Red Hat Network Satellite Server
commit 69a1a99a68f573e6ed74883e81b85098510a1f22
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:25:19 2009 +0100
rhn_rpm/rhn_mpm merge: let rhnpush use rhn_rpm/rhn_mpm from rhnlib
instead of it's own copy
diff --git a/client/tools/rhnpush/connection.py b/client/tools/rhnpush/connection.py
index 8d2e3a6..5a434ad 100644
--- a/client/tools/rhnpush/connection.py
+++ b/client/tools/rhnpush/connection.py
@@ -39,7 +39,7 @@ from types import ListType, TupleType, IntType
from rhn import connections, rpclib
-import rhn_mpm
+from rhn.common import rhn_mpm
class ConnectionError(Exception):
pass
diff --git a/client/tools/rhnpush/rhnpush.py b/client/tools/rhnpush/rhnpush.py
index 5aac00a..cb50127 100755
--- a/client/tools/rhnpush/rhnpush.py
+++ b/client/tools/rhnpush/rhnpush.py
@@ -37,7 +37,6 @@ import time
import urlparse
import rhnpush_cache
import rhnpush_confmanager
-import rhn_mpm
from types import IntType, StringType
try:
@@ -45,6 +44,7 @@ try:
except ImportError:
from optik import Option, OptionParser
from rhn import rpclib
+from rhn.common import rhn_mpm
import uploadLib
import rhnpush_v2
diff --git a/client/tools/rhnpush/rpm2mpm.py b/client/tools/rhnpush/rpm2mpm.py
index d9295e1..a6105b3 100644
--- a/client/tools/rhnpush/rpm2mpm.py
+++ b/client/tools/rhnpush/rpm2mpm.py
@@ -20,8 +20,7 @@ from types import ListType, TupleType, DictType
import gzip
import cStringIO
-import rhn_rpm
-import rhn_mpm
+from rhn.common import rhn_rpm, rhn_mpm
def main():
packages = sys.argv[1:]
diff --git a/client/tools/rhnpush/solaris2mpm.py b/client/tools/rhnpush/solaris2mpm.py
index 5be7b76..411dfe7 100644
--- a/client/tools/rhnpush/solaris2mpm.py
+++ b/client/tools/rhnpush/solaris2mpm.py
@@ -39,7 +39,7 @@ except ImportError:
if checksum not in ['md5', 'sha1']:
raise ValueError, "Incompatible checksum type"
-import rhn_mpm
+from rhn.common import rhn_mpm
from archive import get_archive_parser
diff --git a/client/tools/rhnpush/uploadLib.py b/client/tools/rhnpush/uploadLib.py
index f420de3..ffdcc63 100644
--- a/client/tools/rhnpush/uploadLib.py
+++ b/client/tools/rhnpush/uploadLib.py
@@ -16,11 +16,11 @@
# system imports
import os
import sys
-import rhn_mpm
import string
import fnmatch
import getpass
import rhnpush_cache
+from rhn.common import rhn_mpm
try:
import hashlib
@@ -726,7 +726,7 @@ def packageCompare(pkg1, pkg2, is_mpm=None):
if is_mpm:
func = rhn_mpm.labelCompare
else:
- import rhn_rpm
+ from rhn.common import rhn_rpm
func = rhn_rpm.labelCompare
return func(packages[0], packages[1])
commit 1a86f0f8232d7ccc064783e6af448d33f5b5035c
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:17:52 2009 +0100
rhn_rpm/rhn_mpm merge: merged changes from rhnpush/rhn_mpm.py
diff --git a/client/rhel/rhnlib/rhn/common/rhn_mpm.py b/client/rhel/rhnlib/rhn/common/rhn_mpm.py
index 400f5d2..9713867 100644
--- a/client/rhel/rhnlib/rhn/common/rhn_mpm.py
+++ b/client/rhel/rhnlib/rhn/common/rhn_mpm.py
@@ -22,7 +22,7 @@ from rhn.rpclib import xmlrpclib
import struct
-from types import ListType, TupleType
+from types import ListType, TupleType, DictType
def labelCompare(l1, l2):
try:
@@ -97,6 +97,12 @@ class MPM_Header:
def __getitem__(self, name):
return self.hdr.get(name)
+ def __setitem__(self, name, item):
+ self.hdr[name] = item
+
+ def __delitem__(self, name):
+ del self.hdr[name]
+
def __getattr__(self, name):
return getattr(self.hdr, name)
commit e748014a394e9986a1d335c66648dcc05099031c
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:08:38 2009 +0100
rhn_rpm/rhn_mpm merge: remove copy of rhn_rpm from certs-tools
diff --git a/spacewalk/certs-tools/rhn_rpm.py b/spacewalk/certs-tools/rhn_rpm.py
deleted file mode 100644
index 1e3d66d..0000000
--- a/spacewalk/certs-tools/rhn_rpm.py
+++ /dev/null
@@ -1,375 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2008 Red Hat, Inc.
-#
-# This software is licensed to you under the GNU General Public License,
-# version 2 (GPLv2). There is NO WARRANTY for this software, express or
-# implied, including the implied warranties of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
-# along with this software; if not, see
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
-#
-# Red Hat trademarks are not licensed under GPLv2. No permission is
-# granted to use or replicate Red Hat trademarks that are incorporated
-# in this software or its documentation.
-#
-#
-# Compatibility layer for rpm
-#
-# $Id$
-
-import os
-import sys
-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
-for sym, val in rpm.__dict__.items():
- if sym[:3] == 'RPM':
- # A constant, probably - import it into our namespace
- globals()[sym] = val
-del sym, val
-
-class InvalidPackageError(Exception):
- pass
-
-# wrapper/proxy class for rpm.Transaction so we can
-# instrument it, etc easily
-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.tsflags = []
- # For rpm 4.0.4
- self._flags = 0
- self._prob_filter = 0
-
- def __getattr__(self, attr):
- return getattr(self.ts, attr)
-
- def getMethod(self, method):
- # in theory, we can override this with
- # profile/etc info
- return getattr(self.ts, method)
-
- # push/pop methods so we don't lose the previous
- # set value, and we can potentially debug a bit
- # easier
- def pushVSFlags(self, flags):
- self.tsflags.append(flags)
- if hasattr(self.ts, 'setVSFlags'):
- 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])
-
- 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)
-
- 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")
-
- def check(self):
- """Check dependencies"""
- if hasattr(self.ts, 'check'):
- f = getattr(self.ts, 'check')
- else:
- f = getattr(self.ts, 'depcheck')
- return f()
-
- 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)
-
-
-
-
-class SharedStateTransaction:
- _shared_state = {}
-
- def __init__(self):
- self.__dict__ = self._shared_state
-
-class RPMReadOnlyTransaction(SharedStateTransaction, RPMTransaction):
- read_only = 1
- def __init__(self):
- SharedStateTransaction.__init__(self)
- if not hasattr(self, 'ts'):
- RPMTransaction.__init__(self)
- # FIXME: replace with macro defination
- self.pushVSFlags(8)
-
-class RPM_Header:
- "Wrapper class for an rpm header - we need to store a flag is_source"
- def __init__(self, hdr, is_source=None):
- self.hdr = hdr
- self.is_source = is_source
- self.packaging = 'rpm'
- self.signatures = []
- self._extract_signatures()
-
- def __getitem__(self, name):
- return self.hdr[name]
-
- def __getattr__(self, name):
- return getattr(self.hdr, name)
-
- def is_signed(self):
- if hasattr(rpm, "RPMTAG_DSAHEADER"):
- dsaheader = self.hdr["dsaheader"]
- else:
- dsaheader = 0
- if self.hdr["siggpg"] or self.hdr["sigpgp"] or dsaheader:
- return 1
- return 0
-
- def _extract_signatures(self):
- header_tags = [
- [rpm.RPMTAG_DSAHEADER, "dsa"],
- [rpm.RPMTAG_RSAHEADER, "rsa"],
- [rpm.RPMTAG_SIGGPG, "gpg"],
- [rpm.RPMTAG_SIGPGP, 'pgp'],
- ]
- for ht, sig_type in header_tags:
- ret = self.hdr[ht]
- if not ret or len(ret) < 17:
- continue
- # Get the key id - hopefully we get it right
- key_id = ret[9:17]
- key_id_len = len(key_id)
- format = "%dB" % key_id_len
- t = struct.unpack(format, key_id)
- format = "%02x" * key_id_len
- key_id = format % t
- self.signatures.append({
- 'signature_type' : sig_type,
- 'key_id' : key_id,
- 'signature' : ret,
- })
-
-
-# Loads the package header from a file / stream / file descriptor
-# Raises rpm.error if an error is found, or InvalidPacageError if package is
-# busted
-# XXX Deal with exceptions better
-def get_package_header(filename=None, file=None, fd=None):
- if (filename is None and file is None and fd is None):
- raise ValueError, "No parameters passed"
-
- if filename is not None:
- f = open(filename)
- elif file is not None:
- f = file
- f.seek(0, 0)
- else: # fd is not None
- f = None
-
- if f is None:
- os.lseek(fd, 0, 0)
- file_desc = fd
- else:
- file_desc = f.fileno()
-
- if hasattr(rpm, 'headerFromPackage'):
- hdr, is_source = rpm.headerFromPackage(file_desc)
- if hdr is None:
- raise InvalidPackageError
- else:
- ts = RPMReadOnlyTransaction()
- nomd5 = getattr(rpm, 'RPMVSF_NOMD5')
- needpayload = getattr(rpm, 'RPMVSF_NEEDPAYLOAD')
- ts.pushVSFlags(~(nomd5 | needpayload))
- hdr = RPMReadOnlyTransaction().hdrFromFdno(file_desc)
- ts.popVSFlags()
- if hdr is None:
- raise InvalidPackageError
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
-
- return RPM_Header(hdr, is_source)
-
-class MatchIterator:
- def __init__(self, tag_name=None, value=None):
- # Query by name, by default
- 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
-
- if value:
- self.mi = method(tag_name, value)
- else:
- self.mi = method(tag_name)
-
- def pattern(self, tag_name, mode, pattern):
- self.mi.pattern(tag_name, mode, pattern)
-
- def next(self):
- try:
- hdr = self.mi.next()
- except StopIteration:
- hdr = None
-
- 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')]
- 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')]
- return RPM_Header(hdr, is_source)
-
-def labelCompare(t1, t2):
- return rpm.labelCompare(t1, t2)
-
-def nvre_compare(t1, t2):
- def build_evr(p):
- evr = [p[3], p[1], p[2]]
- evr = map(str, evr)
- if evr[0] == "":
- evr[0] = None
- return evr
- if t1[0] != t2[0]:
- raise ValueError("You should only compare packages with the same name")
- evr1, evr2 = (build_evr(t1), build_evr(t2))
- return rpm.labelCompare(evr1, evr2)
-
-
-def hdrLabelCompare(hdr1, hdr2):
- """ take two RPMs or headers and compare them for order """
-
- if hdr1['name'] == hdr2['name']:
- hdr1 = [hdr1['epoch'] or None, hdr1['version'], hdr1['release']]
- hdr2 = [hdr2['epoch'] or None, hdr2['version'], hdr2['release']]
- if hdr1[0]:
- hdr1[0] = str(hdr1[0])
- if hdr2[0]:
- hdr2[0] = str(hdr2[0])
- return rpm.labelCompare(hdr1, hdr2)
- elif hdr1['name'] < hdr2['name']:
- return -1
- return 1
-
-
-def rpmLabelCompare(rpmFilename1, rpmFilename2):
- """ take two RPMs and compare them for order """
- return hdrLabelCompare(get_package_header(rpmFilename1),
- get_package_header(rpmFilename2))
-
-
-def sortHeaders(hdrs):
- """ Sorts a list of RPM headers (or RPMs).
- Assertion: they *must* exist.
- """
-
- assert isinstance(hdrs, type([]))
-
- sorted = hdrs[:]
- sorted.sort(hdrLabelCompare)
- return sorted
-
-
-def sortRPMs(rpms):
- """ Sorts a list of RPM files. They *must* exist. """
-
- assert isinstance(rpms, type([]))
-
- # We don't want to use rpmLabelCompare as a sorting mechanism, it would
- # extract the rpm header for each comparison.
- # Build a list of (header, rpm)
- helper = map(lambda x: (get_package_header(x), x), rpms)
-
- # Sort the list using the headers as a comparison
- helper.sort(lambda x, y: hdrLabelCompare(x[0], y[0]))
-
- # Extract the rpm names now
- return map(lambda x: x[1], helper)
-
-
-def getInstalledHeader(rpmName):
- """ quieries the RPM DB for a header matching rpmName. """
-
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_STRCMP, rpmName)
- return mi.next()
-
-
-if __name__ == '__main__':
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_GLOB, "*ker*")
- while 1:
- h = mi.next()
- if not h:
- break
- print h['name']
- sys.exit(1)
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.i386.rpm")
- print dir(hdr)
- # Sources
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.src.rpm")
- hdr2 = headerLoad(hdr.unload())
- print hdr2
- print len(hdr2.keys())
-
-
commit 1cde6ba4e2526b391ef2e5807d0be81647f7b3a9
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:07:37 2009 +0100
rhn_rpm/rhn_mpm merge: fixed spec and Makefile to reflect rhn_rpm move
diff --git a/spacewalk/certs-tools/Makefile.certs b/spacewalk/certs-tools/Makefile.certs
index 59299d2..7cf1311 100644
--- a/spacewalk/certs-tools/Makefile.certs
+++ b/spacewalk/certs-tools/Makefile.certs
@@ -18,7 +18,7 @@
SUBDIR = certs
-FILES = __init__ rhn_rpm rhn_ssl_tool sslToolCli sslToolConfig sslToolLib \
+FILES = __init__ rhn_ssl_tool sslToolCli sslToolConfig sslToolLib \
timeLib rhn_bootstrap rhn_bootstrap_strings client_config_update
INSTALL_FILES = gen-rpm.sh sign.sh
diff --git a/spacewalk/certs-tools/spacewalk-certs-tools.spec b/spacewalk/certs-tools/spacewalk-certs-tools.spec
index 594e9a7..3ac18e5 100644
--- a/spacewalk/certs-tools/spacewalk-certs-tools.spec
+++ b/spacewalk/certs-tools/spacewalk-certs-tools.spec
@@ -10,6 +10,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildArch: noarch
Requires: openssl rpm-build
Requires: rhn-client-tools
+Requires: rhnlib >= 2.2.16
BuildRequires: docbook-utils
BuildRequires: python
Obsoletes: rhns-certs < 5.3.0
@@ -35,7 +36,7 @@ rm -rf $RPM_BUILD_ROOT
install -d -m 755 $RPM_BUILD_ROOT/%{rhnroot}/certs
make -f Makefile.certs install PREFIX=$RPM_BUILD_ROOT ROOT=%{rhnroot} \
MANDIR=%{_mandir}
-chmod 755 $RPM_BUILD_ROOT/%{rhnroot}/certs/{rhn_ssl_tool.py,client_config_update.py,rhn_rpm.py,rhn_bootstrap.py}
+chmod 755 $RPM_BUILD_ROOT/%{rhnroot}/certs/{rhn_ssl_tool.py,client_config_update.py,rhn_bootstrap.py}
%clean
rm -rf $RPM_BUILD_ROOT
commit e1cf991b304625e025fc16a7c3eb19679c79c6f7
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 12:00:39 2009 +0100
rhn_rpm/rhn_mpm merge: let certs-tools use rhn_rpm from rhnlib
instead of it's own copy
diff --git a/spacewalk/certs-tools/rhn_bootstrap.py b/spacewalk/certs-tools/rhn_bootstrap.py
index b54d182..24c1ece 100644
--- a/spacewalk/certs-tools/rhn_bootstrap.py
+++ b/spacewalk/certs-tools/rhn_bootstrap.py
@@ -34,7 +34,7 @@ import operator
from optparse import Option, OptionParser
## local imports
-import rhn_rpm
+from rhn.common import rhn_rpm
from client_config_update import readConfigFile
from rhn_bootstrap_strings import \
getHeader, getConfigFilesSh, getUp2dateScriptsSh, getGPGKeyImportSh, \
diff --git a/spacewalk/certs-tools/rhn_ssl_tool.py b/spacewalk/certs-tools/rhn_ssl_tool.py
index 56bdb8e..3835c28 100755
--- a/spacewalk/certs-tools/rhn_ssl_tool.py
+++ b/spacewalk/certs-tools/rhn_ssl_tool.py
@@ -50,7 +50,7 @@ from sslToolLib import RhnSslToolException, rotateFile, rhn_popen, cleanupAbsPat
gendir, chdir, getMachineName, fixSerial, TempDir, parseRPMFilename, \
errnoGeneralError, errnoSuccess, maketemp
-from rhn_rpm import hdrLabelCompare, sortRPMs, get_package_header, \
+from rhn.common.rhn_rpm import hdrLabelCompare, sortRPMs, get_package_header, \
getInstalledHeader
from sslToolConfig import ConfigFile, figureSerial, getOption, CERT_PATH, \
commit 417037a9f5e8fcd1fb715b76e0a4195742958d1b
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 11:53:08 2009 +0100
rhn_rpm/rhn_mpm merge: fixed list of files in Makefile
diff --git a/backend/common/Makefile b/backend/common/Makefile
index 08b7807..2512c26 100644
--- a/backend/common/Makefile
+++ b/backend/common/Makefile
@@ -9,9 +9,7 @@ TOP = ..
SUBDIR = common
FILES = __init__ \
rhn_fcntl \
- rhn_mpm \
rhn_posix \
- rhn_rpm \
rhn_timer \
rhnApache \
rhnCache \
commit f5e407bc383532ea9758dbffaba40d95b3f7515a
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 11:49:18 2009 +0100
rhn_rpm/rhn_mpm merge: fixed spec to reflect rhn_rpm/rhn_mpm move
diff --git a/backend/spacewalk-backend.spec b/backend/spacewalk-backend.spec
index 2b04045..309fddb 100644
--- a/backend/spacewalk-backend.spec
+++ b/backend/spacewalk-backend.spec
@@ -16,7 +16,7 @@ BuildArch: noarch
Requires: python, rpm-python
# /etc/rhn is provided by spacewalk-proxy-common or by spacewalk-config
Requires: /etc/rhn
-Requires: rhnlib >= 1.8
+Requires: rhnlib >= 2.2.16
BuildRequires: /usr/bin/msgfmt
BuildRequires: /usr/bin/docbook2man
BuildRequires: docbook-utils
@@ -274,9 +274,7 @@ rm -f %{rhnconf}/rhnSecret.py*
%dir %{rhnroot}/common
%{rhnroot}/common/__init__.py*
%{rhnroot}/common/rhn_fcntl.py*
-%{rhnroot}/common/rhn_mpm.py*
%{rhnroot}/common/rhn_posix.py*
-%{rhnroot}/common/rhn_rpm.py*
%{rhnroot}/common/rhn_timer.py*
%{rhnroot}/common/rhnApache.py*
%{rhnroot}/common/rhnCache.py*
commit a2b4004a5eda78c752a9291e1a2bd301a32e692b
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 11:42:57 2009 +0100
rhn_rpm/rhn_mpm merge: let backend use rhn_rpm/rhn_mpm from rhnlib
instead of it's own copy
diff --git a/backend/common/rhnRepository.py b/backend/common/rhnRepository.py
index c66b2d9..e112c1f 100644
--- a/backend/common/rhnRepository.py
+++ b/backend/common/rhnRepository.py
@@ -21,7 +21,7 @@ import string
import cStringIO
from rhn import rpclib
-import rhn_rpm
+from rhn.common import rhn_rpm
# local imports
import rhnFlags
diff --git a/backend/common/rhn_mpm.py b/backend/common/rhn_mpm.py
deleted file mode 100644
index 400f5d2..0000000
--- a/backend/common/rhn_mpm.py
+++ /dev/null
@@ -1,278 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2008 Red Hat, Inc.
-#
-# This software is licensed to you under the GNU General Public License,
-# version 2 (GPLv2). There is NO WARRANTY for this software, express or
-# implied, including the implied warranties of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
-# along with this software; if not, see
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
-#
-# Red Hat trademarks are not licensed under GPLv2. No permission is
-# granted to use or replicate Red Hat trademarks that are incorporated
-# in this software or its documentation.
-#
-
-import os
-import gzip
-import cStringIO
-import tempfile
-from rhn.rpclib import xmlrpclib
-
-import struct
-
-from types import ListType, TupleType
-
-def labelCompare(l1, l2):
- try:
- import rhn_rpm
- except ImportError:
- # rhn_rpm not avalable; return a dummy comparison function
- return -1
- return rhn_rpm.labelCompare(l1, l2)
-
-def get_package_header(filename=None, file=None, fd=None):
- return load(filename=filename, file=file, fd=fd)[0]
-
-# Loads an MPM and returns its header and its payload
-def load(filename=None, file=None, fd=None):
- if (filename is None and file is None and fd is None):
- raise ValueError, "No parameters passed"
-
- if filename is not None:
- f = open(filename)
- elif file is not None:
- f = file
- else: # fd is not None
- f = os.fdopen(os.dup(fd), "r")
-
- f.seek(0, 0)
-
- p = MPM_Package()
- try:
- p.load(f)
- except InvalidPackageError, e:
- try:
- return load_rpm(f)
- except InvalidPackageError:
- raise e
-
- return p.header, p.payload_stream
-
-def load_rpm(stream):
- # Hmm, maybe an rpm
-
- try:
- import rhn_rpm
- except ImportError:
- raise InvalidPackageError
-
- # Dup the file descriptor, we don't want it to get closed before we read
- # the payload
- newfd = os.dup(stream.fileno())
- stream = os.fdopen(newfd, "r")
-
- stream.flush()
- stream.seek(0, 0)
-
- try:
- header = rhn_rpm.get_package_header(file=stream)
- except rhn_rpm.InvalidPackageError, e:
- raise apply(InvalidPackageError, e.args)
- except rhn_rpm.error, e:
- raise InvalidPackageError(e)
- stream.seek(0, 0)
-
- return header, stream
-
-class MPM_Header:
- "Wrapper class for an mpm header - we need to store a flag is_source"
- def __init__(self, hdr):
- self.hdr = hdr
- self.is_source = hdr.get('is_source')
- self.packaging = 'mpm'
- self.signatures = []
-
- def __getitem__(self, name):
- return self.hdr.get(name)
-
- def __getattr__(self, name):
- return getattr(self.hdr, name)
-
- def is_signed(self):
- return 0
-
-class InvalidPackageError(Exception):
- pass
-
-MPM_HEADER_COMPRESSED_GZIP = 1
-MPM_PAYLOAD_COMPRESSED_GZIP = 1
-
-class MPM_Package:
- _lead_format = '!16sB3s4L92s'
- _magic = 'mpmpackage012345'
- def __init__(self):
- self.header = None
- self.payload_stream = None
- self.header_flags = MPM_HEADER_COMPRESSED_GZIP
- self.payload_flags = 0
- assert(len(self._magic) == 16)
- self._buffer_size = 16384
-
- def _read_lead(self, stream):
- # Lead has the following format:
- # 16 bytes magic
- # 1 bytes version
- # 3 bytes unused
- # 4 bytes header flags
- # 4 bytes payload flags
- # 4 bytes header length
- # 4 bytes payload length
- # 92 bytes padding to 128 bytes
- lead = self._read_bytes(stream, 128)
- if len(lead) != 128:
- raise InvalidPackageError()
-
- arr = struct.unpack(self._lead_format, lead)
- return arr
-
- def load(self, input_stream):
- # Clean up
- self.__init__()
- arr = self._read_lead(input_stream)
- magic = arr[0]
- if magic != self._magic:
- raise InvalidPackageError()
- header_len, payload_len = int(arr[5]), int(arr[6])
- header_flags, payload_flags = arr[3], arr[4]
- file_size = 128 + header_len + payload_len
- input_stream.seek(file_size)
- if file_size != input_stream.tell():
- raise InvalidPackageError()
- # Read the header
- input_stream.seek(128, 0)
- header_data = self._read_bytes(input_stream, header_len)
- payload_stream = tempfile.TemporaryFile()
- self.stream_copy(input_stream, payload_stream)
-
- self._read_header(header_data, header_flags)
- self._read_payload(payload_stream, payload_flags)
-
- def _read_bytes(self, stream, amt):
- ret = ""
- while amt:
- buf = stream.read(min(amt, self._buffer_size))
- if not buf:
- return ret
- ret = ret + buf
- amt = amt - len(buf)
- return ret
-
- def _read_header(self, header_data, header_flags):
- if header_flags & MPM_HEADER_COMPRESSED_GZIP:
- t = cStringIO.StringIO(header_data)
- g = gzip.GzipFile(None, "r", 0, t)
- header_data = g.read()
- g.close()
- t.close()
-
- try:
- params, foo = xmlrpclib.loads(header_data)
- except:
- # XXX
- raise
-
- self.header = MPM_Header(params[0])
-
- def _read_payload(self, payload_stream, payload_flags):
- payload_stream.seek(0, 0)
- if payload_flags & MPM_PAYLOAD_COMPRESSED_GZIP:
- g = gzip.GzipFile(None, "r", 0, payload_stream)
- t = tempfile.TemporaryFile()
- self.stream_copy(g, t)
- g.close()
- payload_stream = t
-
- self.payload_stream = payload_stream
-
- def write(self, output_stream):
- if self.header is None:
- raise Exception()
-
- header_stream, header_size = self._encode_header()
- payload_stream, payload_size = self._encode_payload()
-
- lead_arr = (self._magic, 1, "\0" * 3, self.header_flags,
- self.payload_flags, header_size, payload_size, '\0' * 92)
- # lead
- lead = apply(struct.pack, (self._lead_format, ) + lead_arr)
- output_stream.write(lead)
- self.stream_copy(header_stream, output_stream)
- self.stream_copy(payload_stream, output_stream)
-
- def add_header_flag(self, flag):
- self.header_flags = self.header_flags | flag
-
- def add_payload_flag(self, flag):
- self.payload_flags = self.payload_flags | flag
-
- def reset_header_flags(self):
- self.header_flags = 0
-
- def reset_payload_flags(self):
- self.payload_flags = 0
-
- def _encode_header(self):
- assert(self.header is not None)
- stream = tempfile.TemporaryFile()
- data = xmlrpclib.dumps((_replace_null(self.header), ))
- if self.header_flags & MPM_HEADER_COMPRESSED_GZIP:
- f = gzip.GzipFile(None, "wb", 9, stream)
- f.write(data)
- f.close()
- else:
- stream.write(data)
- stream.flush()
- stream.seek(0, 2)
- size = stream.tell()
- stream.seek(0, 0)
- return stream, size
-
- def _encode_payload(self):
- assert(self.payload_stream is not None)
- stream = tempfile.TemporaryFile()
- if self.payload_flags & MPM_PAYLOAD_COMPRESSED_GZIP:
- f = gzip.GzipFile(None, "wb", 9, stream)
- self.stream_copy(self.payload_stream, f)
- f.close()
- else:
- stream = self.payload_stream
- stream.flush()
- stream.seek(0, 2)
- size = stream.tell()
- stream.seek(0, 0)
- return stream, size
-
- def stream_copy(self, source, dest):
- "Copies data from the source stream to the destination stream"
- while 1:
- buf = source.read(self._buffer_size)
- if not buf:
- break
- dest.write(buf)
-
-
-def _replace_null(obj):
- if obj is None:
- return ''
- if isinstance(obj, ListType):
- return map(_replace_null, obj)
- if isinstance(obj, TupleType):
- return tuple(_replace_null(list(obj)))
- if hasattr(obj, 'items'):
- dict = {}
- for k, v in obj.items():
- dict[_replace_null(k)] = _replace_null(v)
- return dict
- return obj
diff --git a/backend/common/rhn_rpm.py b/backend/common/rhn_rpm.py
deleted file mode 100644
index e1b275e..0000000
--- a/backend/common/rhn_rpm.py
+++ /dev/null
@@ -1,429 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2008 Red Hat, Inc.
-#
-# This software is licensed to you under the GNU General Public License,
-# version 2 (GPLv2). There is NO WARRANTY for this software, express or
-# implied, including the implied warranties of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
-# along with this software; if not, see
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
-#
-# Red Hat trademarks are not licensed under GPLv2. No permission is
-# granted to use or replicate Red Hat trademarks that are incorporated
-# in this software or its documentation.
-#
-
-import os
-import sys
-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
-for sym, val in rpm.__dict__.items():
- if sym[:3] == 'RPM':
- # A constant, probably - import it into our namespace
- globals()[sym] = val
-del sym, val
-
-class InvalidPackageError(Exception):
- pass
-
-# wrapper/proxy class for rpm.Transaction so we can
-# instrument it, etc easily
-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.tsflags = []
- # For rpm 4.0.4
- self._flags = 0
- self._prob_filter = 0
-
- def __getattr__(self, attr):
- return getattr(self.ts, attr)
-
- def getMethod(self, method):
- # in theory, we can override this with
- # profile/etc info
- return getattr(self.ts, method)
-
- # push/pop methods so we don't lose the previous
- # set value, and we can potentially debug a bit
- # easier
- def pushVSFlags(self, flags):
- self.tsflags.append(flags)
- if hasattr(self.ts, 'setVSFlags'):
- 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])
-
- 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)
-
- 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")
-
- def check(self):
- """Check dependencies"""
- if hasattr(self.ts, 'check'):
- f = getattr(self.ts, 'check')
- else:
- f = getattr(self.ts, 'depcheck')
- return f()
-
- 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)
-
-
-
-
-class SharedStateTransaction:
- _shared_state = {}
-
- def __init__(self):
- self.__dict__ = self._shared_state
-
-class RPMReadOnlyTransaction(SharedStateTransaction, RPMTransaction):
- read_only = 1
- def __init__(self):
- SharedStateTransaction.__init__(self)
- if not hasattr(self, 'ts'):
- RPMTransaction.__init__(self)
- # FIXME: replace with macro defination
- self.pushVSFlags(8)
-
-class RPM_Header:
- "Wrapper class for an rpm header - we need to store a flag is_source"
- def __init__(self, hdr, is_source=None):
- self.hdr = hdr
- self.is_source = is_source
- self.packaging = 'rpm'
- self.signatures = []
- self._extract_signatures()
-
- def __getitem__(self, name):
- return self.hdr[name]
-
- def __getattr__(self, name):
- return getattr(self.hdr, name)
-
- def is_signed(self):
- if hasattr(rpm, "RPMTAG_DSAHEADER"):
- dsaheader = self.hdr["dsaheader"]
- else:
- dsaheader = 0
- if self.hdr["siggpg"] or self.hdr["sigpgp"] or dsaheader:
- return 1
- return 0
-
- def _extract_signatures(self):
- header_tags = [
- [rpm.RPMTAG_DSAHEADER, "dsa"],
- [rpm.RPMTAG_RSAHEADER, "rsa"],
- [rpm.RPMTAG_SIGGPG, "gpg"],
- [rpm.RPMTAG_SIGPGP, 'pgp'],
- ]
- for ht, sig_type in header_tags:
- ret = self.hdr[ht]
- if not ret or len(ret) < 17:
- continue
- # Get the key id - hopefully we get it right
- key_id = ret[9:17]
- key_id_len = len(key_id)
- format = "%dB" % key_id_len
- t = struct.unpack(format, key_id)
- format = "%02x" * key_id_len
- key_id = format % t
- self.signatures.append({
- 'signature_type' : sig_type,
- 'key_id' : key_id,
- 'signature' : ret,
- })
-
-def get_header_byte_range(package_file):
- """
- Return the start and end bytes of the rpm header object.
-
- For details of the rpm file format, see:
- http://www.rpm.org/max-rpm/s1-rpm-file-format-rpm-file-format.html
- """
-
- lead_size = 96
-
- # Move past the rpm lead
- package_file.seek(lead_size)
-
- sig_size = get_header_struct_size(package_file)
-
- # Now we can find the start of the actual header.
- header_start = lead_size + sig_size
-
- package_file.seek(header_start)
-
- header_size = get_header_struct_size(package_file)
-
- header_end = header_start + header_size
-
- return (header_start, header_end)
-
-def get_header_struct_size(package_file):
- """
- Compute the size in bytes of the rpm header struct starting at the current
- position in package_file.
- """
- # Move past the header preamble
- package_file.seek(8, 1)
-
- # Read the number of index entries
- header_index = package_file.read(4)
- (header_index_value, ) = struct.unpack('>I', header_index)
-
- # Read the the size of the header data store
- header_store = package_file.read(4)
- (header_store_value, ) = struct.unpack('>I', header_store)
-
- # The total size of the header. Each index entry is 16 bytes long.
- header_size = 8 + 4 + 4 + header_index_value * 16 + header_store_value
-
- # Headers end on an 8-byte boundary. Round out the extra data.
- round_out = header_size % 8
- if round_out != 0:
- header_size = header_size + (8 - round_out)
-
- return header_size
-
-# Loads the package header from a file / stream / file descriptor
-# Raises rpm.error if an error is found, or InvalidPacageError if package is
-# busted
-# XXX Deal with exceptions better
-def get_package_header(filename=None, file=None, fd=None):
- if (filename is None and file is None and fd is None):
- raise ValueError, "No parameters passed"
-
- if filename is not None:
- f = open(filename)
- elif file is not None:
- f = file
- f.seek(0, 0)
- else: # fd is not None
- f = None
-
- if f is None:
- os.lseek(fd, 0, 0)
- file_desc = fd
- else:
- file_desc = f.fileno()
-
- if hasattr(rpm, 'headerFromPackage'):
- hdr, is_source = rpm.headerFromPackage(file_desc)
- if hdr is None:
- raise InvalidPackageError
- else:
- 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()
- nomd5 = getattr(rpm, 'RPMVSF_NOMD5')
- needpayload = getattr(rpm, 'RPMVSF_NEEDPAYLOAD')
- ts.pushVSFlags(~(nomd5 | needpayload))
- hdr = RPMReadOnlyTransaction().hdrFromFdno(file_desc)
- ts.popVSFlags()
- if hdr is None:
- raise InvalidPackageError
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
-
- return RPM_Header(hdr, is_source)
-
-class MatchIterator:
- def __init__(self, tag_name=None, value=None):
- # Query by name, by default
- 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
-
- if value:
- self.mi = method(tag_name, value)
- else:
- self.mi = method(tag_name)
-
- def pattern(self, tag_name, mode, pattern):
- self.mi.pattern(tag_name, mode, pattern)
-
- def next(self):
- try:
- hdr = self.mi.next()
- except StopIteration:
- hdr = None
-
- 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')]
- 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')]
- return RPM_Header(hdr, is_source)
-
-def labelCompare(t1, t2):
- return rpm.labelCompare(t1, t2)
-
-def nvre_compare(t1, t2):
- def build_evr(p):
- evr = [p[3], p[1], p[2]]
- evr = map(str, evr)
- if evr[0] == "":
- evr[0] = None
- return evr
- if t1[0] != t2[0]:
- raise ValueError("You should only compare packages with the same name")
- evr1, evr2 = (build_evr(t1), build_evr(t2))
- return rpm.labelCompare(evr1, evr2)
-
-
-def hdrLabelCompare(hdr1, hdr2):
- """ take two RPMs or headers and compare them for order """
-
- if hdr1['name'] == hdr2['name']:
- hdr1 = [hdr1['epoch'] or None, hdr1['version'], hdr1['release']]
- hdr2 = [hdr2['epoch'] or None, hdr2['version'], hdr2['release']]
- if hdr1[0]:
- hdr1[0] = str(hdr1[0])
- if hdr2[0]:
- hdr2[0] = str(hdr2[0])
- return rpm.labelCompare(hdr1, hdr2)
- elif hdr1['name'] < hdr2['name']:
- return -1
- return 1
-
-
-def rpmLabelCompare(rpmFilename1, rpmFilename2):
- """ take two RPMs and compare them for order """
- return hdrLabelCompare(get_package_header(rpmFilename1),
- get_package_header(rpmFilename2))
-
-
-def sortHeaders(hdrs):
- """ Sorts a list of RPM headers (or RPMs).
- Assertion: they *must* exist.
- """
-
- assert isinstance(hdrs, type([]))
-
- sorted = hdrs[:]
- sorted.sort(hdrLabelCompare)
- return sorted
-
-
-def sortRPMs(rpms):
- """ Sorts a list of RPM files. They *must* exist. """
-
- assert isinstance(rpms, type([]))
-
- # We don't want to use rpmLabelCompare as a sorting mechanism, it would
- # extract the rpm header for each comparison.
- # Build a list of (header, rpm)
- helper = map(lambda x: (get_package_header(x), x), rpms)
-
- # Sort the list using the headers as a comparison
- helper.sort(lambda x, y: hdrLabelCompare(x[0], y[0]))
-
- # Extract the rpm names now
- return map(lambda x: x[1], helper)
-
-
-def getInstalledHeader(rpmName):
- """ quieries the RPM DB for a header matching rpmName. """
-
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_STRCMP, rpmName)
- return mi.next()
-
-
-if __name__ == '__main__':
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_GLOB, "*ker*")
- while 1:
- h = mi.next()
- if not h:
- break
- print h['name']
- sys.exit(1)
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.i386.rpm")
- print dir(hdr)
- # Sources
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.src.rpm")
- hdr2 = headerLoad(hdr.unload())
- print hdr2
- print len(hdr2.keys())
-
-
diff --git a/backend/satellite_tools/reposync.py b/backend/satellite_tools/reposync.py
index 298f740..df548fd 100644
--- a/backend/satellite_tools/reposync.py
+++ b/backend/satellite_tools/reposync.py
@@ -17,8 +17,9 @@ import sys, os, time, grp
from optparse import OptionParser
from common import rhnLib
from server import rhnPackage, rhnSQL, rhnChannel, rhnPackageUpload
-from common import CFG, initCFG, rhn_rpm, rhnLog, fetchTraceback
-from common.rhn_mpm import InvalidPackageError
+from common import CFG, initCFG, rhnLog, fetchTraceback
+from rhn.common import rhn_rpm
+from rhn.common.rhn_mpm import InvalidPackageError
from server.importlib.importLib import IncompletePackage
from server.importlib.backendOracle import OracleBackend
from server.importlib.packageImport import ChannelPackageSubscription
diff --git a/backend/satellite_tools/satCerts.py b/backend/satellite_tools/satCerts.py
index 653c3ad..daaf741 100644
--- a/backend/satellite_tools/satCerts.py
+++ b/backend/satellite_tools/satCerts.py
@@ -27,8 +27,8 @@ import os
from server import rhnSQL
from server.rhnServer import satellite_cert
from common.rhnTB import fetchTraceback
-from common.rhn_rpm import getInstalledHeader
from common.rhnConfig import RHNOptions
+from rhn.common.rhn_rpm import getInstalledHeader
#
# RHN certificate section
diff --git a/backend/satellite_tools/satComputePkgHeaders.py b/backend/satellite_tools/satComputePkgHeaders.py
index 1e50779..54d1ff7 100644
--- a/backend/satellite_tools/satComputePkgHeaders.py
+++ b/backend/satellite_tools/satComputePkgHeaders.py
@@ -55,7 +55,7 @@ sys.modules["_apache"] = sys.modules["__main__"]
from server import rhnSQL
-from common import rhn_rpm
+from rhn.common import rhn_rpm
options_table = [
Option("-v", "--verbose", action="count",
diff --git a/backend/satellite_tools/satsync.py b/backend/satellite_tools/satsync.py
index cbc6ece..db58110 100644
--- a/backend/satellite_tools/satsync.py
+++ b/backend/satellite_tools/satsync.py
@@ -30,7 +30,8 @@ from optparse import Option, OptionParser
# __rhn imports__
from common import CFG, initCFG, initLOG, Traceback, rhnMail, \
- rhnLib, rhnFlags, rhn_rpm
+ rhnLib, rhnFlags
+from rhn.common import rhn_rpm
from server import rhnSQL
from server.rhnSQL import SQLError, SQLSchemaError, SQLConnectError
diff --git a/backend/satellite_tools/updatePackages.py b/backend/satellite_tools/updatePackages.py
index 35a07ba..e2b4247 100644
--- a/backend/satellite_tools/updatePackages.py
+++ b/backend/satellite_tools/updatePackages.py
@@ -25,7 +25,8 @@ import shutil
sys.path.append('/usr/share/rhn')
from optparse import Option, OptionParser
-from common import rhnLib, rhnLog, rhn_rpm, initLOG, CFG, initCFG
+from common import rhnLib, rhnLog, initLOG, CFG, initCFG
+from rhn.common import rhn_rpm
from server.rhnLib import parseRPMFilename
from server import rhnSQL
from server.rhnServer import server_packages
diff --git a/backend/server/basePackageUpload.py b/backend/server/basePackageUpload.py
index ad05f93..faaa329 100644
--- a/backend/server/basePackageUpload.py
+++ b/backend/server/basePackageUpload.py
@@ -20,7 +20,7 @@ import tempfile
from mod_python import apache
from common import CFG, log_debug, rhnFault, rhn_mpm, rhnLib, UserDictCase
-from common.rhn_rpm import get_header_byte_range
+from rhn.common.rhn_rpm import get_header_byte_range
from server import rhnSQL
from server.importlib import importLib, userAuth, mpmSource, backendOracle, \
diff --git a/backend/server/handlers/app/rhn_mpm.py b/backend/server/handlers/app/rhn_mpm.py
index 9ed7df8..d1a2859 100644
--- a/backend/server/handlers/app/rhn_mpm.py
+++ b/backend/server/handlers/app/rhn_mpm.py
@@ -63,7 +63,7 @@ def load_rpm(stream, seekable=1):
# Hmm, maybe an rpm
try:
- import rhn_rpm
+ from rhn.common import rhn_rpm
except ImportError:
raise InvalidPackageError
diff --git a/backend/server/handlers/applet/applet.py b/backend/server/handlers/applet/applet.py
index 3d217cb..956ae2f 100644
--- a/backend/server/handlers/applet/applet.py
+++ b/backend/server/handlers/applet/applet.py
@@ -19,9 +19,9 @@ from rhn.rpclib import xmlrpclib
import random
# common modules imports
-from common import rhnCache, rhnFlags, log_debug, CFG, rhn_rpm, \
- rhnFault
+from common import rhnCache, rhnFlags, log_debug, CFG, rhnFault
from common.rhnTranslate import _
+from rhn.common import rhn_rpm
# server modules imports
from server import rhnChannel, rhnSQL, rhnHandler, rhnLib
diff --git a/backend/server/handlers/xmlrpc/up2date.py b/backend/server/handlers/xmlrpc/up2date.py
index d09e5c0..5f09b87 100644
--- a/backend/server/handlers/xmlrpc/up2date.py
+++ b/backend/server/handlers/xmlrpc/up2date.py
@@ -24,8 +24,9 @@ from rhn import rpclib
from types import ListType, TupleType, StringType, IntType
# common module imports
-from common import CFG, rhnFlags, rhnFault, log_debug, log_error, rhn_rpm
+from common import CFG, rhnFlags, rhnFault, log_debug, log_error
from common.rhnTranslate import _
+from rhn.common import rhn_rpm
# local module imports
from server.rhnLib import computeSignature
diff --git a/backend/server/handlers/xp/rhnlint.py b/backend/server/handlers/xp/rhnlint.py
index f67736f..b4175ec 100644
--- a/backend/server/handlers/xp/rhnlint.py
+++ b/backend/server/handlers/xp/rhnlint.py
@@ -18,7 +18,8 @@
import time
import string
-from common import RPC_Base, log_debug, rhn_rpm
+from common import RPC_Base, log_debug
+from rhn.common import rhn_rpm
from server import rhnSQL
diff --git a/backend/server/importlib/backend.py b/backend/server/importlib/backend.py
index e259f02..d2b4cf7 100644
--- a/backend/server/importlib/backend.py
+++ b/backend/server/importlib/backend.py
@@ -22,7 +22,8 @@ import string
import re
import sys
-from common import rhnFault, rhn_rpm, CFG
+from common import rhnFault, CFG
+from rhn.common import rhn_rpm
from server import rhnSQL, rhnChannel, taskomatic
from importLib import Diff, Package, IncompletePackage, Erratum, \
AlreadyUploadedError, InvalidPackageError, TransactionError, \
diff --git a/backend/server/importlib/packageUpload.py b/backend/server/importlib/packageUpload.py
index a40ac72..492d323 100644
--- a/backend/server/importlib/packageUpload.py
+++ b/backend/server/importlib/packageUpload.py
@@ -17,7 +17,8 @@
# Package import code on the app side
#
-from common import rhnFault, rhn_rpm, log_debug
+from common import rhnFault, log_debug
+from rhn.common import rhn_rpm
from server import rhnChannel, taskomatic, rhnSQL
from server.importlib.headerSource import createPackage
diff --git a/backend/server/rhnChannel.py b/backend/server/rhnChannel.py
index 335afee..e8d875f 100644
--- a/backend/server/rhnChannel.py
+++ b/backend/server/rhnChannel.py
@@ -22,9 +22,10 @@ from rhn.rpclib import xmlrpclib
from types import IntType, ListType, DictType
# common module
-from common import log_debug, log_error, rhnFault, rhnException, rhnCache, rhnFlags, CFG, rhn_rpm
+from common import log_debug, log_error, rhnFault, rhnException, rhnCache, rhnFlags, CFG
from common.rhnTranslate import _
from common.rhnLib import startswith
+from rhn.common import rhn_rpm
from rhnServer import server_lib
from rhnDependency import MakeEvrError
diff --git a/backend/server/rhnPackageUpload.py b/backend/server/rhnPackageUpload.py
index 46b57a7..65ce811 100644
--- a/backend/server/rhnPackageUpload.py
+++ b/backend/server/rhnPackageUpload.py
@@ -19,7 +19,7 @@ import os
import tempfile
from common import CFG, log_debug, rhnFault, rhn_mpm, rhnLib, UserDictCase
-from common.rhn_rpm import get_header_byte_range
+from rhn.common.rhn_rpm import get_header_byte_range
from server import rhnSQL
from server.importlib import importLib, userAuth, mpmSource, backendOracle, \
diff --git a/backend/server/rhnServer/server_class.py b/backend/server/rhnServer/server_class.py
index 4605250..dead358 100644
--- a/backend/server/rhnServer/server_class.py
+++ b/backend/server/rhnServer/server_class.py
@@ -21,8 +21,9 @@ import string
# Global Modules
from common import rhnException, rhnFault, log_debug, log_error, CFG
-from common import rhnFlags, rhn_rpm
+from common import rhnFlags
from common.rhnTranslate import _
+from rhn.common import rhn_rpm
# from the server stuff...
from server import rhnChannel, rhnUser, rhnSQL, rhnLib, rhnAction, \
diff --git a/backend/server/rhnServer/server_packages.py b/backend/server/rhnServer/server_packages.py
index d3eac96..42225e8 100644
--- a/backend/server/rhnServer/server_packages.py
+++ b/backend/server/rhnServer/server_packages.py
@@ -22,7 +22,8 @@ import string
import time
from types import DictType, TupleType
-from common import log_debug, rhn_rpm, rhnFault
+from common import log_debug, rhnFault
+from rhn.common import rhn_rpm
from server import rhnSQL, rhnLib
from server_lib import snapshot_server, check_entitlement
commit dc95bf9a5361c8dc62aeb283b82be21fee97deac
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 11:06:54 2009 +0100
rhn_rpm/rhn_mpm merge: added rhn_mpm.py to rhnlib
diff --git a/client/rhel/rhnlib/rhn/common/rhn_mpm.py b/client/rhel/rhnlib/rhn/common/rhn_mpm.py
new file mode 100644
index 0000000..400f5d2
--- /dev/null
+++ b/client/rhel/rhnlib/rhn/common/rhn_mpm.py
@@ -0,0 +1,278 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2008 Red Hat, Inc.
+#
+# This software is licensed to you under the GNU General Public License,
+# version 2 (GPLv2). There is NO WARRANTY for this software, express or
+# implied, including the implied warranties of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+# along with this software; if not, see
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+#
+# Red Hat trademarks are not licensed under GPLv2. No permission is
+# granted to use or replicate Red Hat trademarks that are incorporated
+# in this software or its documentation.
+#
+
+import os
+import gzip
+import cStringIO
+import tempfile
+from rhn.rpclib import xmlrpclib
+
+import struct
+
+from types import ListType, TupleType
+
+def labelCompare(l1, l2):
+ try:
+ import rhn_rpm
+ except ImportError:
+ # rhn_rpm not avalable; return a dummy comparison function
+ return -1
+ return rhn_rpm.labelCompare(l1, l2)
+
+def get_package_header(filename=None, file=None, fd=None):
+ return load(filename=filename, file=file, fd=fd)[0]
+
+# Loads an MPM and returns its header and its payload
+def load(filename=None, file=None, fd=None):
+ if (filename is None and file is None and fd is None):
+ raise ValueError, "No parameters passed"
+
+ if filename is not None:
+ f = open(filename)
+ elif file is not None:
+ f = file
+ else: # fd is not None
+ f = os.fdopen(os.dup(fd), "r")
+
+ f.seek(0, 0)
+
+ p = MPM_Package()
+ try:
+ p.load(f)
+ except InvalidPackageError, e:
+ try:
+ return load_rpm(f)
+ except InvalidPackageError:
+ raise e
+
+ return p.header, p.payload_stream
+
+def load_rpm(stream):
+ # Hmm, maybe an rpm
+
+ try:
+ import rhn_rpm
+ except ImportError:
+ raise InvalidPackageError
+
+ # Dup the file descriptor, we don't want it to get closed before we read
+ # the payload
+ newfd = os.dup(stream.fileno())
+ stream = os.fdopen(newfd, "r")
+
+ stream.flush()
+ stream.seek(0, 0)
+
+ try:
+ header = rhn_rpm.get_package_header(file=stream)
+ except rhn_rpm.InvalidPackageError, e:
+ raise apply(InvalidPackageError, e.args)
+ except rhn_rpm.error, e:
+ raise InvalidPackageError(e)
+ stream.seek(0, 0)
+
+ return header, stream
+
+class MPM_Header:
+ "Wrapper class for an mpm header - we need to store a flag is_source"
+ def __init__(self, hdr):
+ self.hdr = hdr
+ self.is_source = hdr.get('is_source')
+ self.packaging = 'mpm'
+ self.signatures = []
+
+ def __getitem__(self, name):
+ return self.hdr.get(name)
+
+ def __getattr__(self, name):
+ return getattr(self.hdr, name)
+
+ def is_signed(self):
+ return 0
+
+class InvalidPackageError(Exception):
+ pass
+
+MPM_HEADER_COMPRESSED_GZIP = 1
+MPM_PAYLOAD_COMPRESSED_GZIP = 1
+
+class MPM_Package:
+ _lead_format = '!16sB3s4L92s'
+ _magic = 'mpmpackage012345'
+ def __init__(self):
+ self.header = None
+ self.payload_stream = None
+ self.header_flags = MPM_HEADER_COMPRESSED_GZIP
+ self.payload_flags = 0
+ assert(len(self._magic) == 16)
+ self._buffer_size = 16384
+
+ def _read_lead(self, stream):
+ # Lead has the following format:
+ # 16 bytes magic
+ # 1 bytes version
+ # 3 bytes unused
+ # 4 bytes header flags
+ # 4 bytes payload flags
+ # 4 bytes header length
+ # 4 bytes payload length
+ # 92 bytes padding to 128 bytes
+ lead = self._read_bytes(stream, 128)
+ if len(lead) != 128:
+ raise InvalidPackageError()
+
+ arr = struct.unpack(self._lead_format, lead)
+ return arr
+
+ def load(self, input_stream):
+ # Clean up
+ self.__init__()
+ arr = self._read_lead(input_stream)
+ magic = arr[0]
+ if magic != self._magic:
+ raise InvalidPackageError()
+ header_len, payload_len = int(arr[5]), int(arr[6])
+ header_flags, payload_flags = arr[3], arr[4]
+ file_size = 128 + header_len + payload_len
+ input_stream.seek(file_size)
+ if file_size != input_stream.tell():
+ raise InvalidPackageError()
+ # Read the header
+ input_stream.seek(128, 0)
+ header_data = self._read_bytes(input_stream, header_len)
+ payload_stream = tempfile.TemporaryFile()
+ self.stream_copy(input_stream, payload_stream)
+
+ self._read_header(header_data, header_flags)
+ self._read_payload(payload_stream, payload_flags)
+
+ def _read_bytes(self, stream, amt):
+ ret = ""
+ while amt:
+ buf = stream.read(min(amt, self._buffer_size))
+ if not buf:
+ return ret
+ ret = ret + buf
+ amt = amt - len(buf)
+ return ret
+
+ def _read_header(self, header_data, header_flags):
+ if header_flags & MPM_HEADER_COMPRESSED_GZIP:
+ t = cStringIO.StringIO(header_data)
+ g = gzip.GzipFile(None, "r", 0, t)
+ header_data = g.read()
+ g.close()
+ t.close()
+
+ try:
+ params, foo = xmlrpclib.loads(header_data)
+ except:
+ # XXX
+ raise
+
+ self.header = MPM_Header(params[0])
+
+ def _read_payload(self, payload_stream, payload_flags):
+ payload_stream.seek(0, 0)
+ if payload_flags & MPM_PAYLOAD_COMPRESSED_GZIP:
+ g = gzip.GzipFile(None, "r", 0, payload_stream)
+ t = tempfile.TemporaryFile()
+ self.stream_copy(g, t)
+ g.close()
+ payload_stream = t
+
+ self.payload_stream = payload_stream
+
+ def write(self, output_stream):
+ if self.header is None:
+ raise Exception()
+
+ header_stream, header_size = self._encode_header()
+ payload_stream, payload_size = self._encode_payload()
+
+ lead_arr = (self._magic, 1, "\0" * 3, self.header_flags,
+ self.payload_flags, header_size, payload_size, '\0' * 92)
+ # lead
+ lead = apply(struct.pack, (self._lead_format, ) + lead_arr)
+ output_stream.write(lead)
+ self.stream_copy(header_stream, output_stream)
+ self.stream_copy(payload_stream, output_stream)
+
+ def add_header_flag(self, flag):
+ self.header_flags = self.header_flags | flag
+
+ def add_payload_flag(self, flag):
+ self.payload_flags = self.payload_flags | flag
+
+ def reset_header_flags(self):
+ self.header_flags = 0
+
+ def reset_payload_flags(self):
+ self.payload_flags = 0
+
+ def _encode_header(self):
+ assert(self.header is not None)
+ stream = tempfile.TemporaryFile()
+ data = xmlrpclib.dumps((_replace_null(self.header), ))
+ if self.header_flags & MPM_HEADER_COMPRESSED_GZIP:
+ f = gzip.GzipFile(None, "wb", 9, stream)
+ f.write(data)
+ f.close()
+ else:
+ stream.write(data)
+ stream.flush()
+ stream.seek(0, 2)
+ size = stream.tell()
+ stream.seek(0, 0)
+ return stream, size
+
+ def _encode_payload(self):
+ assert(self.payload_stream is not None)
+ stream = tempfile.TemporaryFile()
+ if self.payload_flags & MPM_PAYLOAD_COMPRESSED_GZIP:
+ f = gzip.GzipFile(None, "wb", 9, stream)
+ self.stream_copy(self.payload_stream, f)
+ f.close()
+ else:
+ stream = self.payload_stream
+ stream.flush()
+ stream.seek(0, 2)
+ size = stream.tell()
+ stream.seek(0, 0)
+ return stream, size
+
+ def stream_copy(self, source, dest):
+ "Copies data from the source stream to the destination stream"
+ while 1:
+ buf = source.read(self._buffer_size)
+ if not buf:
+ break
+ dest.write(buf)
+
+
+def _replace_null(obj):
+ if obj is None:
+ return ''
+ if isinstance(obj, ListType):
+ return map(_replace_null, obj)
+ if isinstance(obj, TupleType):
+ return tuple(_replace_null(list(obj)))
+ if hasattr(obj, 'items'):
+ dict = {}
+ for k, v in obj.items():
+ dict[_replace_null(k)] = _replace_null(v)
+ return dict
+ return obj
commit 909751ff1df943d685e41ee63b63c4f0b187b719
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 10:37:25 2009 +0100
rhn_rpm/rhn_mpm merge: added common subdir into rpm package
diff --git a/client/rhel/rhnlib/setup.py.in b/client/rhel/rhnlib/setup.py.in
index 35d5028..99a8c59 100644
--- a/client/rhel/rhnlib/setup.py.in
+++ b/client/rhel/rhnlib/setup.py.in
@@ -15,7 +15,7 @@ Red Hat Network (http://rhn.redhat.com) software.""",
author = 'Mihai Ibanescu',
author_email = 'misa(a)redhat.com',
url = 'http://rhn.redhat.com',
- packages = ["rhn"],
+ packages = ["rhn", "rhn/common"],
license = "GPL",
)
commit 0fe8c31ecf5726d49f22bbd67a2cc630abcdeb32
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Dec 4 11:08:25 2009 +0100
rhn_rpm/rhn_mpm merge: added rhn_rpm.py to rhnlib
diff --git a/client/rhel/rhnlib/rhn/common/rhn_rpm.py b/client/rhel/rhnlib/rhn/common/rhn_rpm.py
new file mode 100644
index 0000000..0ff9965
--- /dev/null
+++ b/client/rhel/rhnlib/rhn/common/rhn_rpm.py
@@ -0,0 +1,429 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2008 Red Hat, Inc.
+#
+# This software is licensed to you under the GNU General Public License,
+# version 2 (GPLv2). There is NO WARRANTY for this software, express or
+# implied, including the implied warranties of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+# along with this software; if not, see
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+#
+# Red Hat trademarks are not licensed under GPLv2. No permission is
+# granted to use or replicate Red Hat trademarks that are incorporated
+# in this software or its documentation.
+#
+
+import os
+import sys
+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
+for sym, val in rpm.__dict__.items():
+ if sym[:3] == 'RPM':
+ # A constant, probably - import it into our namespace
+ globals()[sym] = val
+del sym, val
+
+class InvalidPackageError(Exception):
+ pass
+
+# wrapper/proxy class for rpm.Transaction so we can
+# instrument it, etc easily
+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.tsflags = []
+ # For rpm 4.0.4
+ self._flags = 0
+ self._prob_filter = 0
+
+ def __getattr__(self, attr):
+ return getattr(self.ts, attr)
+
+ def getMethod(self, method):
+ # in theory, we can override this with
+ # profile/etc info
+ return getattr(self.ts, method)
+
+ # push/pop methods so we don't lose the previous
+ # set value, and we can potentially debug a bit
+ # easier
+ def pushVSFlags(self, flags):
+ self.tsflags.append(flags)
+ if hasattr(self.ts, 'setVSFlags'):
+ 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])
+
+ 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)
+
+ 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")
+
+ def check(self):
+ """Check dependencies"""
+ if hasattr(self.ts, 'check'):
+ f = getattr(self.ts, 'check')
+ else:
+ f = getattr(self.ts, 'depcheck')
+ return f()
+
+ 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)
+
+
+
+
+class SharedStateTransaction:
+ _shared_state = {}
+
+ def __init__(self):
+ self.__dict__ = self._shared_state
+
+class RPMReadOnlyTransaction(SharedStateTransaction, RPMTransaction):
+ read_only = 1
+ def __init__(self):
+ SharedStateTransaction.__init__(self)
+ if not hasattr(self, 'ts'):
+ RPMTransaction.__init__(self)
+ # FIXME: replace with macro defination
+ self.pushVSFlags(8)
+
+class RPM_Header:
+ "Wrapper class for an rpm header - we need to store a flag is_source"
+ def __init__(self, hdr, is_source=None):
+ self.hdr = hdr
+ self.is_source = is_source
+ self.packaging = 'rpm'
+ self.signatures = []
+ self._extract_signatures()
+
+ def __getitem__(self, name):
+ return self.hdr[name]
+
+ def __getattr__(self, name):
+ return getattr(self.hdr, name)
+
+ def is_signed(self):
+ if hasattr(rpm, "RPMTAG_DSAHEADER"):
+ dsaheader = self.hdr["dsaheader"]
+ else:
+ dsaheader = 0
+ if self.hdr["siggpg"] or self.hdr["sigpgp"] or dsaheader:
+ return 1
+ return 0
+
+ def _extract_signatures(self):
+ header_tags = [
+ [rpm.RPMTAG_DSAHEADER, "dsa"],
+ [rpm.RPMTAG_RSAHEADER, "rsa"],
+ [rpm.RPMTAG_SIGGPG, "gpg"],
+ [rpm.RPMTAG_SIGPGP, 'pgp'],
+ ]
+ for ht, sig_type in header_tags:
+ ret = self.hdr[ht]
+ if not ret or len(ret) < 17:
+ continue
+ # Get the key id - hopefully we get it right
+ key_id = ret[9:17]
+ key_id_len = len(key_id)
+ format = "%dB" % key_id_len
+ t = struct.unpack(format, key_id)
+ format = "%02x" * key_id_len
+ key_id = format % t
+ self.signatures.append({
+ 'signature_type' : sig_type,
+ 'key_id' : key_id,
+ 'signature' : ret,
+ })
+
+def get_header_byte_range(package_file):
+ """
+ Return the start and end bytes of the rpm header object.
+
+ For details of the rpm file format, see:
+ http://www.rpm.org/max-rpm/s1-rpm-file-format-rpm-file-format.html
+ """
+
+ lead_size = 96
+
+ # Move past the rpm lead
+ package_file.seek(lead_size)
+
+ sig_size = get_header_struct_size(package_file)
+
+ # Now we can find the start of the actual header.
+ header_start = lead_size + sig_size
+
+ package_file.seek(header_start)
+
+ header_size = get_header_struct_size(package_file)
+
+ header_end = header_start + header_size
+
+ return (header_start, header_end)
+
+def get_header_struct_size(package_file):
+ """
+ Compute the size in bytes of the rpm header struct starting at the current
+ position in package_file.
+ """
+ # Move past the header preamble
+ package_file.seek(8, 1)
+
+ # Read the number of index entries
+ header_index = package_file.read(4)
+ (header_index_value, ) = struct.unpack('>I', header_index)
+
+ # Read the the size of the header data store
+ header_store = package_file.read(4)
+ (header_store_value, ) = struct.unpack('>I', header_store)
+
+ # The total size of the header. Each index entry is 16 bytes long.
+ header_size = 8 + 4 + 4 + header_index_value * 16 + header_store_value
+
+ # Headers end on an 8-byte boundary. Round out the extra data.
+ round_out = header_size % 8
+ if round_out != 0:
+ header_size = header_size + (8 - round_out)
+
+ return header_size
+
+# Loads the package header from a file / stream / file descriptor
+# Raises rpm.error if an error is found, or InvalidPacageError if package is
+# busted
+# XXX Deal with exceptions better
+def get_package_header(filename=None, file=None, fd=None):
+ if (filename is None and file is None and fd is None):
+ raise ValueError, "No parameters passed"
+
+ if filename is not None:
+ f = open(filename)
+ elif file is not None:
+ f = file
+ f.seek(0, 0)
+ else: # fd is not None
+ f = None
+
+ if f is None:
+ os.lseek(fd, 0, 0)
+ file_desc = fd
+ else:
+ file_desc = f.fileno()
+
+ if hasattr(rpm, 'headerFromPackage'):
+ hdr, is_source = rpm.headerFromPackage(file_desc)
+ if hdr is None:
+ raise InvalidPackageError
+ else:
+ 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()
+ nomd5 = getattr(rpm, 'RPMVSF_NOMD5')
+ needpayload = getattr(rpm, 'RPMVSF_NEEDPAYLOAD')
+ ts.pushVSFlags(~(nomd5 | needpayload))
+ hdr = RPMReadOnlyTransaction().hdrFromFdno(file_desc)
+ ts.popVSFlags()
+ if hdr is None:
+ raise InvalidPackageError
+ is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
+
+ return RPM_Header(hdr, is_source)
+
+class MatchIterator:
+ def __init__(self, tag_name=None, value=None):
+ # Query by name, by default
+ 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
+
+ if value:
+ self.mi = method(tag_name, value)
+ else:
+ self.mi = method(tag_name)
+
+ def pattern(self, tag_name, mode, pattern):
+ self.mi.pattern(tag_name, mode, pattern)
+
+ def next(self):
+ try:
+ hdr = self.mi.next()
+ except StopIteration:
+ hdr = None
+
+ 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')]
+ 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')]
+ return RPM_Header(hdr, is_source)
+
+def labelCompare(t1, t2):
+ return rpm.labelCompare(t1, t2)
+
+def nvre_compare(t1, t2):
+ def build_evr(p):
+ evr = [p[3], p[1], p[2]]
+ evr = map(str, evr)
+ if evr[0] == "":
+ evr[0] = None
+ return evr
+ if t1[0] != t2[0]:
+ raise ValueError("You should only compare packages with the same name")
+ evr1, evr2 = (build_evr(t1), build_evr(t2))
+ return rpm.labelCompare(evr1, evr2)
+
+
+def hdrLabelCompare(hdr1, hdr2):
+ """ take two RPMs or headers and compare them for order """
+
+ if hdr1['name'] == hdr2['name']:
+ hdr1 = [hdr1['epoch'] or None, hdr1['version'], hdr1['release']]
+ hdr2 = [hdr2['epoch'] or None, hdr2['version'], hdr2['release']]
+ if hdr1[0]:
+ hdr1[0] = str(hdr1[0])
+ if hdr2[0]:
+ hdr2[0] = str(hdr2[0])
+ return rpm.labelCompare(hdr1, hdr2)
+ elif hdr1['name'] < hdr2['name']:
+ return -1
+ return 1
+
+
+def rpmLabelCompare(rpmFilename1, rpmFilename2):
+ """ take two RPMs and compare them for order """
+ return hdrLabelCompare(get_package_header(rpmFilename1),
+ get_package_header(rpmFilename2))
+
+
+def sortHeaders(hdrs):
+ """ Sorts a list of RPM headers (or RPMs).
+ Assertion: they *must* exist.
+ """
+
+ assert isinstance(hdrs, type([]))
+
+ sorted = hdrs[:]
+ sorted.sort(hdrLabelCompare)
+ return sorted
+
+
+def sortRPMs(rpms):
+ """ Sorts a list of RPM files. They *must* exist. """
+
+ assert isinstance(rpms, type([]))
+
+ # We don't want to use rpmLabelCompare as a sorting mechanism, it would
+ # extract the rpm header for each comparison.
+ # Build a list of (header, rpm)
+ helper = map(lambda x: (get_package_header(x), x), rpms)
+
+ # Sort the list using the headers as a comparison
+ helper.sort(lambda x, y: hdrLabelCompare(x[0], y[0]))
+
+ # Extract the rpm names now
+ return map(lambda x: x[1], helper)
+
+
+def getInstalledHeader(rpmName):
+ """ quieries the RPM DB for a header matching rpmName. """
+
+ mi = MatchIterator("name")
+ mi.pattern("name", rpm.RPMMIRE_STRCMP, rpmName)
+ return mi.next()
+
+
+if __name__ == '__main__':
+ mi = MatchIterator("name")
+ mi.pattern("name", rpm.RPMMIRE_GLOB, "*ker*")
+ while 1:
+ h = mi.next()
+ if not h:
+ break
+ print h['name']
+ sys.exit(1)
+ hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.i386.rpm")
+ print dir(hdr)
+ # Sources
+ hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.src.rpm")
+ hdr2 = headerLoad(hdr.unload())
+ print hdr2
+ print len(hdr2.keys())
+
+
14 years, 4 months
web/modules
by Justin Sherrill
web/modules/pxt/PXT/ApacheHandler.pm | 11 +++++++++++
1 file changed, 11 insertions(+)
New commits:
commit bf6ea40068d6bc5f7ef4241b619b1747f7ba7b82
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Thu Dec 3 11:41:33 2009 -0500
529483 - adding referer check to perl stack
diff --git a/web/modules/pxt/PXT/ApacheHandler.pm b/web/modules/pxt/PXT/ApacheHandler.pm
index 4a37404..a06a187 100644
--- a/web/modules/pxt/PXT/ApacheHandler.pm
+++ b/web/modules/pxt/PXT/ApacheHandler.pm
@@ -53,6 +53,7 @@ our $make_vile;
sub handler {
my $r = shift;
+
local $make_vile = 0;
$ENV{PATH} = "/bin:/usr/sbin";
@@ -73,6 +74,16 @@ sub handler {
my $cookies = $r->pnotes('pxt_cookies');
my $request = $r->pnotes('pxt_request');
+ #verify referer hostname is correct
+ my $referer = $r->headers_in->{'referer'};
+ if ($referer) {
+ my $hostname = $r->hostname;
+ my $ref_host = URI->new($referer)->host;
+ if ($hostname ne $ref_host) {
+ return PXT::ApacheHandler->handle_redirect($r, $request, "/rhn/YourRhn.do");
+ }
+ }
+
# Load API exceptions
my $exception_box = RHN::API::Exception->exception_box;
14 years, 4 months
satellite/install
by Michael Mraka
satellite/install/install.pl | 13 +
satellite/install/installPackages.py | 234 ---------------------
satellite/install/rhn_rpm.py | 364 ---------------------------------
satellite/install/satErrors.py | 380 -----------------------------------
satellite/install/satLog.py | 116 ----------
satellite/install/translate.py | 112 ----------
6 files changed, 12 insertions(+), 1207 deletions(-)
New commits:
commit 618a7b3d9f2a072ae1ce89b8308eeaa7e68fb3b9
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Thu Dec 3 16:16:42 2009 +0100
replaced installPackages.py & company with several lines in perl
diff --git a/satellite/install/install.pl b/satellite/install/install.pl
index 74c5b6e..0ccd063 100755
--- a/satellite/install/install.pl
+++ b/satellite/install/install.pl
@@ -971,9 +971,20 @@ sub install_rhn_packages {
26,
'Could not install RHN packages. Most likely your system is not configured with the @Base package group. See the RHN Satellite Server Installation Guide for more information about Software Requirements.');
} else {
- system_or_exit(['python', '-u', 'install/installPackages.py'],
+ my @rpms = glob("Satellite/*.rpm EmbeddedDB/*.rpm");
+
+ # skip packages already installed or newer version already installed
+ for my $i (0..$#rpms) {
+ my $ret = system ("rpm -U --test --nodeps --quiet 2>/dev/null $rpms[$i]");
+ if ($ret != 0) {
+ delete($rpms[$i]);
+ }
+ }
+ if (@rpms) {
+ system_or_exit(['rpm', '-Uv', @rpms],
26,
'Could not install RHN packages. Most likely your system is not configured with the @Base package group. See the RHN Satellite Server Installation Guide for more information about Software Requirements.');
+ }
}
return 1;
}
diff --git a/satellite/install/installPackages.py b/satellite/install/installPackages.py
deleted file mode 100755
index 178d124..0000000
--- a/satellite/install/installPackages.py
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/python -u
-""" Install RHN product specific RPMs
-
- Copyright (c) 2002-2005, Red Hat, Inc.
- All rights reserved.
-"""
-# $Id: installPackages.py,v 1.25 2006-01-05 15:45:22 misa Exp $
-
-import os
-import sys
-import glob
-from translate import _
-
-import rhn_rpm
-import satLog
-from satErrors import *
-
-def systemExit(code, msgs=None):
- "Exit with a code and optional message(s). Saved a few lines of code."
-
- if msgs:
- if type(msgs) not in [type([]), type(())]:
- msgs = (msgs, )
- for msg in msgs:
- sys.stderr.write(str(msg)+'\n')
- sys.exit(code)
-
-
-def getInstalledPackageList():
- list = []
-
- mi = rhn_rpm.MatchIterator("name")
- while 1:
- h = mi.next()
- if not h:
- break
- epoch = h['epoch']
- if epoch is None:
- epoch = ""
- entry = (h['name'], h['version'], h['release'], epoch, h['arch'])
- list.append(entry)
- list.sort(lambda a, b: cmp(a[0], b[0]))
- return list
-
-
-def getListOfPackagesToInstall(rpmPath):
- # or if we decide to use a manifest, do it here
- globPattern = "%s/*.rpm" % rpmPath
-
- packagesToInstall = {}
- installedPackages = getInstalledPackageList()
- # Hash them by name
- installedPackagesDict = {}
- for package in installedPackages:
- name = package[0]
- installedPackagesDict[name] = package
-
- availablePackages = {}
- filenames = glob.glob(globPattern)
- for filename in filenames:
- hdr = rhn_rpm.get_package_header(filename=filename)
- epoch = hdr['epoch']
- if epoch is None:
- epoch = ""
- name = hdr['name']
- nvre = (name, hdr['version'], hdr['release'], epoch)
- availablePackages[nvre] = filename
-
- if not installedPackagesDict.has_key(name):
- # We need to install this nevertheless
- packagesToInstall[name] = filename
- continue
-
- installedPackage = installedPackagesDict[name]
- ret = rhn_rpm.nvre_compare(installedPackage, nvre)
-
- if ret >= 0:
- # already installed or older than what we have installed
- continue
-
- packagesToInstall[name] = filename
-
- return packagesToInstall.values()
-
-
-def installPackages(filenames, rpmPath, rpmCallback):
- if not filenames:
- # Nothing to do, moving on
- return 0
-
- ts = rhn_rpm.RPMTransaction()
-
- for filename in filenames:
- hdr = rhn_rpm.get_package_header(filename=filename)
- if hdr is None:
- raise RpmError(_("Error reading header from package %s") %
- filename)
- ts.addInstall(hdr, hdr, 'u')
-
- deps = ts.check()
-
- # make this smarter, duh
- if deps:
- raise DependencyError(_(
- "Dependencies should have already been resolved, "\
- "but they are not."), deps)
-
- ts.order()
- rc = ts.run(rpmCallback, rpmPath)
-
- if rc:
- errors = "\n"
- for e in rc:
- try:
- errors = errors + e[1] + "\n"
- except:
- errors = errors + str(e) + "\n"
- raise RpmError(_("Failed installing packages: %s") % errors)
-
- return 0
-
-class RPM_Callback:
- def __init__(self, total):
- self.total = total
- self.installed = 0
- self.message_template = "%%%ds/%%s Installing %%s" % len(str(self.total))
-
- def callback(self, what, amount, total, hdr, path):
- if what == rhn_rpm.RPMCALLBACK_INST_OPEN_FILE:
- fileName = "%s/%s-%s-%s.%s.rpm" % (path,
- hdr['name'],
- hdr['version'],
- hdr['release'],
- hdr['arch'])
- try:
- fd = os.open(fileName, os.O_RDONLY)
- except :
- print _("Error opening %s") % fileName
- raise RpmError(_("Error opening %s") % fileName)
-
- return fd
-
- if what == rhn_rpm.RPMCALLBACK_INST_START:
- fileName = "%s/%s-%s-%s.%s.rpm" % (path,
- hdr['name'],
- hdr['version'],
- hdr['release'],
- hdr['arch'])
- self.installed = self.installed + 1
- print self.message_template % (self.installed, self.total,
- fileName)
- elif what == rhn_rpm.RPMCALLBACK_INST_CLOSE_FILE:
- try:
- os.close(fd)
- except:
- pass
-
- elif what == rhn_rpm.RPMCALLBACK_INST_PROGRESS:
- pass
-
- elif what == rhn_rpm.RPMCALLBACK_UNINST_STOP:
- pass
-
- else:
- if hasattr(rhn_rpm, "RPMCALLBACK_UNPACK_ERROR") and \
- what == rhn_rpm.RPMCALLBACK_UNPACK_ERROR:
- pkg = "%s-%s-%s" % (hdr[rhn_rpm.RPMTAG_NAME],
- hdr[rhn_rpm.RPMTAG_VERSION],
- hdr[rhn_rpm.RPMTAG_RELEASE])
- raise RpmError(_("There was a rpm unpack error installing "
- "the package: %s") % pkg)
-
- if hasattr(rhn_rpm, "RPMCALLBACK_CPIO_ERROR") and \
- what == rhn_rpm.RPMCALLBACK_CPIO_ERROR:
- pkg = "%s-%s-%s" % (hdr[rhn_rpm.RPMTAG_NAME],
- hdr[rhn_rpm.RPMTAG_VERSION],
- hdr[rhn_rpm.RPMTAG_RELEASE])
- raise RpmError(_("There was a cpio error installing "
- "the package: %s") % pkg)
-
-
-def doInstallation(rpms_dir):
- pkgList = getListOfPackagesToInstall(rpms_dir)
- if not pkgList:
- print "All required packages are already installed"
- return 0
-
- #do it
- # may raise a DependencyError
- installPackages(pkgList, rpms_dir, RPM_Callback(len(pkgList)).callback)
-
- print "All required packages have been installed"
-
- return 0
-
-
-def main():
- os.chdir(os.path.dirname(sys.argv[0]))
-
- rpmdir = "../*"
- doInstallation(rpmdir)
-
- return 0
-
-
-if __name__ == "__main__":
- # 0 - all is well
- # -1 - help called
- # -2 - initLog failed
- # -3 - base directory access error
- # -4 - extra args on commandline
- # -5 - RpmError
- # -6 - rpm DependencyError
- # -100 - ^C
- try:
- satLog.initLog()
- except (OSError, IOError), e:
- systemExit(-2, "Unable to open log file. The error was: %s" % e)
-
- try:
- sys.exit(main() or 0)
- except KeyboardInterrupt, e:
- systemExit(-100, "User interrupted process")
- except (OSError, IOError), e:
- systemExit(-3, "Error accessing base directory: %s" % e)
- except ValueError, e:
- msg = "ERROR: these arguments make no sense in this context (try --help): %s\n" % repr(e.args)
- systemExit(-4, msg)
- except RpmError, e:
- systemExit(-5, repr(e))
- except DependencyError, e:
- systemExit(-6, 'ERROR: %s\n' % repr(e))
-
-
diff --git a/satellite/install/rhn_rpm.py b/satellite/install/rhn_rpm.py
deleted file mode 100644
index 9542cb1..0000000
--- a/satellite/install/rhn_rpm.py
+++ /dev/null
@@ -1,364 +0,0 @@
-#!/usr/bin/python
-#
-# Compatibility layer for rpm
-#
-# Copyright (c) 2004-2005, Red Hat Inc.
-# All rights reserved.
-#
-# $Id: rhn_rpm.py,v 1.9 2005-07-05 17:50:13 wregglej Exp $
-
-import os
-import sys
-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
-for sym, val in rpm.__dict__.items():
- if sym[:3] == 'RPM':
- # A constant, probably - import it into our namespace
- globals()[sym] = val
-del sym, val
-
-class InvalidPackageError(Exception):
- pass
-
-# wrapper/proxy class for rpm.Transaction so we can
-# instrument it, etc easily
-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.tsflags = []
- # For rpm 4.0.4
- self._flags = 0
- self._prob_filter = 0
-
- def __getattr__(self, attr):
- return getattr(self.ts, attr)
-
- def getMethod(self, method):
- # in theory, we can override this with
- # profile/etc info
- return getattr(self.ts, method)
-
- # push/pop methods so we don't lose the previous
- # set value, and we can potentially debug a bit
- # easier
- def pushVSFlags(self, flags):
- self.tsflags.append(flags)
- if hasattr(self.ts, 'setVSFlags'):
- 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])
-
- 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)
-
- 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")
-
- def check(self):
- """Check dependencies"""
- if hasattr(self.ts, 'check'):
- f = getattr(self.ts, 'check')
- else:
- f = getattr(self.ts, 'depcheck')
- return f()
-
- 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)
-
-
-
-
-class SharedStateTransaction:
- _shared_state = {}
-
- def __init__(self):
- self.__dict__ = self._shared_state
-
-class RPMReadOnlyTransaction(SharedStateTransaction, RPMTransaction):
- read_only = 1
- def __init__(self):
- SharedStateTransaction.__init__(self)
- if not hasattr(self, 'ts'):
- RPMTransaction.__init__(self)
- # FIXME: replace with macro defination
- self.pushVSFlags(8)
-
-class RPM_Header:
- "Wrapper class for an rpm header - we need to store a flag is_source"
- def __init__(self, hdr, is_source=None):
- self.hdr = hdr
- self.is_source = is_source
- self.packaging = 'rpm'
- self.signatures = []
- self._extract_signatures()
-
- def __getitem__(self, name):
- return self.hdr[name]
-
- def __getattr__(self, name):
- return getattr(self.hdr, name)
-
- def is_signed(self):
- if hasattr(rpm, "RPMTAG_DSAHEADER"):
- dsaheader = self.hdr["dsaheader"]
- else:
- dsaheader = 0
- if self.hdr["siggpg"] or self.hdr["sigpgp"] or dsaheader:
- return 1
- return 0
-
- def _extract_signatures(self):
- header_tags = [
- [rpm.RPMTAG_DSAHEADER, "dsa"],
- [rpm.RPMTAG_RSAHEADER, "rsa"],
- [rpm.RPMTAG_SIGGPG, "gpg"],
- [rpm.RPMTAG_SIGPGP, 'pgp'],
- ]
- for ht, sig_type in header_tags:
- ret = self.hdr[ht]
- if not ret or len(ret) < 17:
- continue
- # Get the key id - hopefully we get it right
- key_id = ret[9:17]
- key_id_len = len(key_id)
- format = "%dB" % key_id_len
- t = struct.unpack(format, key_id)
- format = "%02x" * key_id_len
- key_id = format % t
- self.signatures.append({
- 'signature_type' : sig_type,
- 'key_id' : key_id,
- 'signature' : ret,
- })
-
-
-# Loads the package header from a file / stream / file descriptor
-# Raises rpm.error if an error is found, or InvalidPacageError if package is
-# busted
-# XXX Deal with exceptions better
-def get_package_header(filename=None, file=None, fd=None):
- if (filename is None and file is None and fd is None):
- raise ValueError, "No parameters passed"
-
- if filename is not None:
- f = open(filename)
- elif file is not None:
- f = file
- f.seek(0, 0)
- else: # fd is not None
- f = None
-
- if f is None:
- os.lseek(fd, 0, 0)
- file_desc = fd
- else:
- file_desc = f.fileno()
-
- if hasattr(rpm, 'headerFromPackage'):
- hdr, is_source = rpm.headerFromPackage(file_desc)
- if hdr is None:
- raise InvalidPackageError
- else:
- ts = RPMReadOnlyTransaction()
- nomd5 = getattr(rpm, 'RPMVSF_NOMD5')
- needpayload = getattr(rpm, 'RPMVSF_NEEDPAYLOAD')
- ts.pushVSFlags(~(nomd5 | needpayload))
- hdr = RPMReadOnlyTransaction().hdrFromFdno(file_desc)
- ts.popVSFlags()
- if hdr is None:
- raise InvalidPackageError
- is_source = hdr[getattr(rpm, 'RPMTAG_SOURCEPACKAGE')]
-
- return RPM_Header(hdr, is_source)
-
-class MatchIterator:
- def __init__(self, tag_name=None, value=None):
- # Query by name, by default
- 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
-
- if value:
- self.mi = method(tag_name, value)
- else:
- self.mi = method(tag_name)
-
- def pattern(self, tag_name, mode, pattern):
- self.mi.pattern(tag_name, mode, pattern)
-
- def next(self):
- try:
- hdr = self.mi.next()
- except StopIteration:
- hdr = None
-
- 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')]
- 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')]
- return RPM_Header(hdr, is_source)
-
-def labelCompare(t1, t2):
- return rpm.labelCompare(t1, t2)
-
-def nvre_compare(t1, t2):
- def build_evr(p):
- evr = [p[3], p[1], p[2]]
- evr = map(str, evr)
- if evr[0] == "":
- evr[0] = None
- return evr
- if t1[0] != t2[0]:
- raise ValueError("You should only compare packages with the same name")
- evr1, evr2 = (build_evr(t1), build_evr(t2))
- return rpm.labelCompare(evr1, evr2)
-
-
-def hdrLabelCompare(hdr1, hdr2):
- """ take two RPMs or headers and compare them for order """
-
- if hdr1['name'] == hdr2['name']:
- hdr1 = [hdr1['epoch'] or None, hdr1['version'], hdr1['release']]
- hdr2 = [hdr2['epoch'] or None, hdr2['version'], hdr2['release']]
- if hdr1[0]:
- hdr1[0] = str(hdr1[0])
- if hdr2[0]:
- hdr2[0] = str(hdr2[0])
- return rpm.labelCompare(hdr1, hdr2)
- elif hdr1['name'] < hdr2['name']:
- return -1
- return 1
-
-
-def rpmLabelCompare(rpmFilename1, rpmFilename2):
- """ take two RPMs and compare them for order """
- return hdrLabelCompare(get_package_header(rpmFilename1),
- get_package_header(rpmFilename2))
-
-
-def sortHeaders(hdrs):
- """ Sorts a list of RPM headers (or RPMs).
- Assertion: they *must* exist.
- """
-
- assert isinstance(hdrs, type([]))
-
- sorted = hdrs[:]
- sorted.sort(hdrLabelCompare)
- return sorted
-
-
-def sortRPMs(rpms):
- """ Sorts a list of RPM files. They *must* exist. """
-
- assert isinstance(rpms, type([]))
-
- # We don't want to use rpmLabelCompare as a sorting mechanism, it would
- # extract the rpm header for each comparison.
- # Build a list of (header, rpm)
- helper = map(lambda x: (get_package_header(x), x), rpms)
-
- # Sort the list using the headers as a comparison
- helper.sort(lambda x, y: hdrLabelCompare(x[0], y[0]))
-
- # Extract the rpm names now
- return map(lambda x: x[1], helper)
-
-
-def getInstalledHeader(rpmName):
- """ quieries the RPM DB for a header matching rpmName. """
-
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_STRCMP, rpmName)
- return mi.next()
-
-
-if __name__ == '__main__':
- mi = MatchIterator("name")
- mi.pattern("name", rpm.RPMMIRE_GLOB, "*ker*")
- while 1:
- h = mi.next()
- if not h:
- break
- print h['name']
- sys.exit(1)
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.i386.rpm")
- print dir(hdr)
- # Sources
- hdr = get_package_header(filename="/tmp/python-1.5.2-42.72.src.rpm")
- hdr2 = headerLoad(hdr.unload())
- print hdr2
- print len(hdr2.keys())
-
-
diff --git a/satellite/install/satErrors.py b/satellite/install/satErrors.py
deleted file mode 100644
index 6795b01..0000000
--- a/satellite/install/satErrors.py
+++ /dev/null
@@ -1,380 +0,0 @@
-""" single placeholder for the satellite installer exceptions
-
- Copyright (c) 2002-2005, Red Hat, Inc.
- All rights reserved.
-"""
-# $Id: satErrors.py,v 1.41 2005-07-05 17:50:13 wregglej Exp $
-
-PRODUCT_NAME = "RHN Satellite"
-
-import sys
-import time
-import socket
-import traceback
-
-from satLog import log_me
-from translate import _
-from cStringIO import StringIO
-
-# XXX Warning! Do not try to use this rhn_rpm for any exceptions
-# things; there is code that uses common/rhn_rpm
-# Even though the classes would have the same name, they would be different
-# objects; try/except would not work correctly
-import rhn_rpm
-
-def print_req(req, fd = sys.stderr):
- """ get some debugging information about the current exception for sending
- out when we raise an exception
- """
-
- fd.write("Request object information:\n")
- fd.write("URI: %s\n" % req.unparsed_uri)
- fd.write("Remote Host: %s\nServer Name: %s:%d\n" % (
- req.get_remote_host(), req.server.server_hostname, req.server.port))
- fd.write("Headers passed in:\n")
- kl = req.headers_in.keys()
- kl.sort()
- for k in kl:
- fd.write("\t%s: %s\n" % (k, req.headers_in[k]))
- return 0
-
-hostname = socket.gethostname()
-
-def Traceback(method = None, req = None, mail = 1, ostream = sys.stderr,
- extra = None, severity="notification"):
- """ Reports an traceback error and optionally sends mail about it.
- NOTE: extra = extra text information.
- NOTE2: adapted from common.rhnTB.py
- (can't import from common because this module may be imported
- before common exists)
- """
-
- e_type, e_value = sys.exc_info()[:2]
- t = time.ctime(time.time())
- exc = StringIO()
-
- exc.write("Exception reported from %s\nTime: %s\n" % (hostname, t))
- exc.write("Exception type %s\n" % (e_type,))
- if method:
- exc.write("Exception while handling function %s\n" % method)
-
- # print information about the request being served
- if req:
- print_req(req, exc)
- if extra:
- exc.write("Extra information about this error:\n%s\n" % extra)
-
- # Print the traceback
- exc.write("\nException Handler Information\n")
- traceback.print_exc(None, exc)
-
- # we always log it somewhere
- if ostream:
- ostream.write("%s\n" % exc.getvalue())
-
- ret = 0 # default return value
- if mail:
- pass
- exc.close()
- return ret
-
-def fetchTraceback(method=None, req=None, extra=None):
- #""" a cheat for snagging just the string value of a Traceback """
- exc = StringIO()
- Traceback(method=method, req=req, mail=0, ostream=exc, extra=extra,
- severity=None)
- return exc.getvalue()
-
-
-def repr_str(e):
- """return a repr(e), str(e) string safely
-
- Will return something like:
- '''
- ...repr(e)...
- ...str(e)...'''
- """
-
- s = ''
- try:
- s = 'EXCEPTION: %s' % e.__class__.__name__
- except:
- s = 'EXCEPTION: <unable to determine>'
- try:
- if e.__repr__ == e.__str__:
- s = s + '\n%s' % repr(e)
- except:
- try:
- s = s + '\n%s' % repr(e)
- except:
- pass
- try:
- s = s + '\n%s' % str(e)
- except:
- pass
- return s
-
-
-class Error(Exception):
- "base class for errors"
- def __init__(self, errmsg):
- Exception.__init__(self)
- self.errmsg = str(errmsg)
-
- def __repr__(self):
- log_me(self.errmsg)
- return self.errmsg
-
-
-class SatelliteConfigDeploymentError(Error):
- "Indicates there was a problem deploying the satellite config files"
- def __repr__(self):
- msg = _("Error deploying %s config files. "
- "The message was:\n" % PRODUCT_NAME) + self.errmsg
- log_me(msg)
- return msg
-
-
-class InvalidUsernamePassword(Error):
- "Invalid RHN username and password were provided"
- def __repr__(self):
- msg = _("The username and password provided do not "
- "match an existing RHN account:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class SatelliteCertVerifyError(Error):
- "RHN product Entitlement Certificate failed to validate"
- def __repr__(self):
- msg = _("The %s Entitlement Certificate "
- "failed to validate:\n" % PRODUCT_NAME) + self.errmsg
- log_me(msg)
- return msg
-
-
-class RhnEntitlementError(Error):
- "System could not register to Red Hat Network"
- def __repr__(self):
- msg = _("The system was unable to register to "
- "the Red Hat Network:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class UpdateError(Error):
- "Raise when an up2date failed"
- def __repr__(self):
- msg = _("There was an error while trying to "
- "update this system:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class RpmError(Error):
- "RPM raised an error condition"
- def __repr__(self):
- msg = _("RPM error while handling The message was:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-def rpm_flags(flags):
- """a helper function to help translate the rpm flags on
- dependency issues"""
-
- flags = flags & 0xFF
- s = ""
- if flags != 0:
- if flags & rhn_rpm.RPMSENSE_LESS:
- s = s + "<"
- if flags & rhn_rpm.RPMSENSE_GREATER:
- s = s + ">"
- if flags & rhn_rpm.RPMSENSE_EQUAL:
- s = s + "="
- if flags & rhn_rpm.RPMSENSE_SERIAL:
- s = s + "S"
- return s
-
-
-def deps_as_text(deps):
- "stringifies/text-ifies rpm dependency infomation"
-
- s = _("Unresolved rpm dependencies:\n\n")
- sense_map = ["requires", "conflicts with"]
-
- for d in deps:
- ((name, version, release), (needsName, needsVersion),
- flags, suggested, sense) = d
- s = s + "Package "
- if needsVersion:
- s = s + _("%s %s %s\n") % (
- "%s-%s-%s" % (name, version, release),
- sense_map[sense],
- "%s %s %s" % (needsName, rpm_flags(flags), needsVersion))
- else:
- s = s + _("%s %s %s\n") % (
- "%s %s %s-%s" % (name, rpm_flags(flags), version, release),
- sense_map[sense],
- needsName)
- return s
-
-
-class DependencyError(Error):
-
- "RPM transaction raised a dependency error"
-
- def __init__(self, msg, deps=None):
- self.errmsg = str(msg)
- # just tag on the whole deps tuple, so we have plenty of info
- # to play with
- self.deps = deps
-
- def __repr__(self):
- msg = _("RPM dependency error. The message was:\n") + self.errmsg
- if self.deps:
- msg = "%s\n%s" % (msg, deps_as_text(self.deps))
- log_me(msg)
- return msg
-
-
-class genPublicCaCertError(Error):
-
- "Raise when we fail to properly generate a CA cert"
-
- def __repr__(self):
- msg = _("There was an error while generating a "
- "Certificate Authority Cert:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class genPrivateCaKeyError(Error):
- "Raise when we fail to properly generate a CA Key"
- def __repr__(self):
- msg = _("There was an error while generating a "
- "Certificate Authority Key:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class genServerKeyError(Error):
- "Raise when we fail to properly generate a httpd server key"
- def __repr__(self):
- msg = _("Error while generating a httpd "
- "server key:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class genServerCertReqError(Error):
- """ Raise when we fail to properly generate a httpd server certificate
- request
- """
- def __repr__(self):
- msg = _("Error while generating a httpd server certificate "
- "request:\n") + self.errmsg
- log_me(msg)
- return msg
-
-class genServerCertError(Error):
- "Raise when we fail to properly generate a httpd server certificate"
- def __repr__(self):
- msg = _("Error while generating a httpd server "
- "certificate:\n") + self.errmsg
- log_me(msg)
- return msg
-
-#class CaCertInsertionError(Exception):
-# "raise when fail to insert CA cert into the local database"
-#XXX: now in satellite_tools.satCerts
-
-
-class InvalidDbCharsetsError(Exception):
- "databases are only allowed the UF8 charset, else raise this!"
-
-
-class dbVersionIncorrectError(Error):
- "Raise when we detect the database is not he proper version"
- def __repr__(self):
- msg = _("The database is not the proper "
- "version:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class SchemaImportError(Error):
- "Raise when we fail to import the database schema"
- def __repr__(self):
- msg = _("Database schema import failed:\n") + self.errmsg
- log_me(msg)
- return msg
-
-
-class dbIncorrectPermissionsError(Error):
- "Database user does not have the approriate permissions"
- def __init__(self, msg, missingPrivs=None):
- self.errmsg = str(msg)
- # just tag on the whole deps tuple, so we have plenty of info
- # to play with
- self.missingPrivs = missingPrivs
-
- def __repr__(self):
- msg = _("Database Permissions error: The message "
- "was:\n") + self.errmsg
- log_me(msg)
- log_me("The database reported the following "
- "permissions were incorrect:\n %s" % self.missingPrivs)
- return msg
-
-
-class dbTableSpaceError(Error):
- "Database user doesnt have the approriate permissions"
- def __init__(self, msg, errs=None):
- Error.__init__(self, msg)
- # just tag on the whole deps tuple, so we have plenty of info
- # to play with
- self.errs = errs
-
- def __repr__(self):
- msg = _("Database Permissions error: The message "
- "was:\n") + self.errmsg
- log_me(msg)
- log_me("The database reported the following "
- "permissions were incorrect:\n %s" % self.errs)
- return msg
-
-class MissingCaCertError(Exception):
- "raised if ssl ca cert is missing at that location"
-
-class DirectoryNotFoundError(Exception):
- "missing directory"
-
-class ArgumentError(Exception):
- "raised whenever there is any issues with the options in the commandline."
-
-class UnhandledXmlrpcError(Exception):
- "generic exception, but for XMLRPC failures"
-
-
-# Exception classes mainly for the activation portion of the install.
-class MissingSystemidError(Exception):
- "raised if systemid is missing/inaccessible at that location"
-
-class MissingRhnCertError(Exception):
- "raised if RHN cert is missing/inaccessible at that location"
-
-class InvalidRhnCertError(Exception):
- "raised if RHN Entitlement Certificate is invalid"
-
-class ChannelFamilyPopulationError(Error):
- "Indicates there was a problem populating the channel families"
- def __repr__(self):
- msg = _("Error populating channel families to the local DB. "
- "The message was:\n") + self.errmsg
- log_me(msg)
- return msg
-
-class RhnsdRestartError(Error):
- "Raised if rhnsd refused to restart"
-
diff --git a/satellite/install/satLog.py b/satellite/install/satLog.py
deleted file mode 100644
index 9697d7c..0000000
--- a/satellite/install/satLog.py
+++ /dev/null
@@ -1,116 +0,0 @@
-""" Log classes/functions for the installer
-
- Copyright (c) 2002-2005, Red Hat, Inc.
- All rights reserved.
-"""
-
-#-------------------------------------------------------------------------------
-# $Id: satLog.py,v 1.14 2005-07-05 17:50:13 wregglej Exp $
-
-import sys
-import time
-import string
-
-
-DEFAULT_LOG_FILE = "/var/log/rhn_satellite_install.log"
-LOG = None
-
-
-class Log:
-
- """attempt to log all interesting stuff, namely, anything that hits
- the network any error messages, package installs, etc
-
- This log class stolen from up2date (mostly)
- """
-
- def __init__(self, filename=None):
-
- self.app = "sat-install"
- self.filename = filename
-
- self.log_me("new satinstall run started");
-
- def log_me(self, *args):
- self.log_info = "[%s] %s" % (time.ctime(time.time()), self.app)
- s = ""
- for i in args:
- s = s + "%s" % i
- self.write_log(s)
-
- def log_me_clean(self, *args):
- self.log_info = ""
- s = ""
- for i in args:
- s = s + "%s" % i
- self.write_log(s)
-
- def trace_me(self):
- import traceback
- x = traceback.extract_stack()
- bar = string.join(traceback.format_list(x))
- self.write_log(bar)
-
- def write_log(self, s):
- self.fo = open(self.filename, 'a')
- msg = "%s %s\n" % (self.log_info, str(s))
- self.fo.write(msg)
- self.fo.flush()
- self.fo.close()
-
-
-def initLog(filename=DEFAULT_LOG_FILE):
- global LOG
- if LOG == None:
- LOG = Log(filename=filename)
- return LOG
-
-
-def log_me(*args):
- global LOG
- if LOG is None:
- raise SystemError("The log file has not been initialized yet")
- apply(LOG.log_me, args)
-
-
-def log_me_clean(*args):
- global LOG
- if LOG is None:
- raise SystemError("The log file has not been initialized yet")
- apply(LOG.log_me_clean, args)
-
-
-def log_me_stderr_clean(*args):
- "write to both stderr/stdout and the log file"
-
- log_me_clean(args)
- s = ''
- for a in args:
- s = s+str(a)
- sys.stderr.write(s+'\n')
-
-
-def log_me_stdout_clean(*args):
- log_me_clean(args)
- s = ''
- for a in args:
- s = s+str(a)
- sys.stdout.write(s+'\n')
-
-
-def log_me_stderr(*args):
- log_me(args)
- s = ''
- for a in args:
- s = s+str(a)
- sys.stderr.write(s+'\n')
-
-
-def log_me_stdout(*args):
- log_me(args)
- s = ''
- for a in args:
- s = s+str(a)
- sys.stdout.write(s+'\n')
-
-#===============================================================================
diff --git a/satellite/install/translate.py b/satellite/install/translate.py
deleted file mode 100644
index 50e6157..0000000
--- a/satellite/install/translate.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# rhnTranslate.py - Python module to handle translations.
-#-----------------------------------------------------------------------------
-# Handles language (human) translations.
-#
-# Copyright (c) 2001-2005, Red Hat Inc.
-# All rights reserved.
-#
-#-----------------------------------------------------------------------------
-# $Id: translate.py,v 1.9 2005-07-05 17:50:13 wregglej Exp $
-
-import os
-import types
-import gettext
-import string
-
-if hasattr(gettext, 'GNUTranslations'):
- class RHN_Translations(gettext.GNUTranslations):
- # Defining our own class, since we'd like to save the language we use
- # Determining the language is not very pretty - we parse the file name
- # which is supposed to be something like
- # .../<lang>/LC_MESSAGES/<domain>.po
- def _parse(self, fp):
- gettext.GNUTranslations._parse(self, fp)
- filename = fp.name
- filename = os.path.normpath(filename)
- # Extract the language
- self.lang = string.split(filename, '/')[-3]
-
- def getlangs(self):
- # Return all languages
- if not self._fallback or not hasattr(self._fallback, 'getlangs'):
- return [ self.lang, 'C' ]
- # Recursive call
- return [ self.lang ] + self._fallback.getlangs()
-
-class i18n:
- _default_langs = ['en', 'en_US', 'C']
- # Wrapper class that allows us to change languages
- def __init__(self, domain=None, localedir="."):
- self.domain = domain
- self.localedir = localedir
- self.langs = self._default_langs[:]
- self._set_catalog()
-
- def _set_catalog(self):
- # Set the catalog object
- self.cat = gettext.Catalog(self.domain, localedir=self.localedir,
- languages=self.langs, fallback=1, class_=RHN_Translations)
-
- def getlangs(self):
- # List of languages we support
- if not hasattr(self.cat, "getlangs"):
- return [ "C" ]
- return self.cat.getlangs()
-
- def setlangs(self, langs):
- if isinstance(langs, types.StringType):
- langs = [ langs ]
- langs.extend(self._default_langs)
- self.langs = langs
- self._set_catalog()
-
- def gettext(self, string):
- return self.cat.gettext(string)
-
- # reinitialize this catalog
- def set(self, domain=None, localedir=None):
- if domain: self.domain = domain
- if localedir: self.localedir = localedir
- self._set_catalog()
-
-# Old-style gettext
-class i18n_old(i18n):
- def _set_catalog(self):
- self.cat = gettext.Catalog(self.domain, localedir=self.localedir)
-
- def getlangs(self):
- return gettext.lang
-
- def setlangs(self, langs):
- if isinstance(langs, types.StringType):
- langs = [ langs ]
- # Build the list of languages
- _added_langs = []
- for l in langs:
- _added_langs.extend(gettext._expandLang(l))
- # Adding some defaults
- _added_langs.extend(self._default_langs)
- # Remove duplicates
- h = {}
- del gettext.lang[:]
- for l in _added_langs:
- if l == 'C':
- # We'll add it back later
- continue
- if h.has_key(l):
- # Already loaded it
- continue
- gettext.lang.append(l)
- h[l] = None
- if "C" not in gettext.lang:
- gettext.lang.append("C")
- self._set_catalog()
-
-def N_(str):
- return str
-
-if hasattr(gettext, 'GNUTranslations'):
- cat = i18n()
-else:
- cat = i18n_old()
-_ = cat.gettext
14 years, 4 months