diff options
author | Maciej Wereski <m.wereski@partner.samsung.com> | 2014-01-14 13:09:42 +0100 |
---|---|---|
committer | Maciej Wereski <m.wereski@partner.samsung.com> | 2014-07-15 15:41:01 +0200 |
commit | 1a83bfdc08996e745418a22a3c51a5297571cf7d (patch) | |
tree | bda671282cbb4cb13b64e6f57852050db88366c3 /rpmlint-checks-master/LibraryPolicyCheck.py | |
parent | f8865ef4b0284f0428c4720ff2a444a63af7221f (diff) | |
download | rpmlint-1a83bfdc08996e745418a22a3c51a5297571cf7d.tar.gz rpmlint-1a83bfdc08996e745418a22a3c51a5297571cf7d.tar.bz2 rpmlint-1a83bfdc08996e745418a22a3c51a5297571cf7d.zip |
Incorporate files from tarball into git
Bug-Tizen: PTREL-604
Change-Id: I41c03fddcaebb56696c338696000541b85405c01
Signed-off-by: Maciej Wereski <m.wereski@partner.samsung.com>
Diffstat (limited to 'rpmlint-checks-master/LibraryPolicyCheck.py')
-rw-r--r-- | rpmlint-checks-master/LibraryPolicyCheck.py | 477 |
1 files changed, 477 insertions, 0 deletions
diff --git a/rpmlint-checks-master/LibraryPolicyCheck.py b/rpmlint-checks-master/LibraryPolicyCheck.py new file mode 100644 index 0000000..5d1b4f1 --- /dev/null +++ b/rpmlint-checks-master/LibraryPolicyCheck.py @@ -0,0 +1,477 @@ +# vim:sw=4:et +############################################################################# +# File : LibraryPolicyCheck.py +# Package : rpmlint +# Author : Richard Guenther +# Purpose : Verify shared library packaging policy rules +############################################################################# + +from Filter import * +import AbstractCheck +import rpm +import re +import commands +import stat +import Config +import os +import string +import Pkg + +_policy_legacy_exceptions = ( + "libacl1", + "libaio1", + "libalut0", + "libapr-1-0", + "libaprutil-1-0", + "libartskde1", + "libattr1", + "libcdaudio1", + "libcdk4", + "libcheck0", + "libchewing3", + "libchm0", + "libclucene0", + "libdar4", + "libdbh-4_5-4", + "libdbus-qt-1-1", + "libdm0", + "libdns_sd1", + "libefence0", + "libEMF1", + "libevolutionglue", + "libf2c0", + "libffi4", + "libflaim5_2", + "libfontenc1", + "libfreeradius-client2", + "libgcc_s1", + "libgcc_s4", # only for hppa + "libgconfmm-2_6-1", + "libgfortran3", + "libgif4", + "libgimpprint1", + "libgladesharpglue-2", + "libglibsharpglue-2", + "libgltt0", + "libglut3", + "libGLw1", + "libgmcop1", + "libgnet-2_0-0", + "libgnomecanvasmm-2_6-1", + "libgnomecups-1_0-1", + "libgnomemm-2_6-1", + "libgnomeprintui-2-2-0", + "libgnomesharpglue-2", + "libgnomeuimm-2_6-1", + "libgomp1", + "libgsfglue", + "libgsf-gnome-1-114", + "libgtksourceview-1_0-0", + "libgtkspell0", + "libhangul0", + "libICE6", + "libid3-3_8-3", + "libid3tag0", + "libidn11", + "libiec61883-0", + "libieee1284-3", + "libilbc0", + "libind_helper0", + "libiterm1", + "libjackasyn0", + "libkakasi2", + "libkeyutils1", + "libksba8", + "liblo0", + "libmal0", + "libmcrypt4", + "libmdbodbc0", + "libmeanwhile1", + "libmhash2", + "libmikmod2", + "libmng1", + "libnet6-1_3-0", + "libnl1", + "libnscd1", + "libobjc3", + "libodbcinstQ1", + "liboil-0_3-0", + "liboop4", + "libopenal0", + "libopenal1", + "libpgeasy3", + "libportaudio2", + "libqnotify0", + "libQt3Support4", + "libqtc1", + "libqtsharp0", + "libQtSql4", + "libquadmath0", + "librdf0", + "librsync1", + "libsamplerate0", + "libsecprog0", + "libsexy2", + "libsigc-1_2-5", + "libSM6", + "libsndfile1", + "libstdc++6", + "libstroke0", + "libthai0", + "libutempter0", + "libvisual-0_4-0", + "libXau6", + "libxclass0_9_2", + "libXdmcp6", + "libXext6", + "libxfce4util4", + "libxfcegui4-4", + "libXfixes3", + "libxflaim3_2", + "libXiterm1", + "libxkbfile1", + "libxml2-2", + "libXp6", + "libXprintUtil1", + "libXrender1", + "libXt6", + "libXv1", + "libz1", + "libzio0" +) + +_essential_dependencies = ( + "ld-linux.so.2", + "libacl.so.1", + "libanl.so.1", + "libanonymous.so.2", + "libattr.so.1", + "libaudit.so.0", + "libauparse.so.0", + "libBrokenLocale.so.1", + "libbz2.so.1", + "libcidn.so.1", + "libck-connector.so.0", + "libcom_err.so.2", + "libcrack.so.2", + "libcrypto.so.0.9.8", + "libcrypt.so.1", + "libc.so.6", + "libdbus-1.so.3", + "libdbus-glib-1.so.2", + "libdes425.so.3", + "libdl.so.2", + "libexpat.so.1", + "libform.so.5", + "libformw.so.5", + "libgcc_s.so.1", + "libgcrypt.so.11", + "libgdbm_compat.so.3", + "libgdbm.so.3", + "libgfortran3", + "libgio-2.0.so.0", + "libglib-2.0.so.0", + "libgmodule-2.0.so.0", + "libgobject-2.0.so.0", + "libgpg-error.so.0", + "libgssapi_krb5.so.2", + "libgssrpc.so.4", + "libgthread-2.0.so.0", + "libhal.so.1", + "libhal-storage.so.1", + "libhd.so.14", + "libhistory.so.5", + "libk5crypto.so.3", + "libkadm5clnt.so.5", + "libkadm5srv.so.5", + "libkdb5.so.4", + "libkeyutils.so.1", + "libkrb4.so.2", + "libkrb5.so.3", + "libkrb5support.so.0", + "libksba.so.8", + "liblber-2.4.so.2", + "libldap-2.4.so.2", + "libldap_r-2.4.so.2", + "liblogin.so.2", + "liblog_syslog.so.1", + "libltdl.so.3", + "libmagic.so.1", + "libmenu.so.5", + "libmenuw.so.5", + "libm.so.6", + "libncurses.so.5", + "libncursesw.so.5", + "libnscd.so.1", + "libnsl.so.1", + "libnss_compat.so.2", + "libnss_dns.so.2", + "libnss_files.so.2", + "libnss_hesiod.so.2", + "libnss_nisplus.so.2", + "libnss_nis.so.2", + "libopenct.so.1", + "libopensc.so.2", + "libpamc.so.0", + "libpam_misc.so.0", + "libpam.so.0", + "libpanel.so.5", + "libpanelw.so.5", + "libparted-1.8.so.8", + "libpcrecpp.so.0", + "libpcreposix.so.0", + "libpcre.so.0", + "libpcsclite.so.1", + "libpkcs15init.so.2", + "libpolkit-dbus.so.2", + "libpolkit-grant.so.2", + "libpolkit.so.2", + "libpopt.so.0", + "libpthread.so.0", + "libpth.so.20", + "libreadline.so.5", + "libresmgr.so.0.9.8", + "libresmgr.so.1", + "libresolv.so.2", + "librt.so.1", + "libsasl2.so.2", + "libsasldb.so.2", + "libscconf.so.2", + "libslp.so.1", + "libsmbios.so.1", + "libssl.so.0.9.8", + "libss.so.2", + "libstdc++.so.6", + "libthread_db.so.1", + "libtic.so.5", + "libusb-0.1.so.4", + "libusbpp-0.1.so.4", + "libutil.so.1", + "libuuid.so.1", + "libvolume_id.so.0", + "libwrap.so.0", + "libX11.so.6", + "libX11-xcb.so.1", + "libXau.so.6", + "libxcb-composite.so.0", + "libxcb-damage.so.0", + "libxcb-dpms.so.0", + "libxcb-glx.so.0", + "libxcb-randr.so.0", + "libxcb-record.so.0", + "libxcb-render.so.0", + "libxcb-res.so.0", + "libxcb-screensaver.so.0", + "libxcb-shape.so.0", + "libxcb-shm.so.0", + "libxcb.so.1", + "libxcb-sync.so.0", + "libxcb-xevie.so.0", + "libxcb-xf86dri.so.0", + "libxcb-xfixes.so.0", + "libxcb-xinerama.so.0", + "libxcb-xlib.so.0", + "libxcb-xprint.so.0", + "libxcb-xtest.so.0", + "libxcb-xvmc.so.0", + "libxcb-xv.so.0", + "libxcrypt.so.1", + "libzio.so.0", + "libz.so.1", +) + +from BinariesCheck import BinaryInfo + +def libname_from_soname (soname): + libname = string.split(soname, '.so.') + if len(libname) == 2: + if libname[0][-1:].isdigit(): + libname = string.join(libname, '-') + else: + libname = string.join(libname, '') + else: + libname = soname[:-3] + libname = libname.replace('.', '_') + return libname + +class LibraryPolicyCheck(AbstractCheck.AbstractCheck): + def __init__(self): + self.map = [] + AbstractCheck.AbstractCheck.__init__(self, "LibraryPolicyCheck") + + def check(self, pkg): + global _policy_legacy_exceptions + + if pkg.isSource(): + return + + # Only check unsuffixed lib* packages + if pkg.name.endswith('-devel') or pkg.name.endswith('-doc'): + return + + files = pkg.files() + + # Search for shared libraries in this package + libs = set() + libs_needed = set() + libs_to_dir = dict() + dirs = set() + reqlibs = set() + pkg_requires = set(map(lambda x: string.split(x[0],'(')[0], pkg.requires())) + + for f, pkgfile in files.items(): + if f.find('.so.') != -1 or f.endswith('.so'): + filename = pkg.dirName() + '/' + f + try: + if stat.S_ISREG(files[f].mode) and 'ELF' in pkgfile.magic: + bi = BinaryInfo(pkg, filename, f, False, True) + libs_needed = libs_needed.union(bi.needed) + if bi.soname != 0: + lib_dir = string.join(f.split('/')[:-1], '/') + libs.add(bi.soname) + libs_to_dir[bi.soname] = lib_dir + dirs.add(lib_dir) + if bi.soname in pkg_requires: + # But not if the library is used by the pkg itself + # This avoids program packages with their own private lib + # FIXME: we'd need to check if somebody else links to this lib + reqlibs.add(bi.soname) + except: + pass + pass + + std_dirs = dirs.intersection(('/lib', '/lib64', '/usr/lib', '/usr/lib64', + '/opt/kde3/lib', '/opt/kde3/lib64')) + + non_std_dirs = dirs.difference(std_dirs) + + # If this is a program package (all libs it provides are + # required by itself), bail out + if not pkg.name.startswith("lib") and len(libs.difference(reqlibs)) == 0: + return + + std_lib_package = False + if pkg.name.startswith("lib") and pkg.name[-1].isdigit(): + std_lib_package = True + + # ignore libs in a versioned non_std_dir + if std_lib_package: + for lib in libs.copy(): + lib_dir = libs_to_dir[lib] + if lib_dir.startswith("/opt/kde3"): + continue + for lib_part in lib_dir.split('/'): + if len(lib_part) == 0: + continue + if lib_part[-1].isdigit() and not lib_part.endswith("lib64"): + libs.remove(lib) + break + + # Check for non-versioned libs in a std lib package + if std_lib_package: + for lib in libs.copy(): + if not lib[-1].isdigit(): + printWarning(pkg, "shlib-unversioned-lib", lib) + libs.remove(lib) + + # If this package should be or should be splitted into shlib + # package(s) + if len(libs) > 0 and len(std_dirs) > 0: + # If the package contains a single shlib, name after soname + if len(libs) == 1: + soname = libs.copy().pop() + libname = libname_from_soname (soname) + if libname.startswith('lib') and pkg.name != libname and \ + pkg.name != libname + "-mini": + if libname in _policy_legacy_exceptions: + printWarning(pkg, 'shlib-legacy-policy-name-error', libname) + else: + printError(pkg, 'shlib-policy-name-error', libname) + + elif not pkg.name[-1:].isdigit(): + printError(pkg, 'shlib-policy-missing-suffix') + + if (not pkg.name.startswith('lib')) or pkg.name.endswith('-lang'): + return + + if not libs: + if pkg.name in _policy_legacy_exceptions: + printWarning(pkg, 'shlib-legacy-policy-missing-lib', pkg.name) + else: + printError(pkg, 'shlib-policy-missing-lib') + + # Verify no non-lib stuff is in the package + dirs = set() + for f in files: + if os.path.isdir(pkg.dirName()+f): + dirs.add(f) + + # Verify shared lib policy package doesn't have hard dependency on non-lib packages + if std_lib_package: + for dep in pkg.requires(): + if (dep[0].startswith('rpmlib(') or dep[0].startswith('config(')): + continue + if (dep[1] & (rpm.RPMSENSE_GREATER | rpm.RPMSENSE_EQUAL)) == rpm.RPMSENSE_EQUAL: + printWarning(pkg, "shlib-fixed-dependency", Pkg.formatRequire(dep[0], dep[1], dep[2])) + + # Verify non-lib stuff does not add dependencies + if libs: + for dep in pkg_requires.difference(_essential_dependencies): + if dep.find('.so.') != -1 and not dep in libs and not dep in libs_needed: + printError(pkg, 'shlib-policy-excessive-dependency', dep) + + # Check for non-versioned directories beyond sysdirs in package + sysdirs = [ '/lib', '/lib64', '/usr/lib', '/usr/lib64', + '/usr/share/doc/packages', '/usr/share' ] + cdirs = set() + for sysdir in sysdirs: + done = set() + for dir in dirs: + if dir.startswith(sysdir + '/'): + ssdir = string.split(dir[len(sysdir)+1:],'/')[0] + if not ssdir[-1].isdigit(): + cdirs.add(sysdir+'/'+ssdir) + done.add(dir) + dirs = dirs.difference(done) + map(lambda dir: printError(pkg, 'shlib-policy-nonversioned-dir', dir), cdirs) + +check=LibraryPolicyCheck() + +if Config.info: + addDetails( +'shlib-policy-missing-suffix', +"""Your package containing shared libraries does not end in a digit and +should probably be split.""", +'shlib-policy-devel-file', +"""Your shared library package contains development files. Split them into +a -devel subpackage.""", +'shlib-policy-name-error', +"""Your package contains a single shared library but is not named after its SONAME.""", +'shlib-policy-nonversioned-dir', +"""Your shared library package contains non-versioned directories. Those will not +allow to install multiple versions of the package in parallel.""", +'shlib-legacy-policy-name-error', +"""Your shared library package is not named after its SONAME, but it has been added to the list +of legacy exceptions. Please do not rename the package until SONAME changes, but if you have +to rename it for another reason, make sure you name it correctly.""", +'shlib-policy-excessive-dependency', +"""Your package starts with 'lib' as part of its name, but also contains binaries +that have more dependencies than those that already required by the libraries. +Those binaries should probably not be part of the library package, but split into +a seperate one to reduce the additional dependencies for other users of this library.""", +'shlib-policy-missing-lib', +"""Your package starts with 'lib' as part of its name, but does not provide +any libraries. It must not be called a lib-package then. Give it a more +sensible name.""", +'shlib-fixed-dependency', +"""Your shared library package requires a fixed version of another package. The +intention of the Shared Library Policy is to allow parallel installation of +multiple versions of the same shared library, hard dependencies likely make that +impossible. Please remove this dependency and instead move it to the runtime uses +of your library.""", +'shlib-unversioned-lib', +"""Your package matches the Shared Library Policy Naming Scheme but contains an +unversioned library. Therefore it is very unlikely that your package can be installed +in parallel to another version of this library package. Consider moving unversioned +parts into a runtime package.""" +) |