On 01/08/2016 04:10 PM, Lukas Slebodnik wrote:
On (08/01/16 14:18), Martin Babinsky wrote:
On 01/08/2016 02:14 PM, Jan Cholasta wrote:
On 8.1.2016 14:09, Martin Basti wrote:
On 08.01.2016 14:00, Martin Kosek wrote:
On 01/08/2016 01:45 PM, Martin Basti wrote:
fix for ticket https://fedorahosted.org/freeipa/ticket/5535
requires to import rpm module
This import somehow breaks nsslib in IPA
We have 2 ways how to fix it:
1) move import rpm to body of methods (attached patch)
We are not sure how stable is this solution.
2) use solution with rpmdevtools proposed here:
This should be rock stable but it needs many dependencies (rpm-python
The second way looks safer, so I would like to reimplement it, do you
or do you have better idea?
Feedback welcome, please ASAP.
Since it's Friday, I invested 15 minutes to practice my C skills and
python-cffi library to call rpm rpmvercmp library call directly
$ python rpm.py 4.2.0-15.el7 4.2.0-15.el7_2.3
4.2.0-15.el7 < 4.2.0-15.el7_2.3
This would not introduce any additional dependency besides rpm-devel,
Not rpm-devel, but rpm-libs (you should dlopen "librpm.so.3").
I'm afraid that this can cause the same issue as import rpm, because the
nsslib is used from C library
I would be surprised if NSS was used in this particular function.
If it would work then we could compare version like in this quickly hacked
and untested patch.
From 32ebf02d38b7174816f81579aab6ebbe26e80f64 Mon Sep 17 00:00:00 2001
From: Martin Babinsky <mbabi...@redhat.com>
Date: Fri, 8 Jan 2016 14:17:14 +0100
Subject: [PATCH] use rpmvercmp via python-cffi for version comparison
ipaplatform/redhat/tasks.py | 45 ++++++++++++++-------------------------------
1 file changed, 14 insertions(+), 31 deletions(-)
diff --git a/ipaplatform/redhat/tasks.py b/ipaplatform/redhat/tasks.py
index a0b4060..66ca3ad 100644
@@ -36,7 +36,7 @@ from subprocess import CalledProcessError
from nss.error import NSPRError
from pyasn1.error import PyAsn1Error
from six.moves import urllib
+from cffi import FFI
from ipapython.ipa_log_manager import root_logger, log_mgr
from ipapython import ipautil
@@ -49,33 +49,16 @@ from ipaplatform.redhat.authconfig import RedHatAuthConfig
from ipaplatform.base.tasks import BaseTaskNamespace
-# copied from rpmUtils/miscutils.py
- if verstring in [None, '']:
- return (None, None, None)
- i = verstring.find(':')
- if i != -1:
- epoch = str(long(verstring[:i]))
- except ValueError:
- # look, garbage in the epoch field, how fun, kill it
- epoch = '0' # this is our fallback, deal
- epoch = '0'
- j = verstring.find('-')
- if j != -1:
- if verstring[i + 1:j] == '':
- version = None
- version = verstring[i + 1:j]
- release = verstring[j + 1:]
- if verstring[i + 1:] == '':
- version = None
- version = verstring[i + 1:]
- release = None
- return (epoch, version, release)
+def compare_rpm_versions(ver1, ver2):
+ ffi = FFI()
+int rpmvercmp (const char *a, const char *b);
+ C = ffi.dlopen("rpmlib.so.3")
rpmlib.so.3 does not exist.
It is is librpm.so.3
But as I mentioned in different mail. The soname was bumped in fedora 23.
So please use only 'ffi.dlopen("rpm")'
It would be also good to write unit test for this function.
So you can detect issues with cffi is any.
a = '4.2.0-15.el7'
b = '4.2.0-15.el7_2.3'
c = '4.2.0-16.el7'
Thank you for suggestions Lukas, I have patch and unit tests ready. They
will land on the list shortly.
Manage your subscription for the Freeipa-devel mailing list:
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code