Bug 33922 - Модуль selinux не загружается после пересборки с новым swig
Summary: Модуль selinux не загружается после пересборки с новым swig
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: python-module-selinux (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Mikhail Efremov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-09-26 15:26 MSK by Evgeny Sinelnikov
Modified: 2017-09-27 10:49 MSK (History)
6 users (show)

See Also:


Attachments
Разница __init__.py от swig между версиями 3.0.8 и 3.0.12 (коммит из 3.0.9) (15.05 KB, patch)
2017-09-26 15:26 MSK, Evgeny Sinelnikov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Evgeny Sinelnikov 2017-09-26 15:26:25 MSK
Created attachment 7215 [details]
Разница __init__.py от swig между версиями 3.0.8 и 3.0.12 (коммит из 3.0.9)

После перерсборки с новым swig модуль из пакета python-module-selinux не загружается:

[test@dcsin binary]$ python
Python 2.7.11 (default, Apr 11 2017, 15:20:35) 
[GCC 6.3.1 20170118 (ALT 6.3.1-alt2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import selinux
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/selinux/__init__.py", line 17, in <module>
    _selinux = swig_import_helper()
  File "/usr/lib64/python2.7/site-packages/selinux/__init__.py", line 16, in swig_import_helper
    return importlib.import_module('_selinux')
  File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named _selinux

[test@dcsin binary]$ rpm -qi python-module-selinux                        
Name        : python-module-selinux
Epoch       : 1
Version     : 2.5
Release     : alt3
Architecture: x86_64
Install Date: Вт 26 сен 2017 14:54:41
Group       : System/Configuration/Other
Size        : 591618
License     : Public Domain
Signature   : DSA/SHA1, Пн 11 сен 2017 17:42:30, Key ID 95c584d5ae4ae412
Source RPM  : libselinux-2.5-alt3.src.rpm
Build Date  : Пн 11 сен 2017 17:42:22
Build Host  : sem-sisyphus.hasher.altlinux.org
Relocations : (not relocatable)
Packager    : Mikhail Efremov <sem@altlinux.org>
Vendor      : ALT Linux Team
URL         : http://userspace.selinuxproject.org/
Summary     : Python module for libselinux
Description :
This package contains SELinux python bindings.

При этом установка пакета релиза собраного в p8 из тех же исходников вполне работает:

[test@dcsin binary]$ python
Python 2.7.11 (default, Apr 11 2017, 15:20:35) 
[GCC 6.3.1 20170118 (ALT 6.3.1-alt2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import selinux
>>> 
[test@dcsin binary]$ rpm -qi python-module-selinux
Name        : python-module-selinux
Epoch       : 1
Version     : 2.5
Release     : alt2
Architecture: x86_64
Install Date: Вт 26 сен 2017 14:56:56
Group       : System/Configuration/Other
Size        : 611120
License     : Public Domain
Signature   : DSA/SHA1, Вт 22 ноя 2016 10:56:06, Key ID 95c584d5ae4ae412
Source RPM  : libselinux-2.5-alt2.src.rpm
Build Date  : Вт 22 ноя 2016 10:55:58
Build Host  : rider-sisyphus.hasher.altlinux.org
Relocations : (not relocatable)
Packager    : Anton Farygin (Rider) <rider@altlinux.org>
Vendor      : ALT Linux Team
URL         : http://userspace.selinuxproject.org/
Summary     : Python module for libselinux
Description :
This package contains SELinux python bindings.

При отладке через strace -e file замечено, что модуль _selinux.so не ищется в нужно каталоге /usr/lib64/python2.7/site-packages/selinux/:

open("/home/test/RPM/binary/_selinux.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                                [168/4901]
open("/home/test/RPM/binary/_selinuxmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                                    
open("/home/test/RPM/binary/_selinux.py", O_RDONLY) = -1 ENOENT (No such file or directory)                                                          
open("/home/test/RPM/binary/_selinux.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)                                                         
stat("/usr/lib64/python2.7/_selinux", 0x7ffdcf464310) = -1 ENOENT (No such file or directory)                                                        
open("/usr/lib64/python2.7/_selinux.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                                           
open("/usr/lib64/python2.7/_selinuxmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                           
open("/usr/lib64/python2.7/_selinux.py", O_RDONLY) = -1 ENOENT (No such file or directory)                                                           
open("/usr/lib64/python2.7/_selinux.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)                      
stat("/usr/lib64/python2.7/plat-linux2/_selinux", 0x7ffdcf464310) = -1 ENOENT (No such file or directory)  
open("/usr/lib64/python2.7/plat-linux2/_selinux.so", O_RDONLY) = -1 ENOENT (No such file or directory)      
open("/usr/lib64/python2.7/plat-linux2/_selinuxmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                         
open("/usr/lib64/python2.7/plat-linux2/_selinux.py", O_RDONLY) = -1 ENOENT (No such file or directory)     
open("/usr/lib64/python2.7/plat-linux2/_selinux.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)                                              
stat("/usr/lib64/python2.7/lib-dynload/_selinux", 0x7ffdcf464310) = -1 ENOENT (No such file or directory)  
open("/usr/lib64/python2.7/lib-dynload/_selinux.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                               
open("/usr/lib64/python2.7/lib-dynload/_selinuxmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)    
open("/usr/lib64/python2.7/lib-dynload/_selinux.py", O_RDONLY) = -1 ENOENT (No such file or directory)                  
open("/usr/lib64/python2.7/lib-dynload/_selinux.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)                       
stat("/usr/lib64/python2.7/site-packages/_selinux", 0x7ffdcf464310) = -1 ENOENT (No such file or directory)           
open("/usr/lib64/python2.7/site-packages/_selinux.so", O_RDONLY) = -1 ENOENT (No such file or directory)      
open("/usr/lib64/python2.7/site-packages/_selinuxmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)   
open("/usr/lib64/python2.7/site-packages/_selinux.py", O_RDONLY) = -1 ENOENT (No such file or directory)                                             
open("/usr/lib64/python2.7/site-packages/_selinux.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)        
stat("/usr/lib/python2.7/site-packages/_selinux", 0x7ffdcf464310) = -1 ENOENT (No such file or directory)                                            
open("/usr/lib/python2.7/site-packages/_selinux.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                               
open("/usr/lib/python2.7/site-packages/_selinuxmodule.so", O_RDONLY) = -1 ENOENT (No such file or directory)                                         
open("/usr/lib/python2.7/site-packages/_selinux.py", O_RDONLY) = -1 ENOENT (No such file or directory)     
open("/usr/lib/python2.7/site-packages/_selinux.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)     
Traceback (most recent call last):                                                                                  
  File "./se.load.py", line 3, in <module>                                                                                                   
open("./se.load.py", O_RDONLY)          = 3                                                                                                
    import selinux                                                                                                            
  File "/usr/lib64/python2.7/site-packages/selinux/__init__.py", line 17, in <module>                              
open("/usr/lib64/python2.7/site-packages/selinux/__init__.py", O_RDONLY) = 3                                 
    _selinux = swig_import_helper()                                                                           
  File "/usr/lib64/python2.7/site-packages/selinux/__init__.py", line 16, in swig_import_helper          
open("/usr/lib64/python2.7/site-packages/selinux/__init__.py", O_RDONLY) = 3                          
    return importlib.import_module('_selinux')                                                                           
  File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module                             
open("/usr/lib64/python2.7/importlib/__init__.py", O_RDONLY) = 3                                                                            
    __import__(name)                                                                                                                                 ImportError: No module named _selinux                                                                       
+++ exited with 1 +++

При этом создание вот такой символической ссылки проблему решает:
[root@dcsin binary]# ln -s selinux/_selinux.so /usr/lib64/python2.7/site-packages/_selinux.so
[root@dcsin binary]# ls -l /usr/lib64/python2.7/site-packages/_selinux.so 
lrwxrwxrwx 1 root root 19 сен 26 15:17 /usr/lib64/python2.7/site-packages/_selinux.so -> selinux/_selinux.so

На рабочая разница выглядит вот так:
[root@dcsin binary]# diff -u /usr/lib64/python2.7/site-packages/selinux/x__init__.py-2 /usr/lib64/python2.7/site-packages/selinux/x__init__.[441/998]
--- /usr/lib64/python2.7/site-packages/selinux/x__init__.py-2   2017-09-26 12:28:42.838000000 +0300                                                  
+++ /usr/lib64/python2.7/site-packages/selinux/x__init__.py-2.1 2017-09-26 11:32:52.000000000 +0300                                                  
@@ -1,15 +1,22 @@                                                                                                                                    
 # This file was automatically generated by SWIG (http://www.swig.org).                                                                              
-# Version 3.0.8                                                                                                                                     
+# Version 3.0.12                                                                                                                                    
 #                                                                                                                                                   
 # Do not make changes to this file unless you know what you are doing--modify                                                                       
 # the SWIG interface file instead.                                                                                                                  
                                                                                                                                                     
-                                                                                                                                                    
-                                                                                                                                                    
-                                                                                                                                                    
-                                                                                                                                                    
-from sys import version_info                                                                                                                        
-if version_info >= (2, 6, 0):                                                                                                                       
+from sys import version_info as _swig_python_version_info                                                                                           
+if _swig_python_version_info >= (2, 7, 0):                                                                                                          
+    def swig_import_helper():                                                                                                                       
+        import importlib                                                                                                                            
+        pkg = __name__.rpartition('.')[0]                                                                                                           
+        mname = '.'.join((pkg, '_selinux')).lstrip('.')                  
+        try:                                                             
+            return importlib.import_module(mname)                        
+        except ImportError:                                              
+            return importlib.import_module('_selinux')                   
+    _selinux = swig_import_helper()                                      
+    del swig_import_helper                                     
+elif _swig_python_version_info >= (2, 6, 0):                              
     def swig_import_helper():                                            
         from os.path import dirname                                      
         import imp
Comment 1 Evgeny Sinelnikov 2017-09-27 10:49:26 MSK
В общем, проблема была в swig. Это известная проблема. Исправление проверено и отправено в сизиф:
#188861 TESTED #10 [test-only] sisyphus swig.git=3.0.12-alt4%ubt libselinux.git=2.5-alt4

Pull request отправлен в апстрим:
- https://github.com/swig/swig/pull/1105
- https://github.com/swig/swig/issues/769