[Freeipa-devel] import rpm causes failure during IPA caless install

Martin Babinsky mbabinsk at redhat.com
Fri Jan 8 15:29:21 UTC 2016


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:
>>>>>> Hello all,
>>>>>>
>>>>>> fix for ticket https://fedorahosted.org/freeipa/ticket/5535
>>>>>> requires to import rpm module
>>>>>>
>>>>>> This import somehow breaks nsslib in IPA
>>>>>> https://fedorahosted.org/freeipa/ticket/5572
>>>>>>
>>>>>>
>>>>>> 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:
>>>>>> https://www.redhat.com/archives/freeipa-devel/2016-January/msg00092.html
>>>>>>
>>>>>> This should be rock stable but it needs many dependencies (rpm-python
>>>>>> too, perl)
>>>>>>
>>>>>> The second way looks safer, so I would like to reimplement it, do you
>>>>>> all agree
>>>>>> or do you have better idea?
>>>>>> Feedback welcome, please ASAP.
>>>>>>
>>>>>> Martin^2
>>>>> Since it's Friday, I invested 15 minutes to practice my C skills and
>>>>> use the
>>>>> python-cffi library to call rpm rpmvercmp library call directly
>>>>> (attached):
>>>>>
>>>>> $ 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,
>>>>> right? :-)
>>>
>>> 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.
>>
>> --
>> Martin^3 Babinsky
>
>>From 32ebf02d38b7174816f81579aab6ebbe26e80f64 Mon Sep 17 00:00:00 2001
>> From: Martin Babinsky <mbabinsk at 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
>> --- a/ipaplatform/redhat/tasks.py
>> +++ b/ipaplatform/redhat/tasks.py
>> @@ -36,7 +36,7 @@ from subprocess import CalledProcessError
>> from nss.error import NSPRError
>> from pyasn1.error import PyAsn1Error
>> from six.moves import urllib
>> -import rpm
>> +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
>> -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)
>> +def compare_rpm_versions(ver1, ver2):
>> +    ffi = FFI()
>> +    ffi.cdef("""
>> +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'
> compare_rpm_versions(a, b)
> compare_rpm_versions(b, b)
> compare_rpm_versions(c, b)
>
> LS
>

Thank you for suggestions Lukas, I have patch and unit tests ready. They 
will land on the list shortly.

-- 
Martin^3 Babinsky




More information about the Freeipa-devel mailing list