On 10.12.2015 15:49, Tomas Babej wrote:
On 12/10/2015 11:23 AM, Martin Basti wrote:
On 10.12.2015 09:13, Lukas Slebodnik wrote:
On (09/12/15 19:22), Martin Basti wrote:
https://fedorahosted.org/freeipa/ticket/5535
Patch attached.
>From 8ef93485d61e8732166fb0c5b6c4559209740f3e Mon Sep 17 00:00:00 2001
From: Martin Basti <[email protected]>
Date: Wed, 9 Dec 2015 18:53:35 +0100
Subject: [PATCH] Fix version comparison
Use RPM library to compare vendor versions of IPA for redhat platform
https://fedorahosted.org/freeipa/ticket/5535
---
freeipa.spec.in | 2 ++
ipaplatform/redhat/tasks.py | 19 +++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/freeipa.spec.in b/freeipa.spec.in
index
9f82b3695fb10c4db65cc31278364b3b34e26098..09feba7b8324f5e645da3e8010de86b6c3ee5ab9
100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -166,6 +166,8 @@ Requires: %{etc_systemd_dir}
Requires: gzip
Requires: python-gssapi >= 1.1.0
Requires: custodia
+Requires: rpm-python
+Requires: rpmdevtools
Could you explain why do you need the 2nd package?
It does not contains any python modules
and I cannot see usage of any binary in this patch
LS
Thanks for this catch, it is actually located in yum package, I rather
copy stringToVersion function from there to IPA, to avoid dependency hell
Updated patch attached.
Looking good. The __cmp__ function, however, is not available in Python
3. As we will eventually support python3 in RHEL as well, maybe we
should make sure even platform-dependent parts are python3 compatible?
For the future's sake.
Tomas
Thanks,
python 3 compatible patch attached.
From 0e5c42ac282f47138e106e4884e11bc5ff7ab12b Mon Sep 17 00:00:00 2001
From: Martin Basti <[email protected]>
Date: Wed, 9 Dec 2015 18:53:35 +0100
Subject: [PATCH] Fix version comparison
Use RPM library to compare vendor versions of IPA for redhat platform
https://fedorahosted.org/freeipa/ticket/5535
---
freeipa.spec.in | 1 +
ipaplatform/redhat/tasks.py | 53 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+)
diff --git a/freeipa.spec.in b/freeipa.spec.in
index 9f82b3695fb10c4db65cc31278364b3b34e26098..7a5565c497b0dd20ed73af3112a37ac25d2abe6e 100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -166,6 +166,7 @@ Requires: %{etc_systemd_dir}
Requires: gzip
Requires: python-gssapi >= 1.1.0
Requires: custodia
+Requires: rpm-python
Provides: %{alt_name}-server = %{version}
Conflicts: %{alt_name}-server
diff --git a/ipaplatform/redhat/tasks.py b/ipaplatform/redhat/tasks.py
index 94d2cb4e906965a20bcfdd55f38854005091c26f..c90e55f28cd492d43a98e4e0ee0476a23db8a099 100644
--- a/ipaplatform/redhat/tasks.py
+++ b/ipaplatform/redhat/tasks.py
@@ -30,11 +30,13 @@ import stat
import socket
import sys
import base64
+from functools import total_ordering
from subprocess import CalledProcessError
from nss.error import NSPRError
from pyasn1.error import PyAsn1Error
from six.moves import urllib
+import rpm
from ipapython.ipa_log_manager import root_logger, log_mgr
from ipapython import ipautil
@@ -47,6 +49,35 @@ from ipaplatform.redhat.authconfig import RedHatAuthConfig
from ipaplatform.base.tasks import BaseTaskNamespace
+# copied from rpmUtils/miscutils.py
+def stringToVersion(verstring):
+ if verstring in [None, '']:
+ return (None, None, None)
+ i = verstring.find(':')
+ if i != -1:
+ try:
+ epoch = str(long(verstring[:i]))
+ except ValueError:
+ # look, garbage in the epoch field, how fun, kill it
+ epoch = '0' # this is our fallback, deal
+ else:
+ epoch = '0'
+ j = verstring.find('-')
+ if j != -1:
+ if verstring[i + 1:j] == '':
+ version = None
+ else:
+ version = verstring[i + 1:j]
+ release = verstring[j + 1:]
+ else:
+ if verstring[i + 1:] == '':
+ version = None
+ else:
+ version = verstring[i + 1:]
+ release = None
+ return (epoch, version, release)
+
+
log = log_mgr.get_logger(__name__)
@@ -66,6 +97,21 @@ def selinux_enabled():
return False
+@total_ordering
+class IPAVersion(object):
+
+ def __init__(self, version):
+ self.version_tuple = stringToVersion(version)
+
+ def __eq__(self, other):
+ assert isinstance(other, IPAVersion)
+ return rpm.labelCompare(self.version_tuple, other.version_tuple) == 0
+
+ def __lt__(self, other):
+ assert isinstance(other, IPAVersion)
+ return rpm.labelCompare(self.version_tuple, other.version_tuple) == -1
+
+
class RedHatTaskNamespace(BaseTaskNamespace):
def restore_context(self, filepath, restorecon=paths.SBIN_RESTORECON):
@@ -423,5 +469,12 @@ class RedHatTaskNamespace(BaseTaskNamespace):
super(RedHatTaskNamespace, self).create_system_user(name, group,
homedir, shell, uid, gid, comment, create_homedir)
+ def parse_ipa_version(self, version):
+ """
+ :param version: textual version
+ :return: object implementing proper __cmp__ method for version compare
+ """
+ return IPAVersion(version)
+
tasks = RedHatTaskNamespace()
--
2.5.0
--
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code