URL: https://github.com/freeipa/freeipa/pull/159 Author: jcholast Title: #159: spec file: clean up BuildRequires Action: synchronized
To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/159/head:pr159 git checkout pr159
From 506b3e9324bf0497162405594f8bc316b723f7ad Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 12 Oct 2016 13:20:32 +0200 Subject: [PATCH 1/7] spec file: clean up BuildRequires Add missing cyrus-sasl-devel, python-cffi, python-custodia, python-nose, python-paste, python-sssdconfig and systemd-python BuildRequires. Remove unused custodia, java-headless, m4, policycoreutils, python-kdcproxy, python-rhsm, pyOpenSSL and systemd-units BuildRequires. Correct versioned BuildRequires and provide explanatory comments. --- freeipa.spec.in | 125 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 50 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index e5e1292..c44929b 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -43,82 +43,107 @@ URL: http://www.freeipa.org/ Source0: freeipa-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) -%if ! %{ONLY_CLIENT} -BuildRequires: 389-ds-base-devel >= 1.3.5.6 -BuildRequires: svrcore-devel -BuildRequires: policycoreutils >= 2.1.12-5 -BuildRequires: systemd-units -BuildRequires: samba-devel >= %{samba_version} -BuildRequires: samba-python -BuildRequires: libtalloc-devel -BuildRequires: libtevent-devel -%endif # ONLY_CLIENT -BuildRequires: nspr-devel -BuildRequires: nss-devel -BuildRequires: openssl-devel BuildRequires: openldap-devel -BuildRequires: krb5-devel >= 1.13 -BuildRequires: krb5-workstation -BuildRequires: libuuid-devel -BuildRequires: libcurl-devel >= 7.21.7-2 +# 1.12: libkrad (http://krbdev.mit.edu/rt/Ticket/Display.html?id=7678) +BuildRequires: krb5-devel >= 1.12 +BuildRequires: libcurl-devel +# 1.27.4: xmlrpc_curl_xportparms.gssapi_delegation BuildRequires: xmlrpc-c-devel >= 1.27.4 BuildRequires: popt-devel BuildRequires: autoconf BuildRequires: automake -BuildRequires: m4 BuildRequires: libtool BuildRequires: gettext BuildRequires: python-devel +%if 0%{?with_python3} +BuildRequires: python3-devel +%endif # with_python3 +# %{_unitdir}, %{_tmpfilesdir} +BuildRequires: systemd +BuildRequires: libini_config-devel +BuildRequires: cyrus-sasl-devel +%if ! %{ONLY_CLIENT} +# 1.3.3.9: DS_Sleep (https://fedorahosted.org/389/ticket/48005) +BuildRequires: 389-ds-base-devel >= 1.3.3.9 +BuildRequires: svrcore-devel +%if 0%{?rhel} +BuildRequires: samba-devel >= 4.0.0 +%else +BuildRequires: samba-devel >= 2:4.0.0 +%endif +BuildRequires: libtalloc-devel +BuildRequires: libtevent-devel +BuildRequires: nspr-devel +BuildRequires: nss-devel +BuildRequires: openssl-devel +BuildRequires: libuuid-devel BuildRequires: python-ldap -BuildRequires: python-setuptools -BuildRequires: python-nss -BuildRequires: python-cryptography >= 0.9 BuildRequires: python-netaddr -BuildRequires: python-gssapi >= 1.1.2 -BuildRequires: python-rhsm -BuildRequires: pyOpenSSL -BuildRequires: pylint >= 1.0 -# workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1096506 -BuildRequires: python2-polib -BuildRequires: python-libipa_hbac -BuildRequires: python-memcached -BuildRequires: python-lxml -BuildRequires: python-pyasn1 >= 0.0.9a -BuildRequires: python-qrcode-core >= 5.0.0 -BuildRequires: python-dns >= 1.11.1 +BuildRequires: python-gssapi +BuildRequires: python-dns BuildRequires: libsss_idmap-devel +# 1.14.0: sss_nss_getnamebycert (https://fedorahosted.org/sssd/ticket/2897) BuildRequires: libsss_nss_idmap-devel >= 1.14.0 -BuildRequires: java-headless -BuildRequires: jsl BuildRequires: rhino BuildRequires: libverto-devel -BuildRequires: systemd BuildRequires: libunistring-devel BuildRequires: python-lesscpy -BuildRequires: python-yubico >= 1.2.3 -BuildRequires: openssl-devel -BuildRequires: pki-base >= 10.3.3-3 -BuildRequires: python-pytest-multihost >= 0.5 -BuildRequires: python-pytest-sourceorder -BuildRequires: python-kdcproxy >= 0.3 BuildRequires: python-six -BuildRequires: python-jwcrypto -BuildRequires: custodia -BuildRequires: libini_config-devel >= 1.2.0 +BuildRequires: python-netifaces +%endif # ONLY_CLIENT + +# +# Build dependencies for makeapi/makeaci +# +BuildRequires: krb5-workstation +BuildRequires: python-setuptools +BuildRequires: python-nss +# 0.6: serialization.load_pem_private_key, load_pem_public_key +BuildRequires: python-cryptography >= 0.6 +BuildRequires: python-libipa_hbac +BuildRequires: python-memcached +BuildRequires: python-lxml +BuildRequires: python-pyasn1 +# pki Python package +BuildRequires: pki-base BuildRequires: dbus-python -BuildRequires: python-netifaces >= 0.10.4 BuildRequires: python-libsss_nss_idmap +BuildRequires: python-cffi + +# +# Build dependencies for lint +# +BuildRequires: samba-python +BuildRequires: pylint >= 1.0 +# workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1096506 +BuildRequires: python2-polib +# 5.0.0: QRCode.print_ascii +BuildRequires: python-qrcode-core >= 5.0.0 +# 1.11.0: resolver.YXDOMAIN, Resolver.set_flags +BuildRequires: python-dns >= 1.11.0 +BuildRequires: jsl +BuildRequires: python-yubico +# 10.2.1: crypto.NSSCryptoProvider(password_file) +BuildRequires: pki-base >= 10.2.1 +BuildRequires: python-pytest-multihost +BuildRequires: python-pytest-sourceorder +BuildRequires: python-jwcrypto +BuildRequires: python-custodia BuildRequires: python-sss +BuildRequires: python-sssdconfig +BuildRequires: systemd-python +BuildRequires: python-nose +BuildRequires: python-paste +# # Build dependencies for unit tests +# +%if ! %{ONLY_CLIENT} BuildRequires: libcmocka-devel BuildRequires: nss_wrapper # Required by ipa_kdb_tests BuildRequires: %{_libdir}/krb5/plugins/kdb/db2.so - -%if 0%{?with_python3} -BuildRequires: python3-devel -%endif # with_python3 +%endif # ONLY_CLIENT %description IPA is an integrated solution to provide centrally managed Identity (users, From a53cbce81a1609a5025efb8a46beb2263eb7a9b8 Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 12 Oct 2016 13:27:16 +0200 Subject: [PATCH 2/7] spec file: do not include BuildRequires for lint by default Lint is never executed from rpmbuild, so the BuildRequires for lint are purely informational. Include them only if %with_lint RPM macro is specified. Update .travis.yml accordingly. --- .travis.yml | 2 +- freeipa.spec.in | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f221e82..d95eb25 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,4 @@ script: - > docker run -v $PWD:/freeipa -w /freeipa martbab/freeipa-fedora-builder:${TRAVIS_BRANCH}-latest - /bin/bash -c 'dnf builddep -y --spec freeipa.spec.in && make rpms' + /bin/bash -c 'dnf builddep -y -D "with_lint 1" --spec freeipa.spec.in && make rpms' diff --git a/freeipa.spec.in b/freeipa.spec.in index c44929b..2236758 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -8,6 +8,9 @@ %global with_python3 1 %endif +# lint is not executed during rpmbuild +%{!?with_lint:%global with_lint 0} + %global alt_name ipa %if 0%{?rhel} %global samba_version 4.0.5-1 @@ -113,6 +116,7 @@ BuildRequires: python-cffi # # Build dependencies for lint # +%if 0%{?with_lint} BuildRequires: samba-python BuildRequires: pylint >= 1.0 # workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1096506 @@ -134,6 +138,7 @@ BuildRequires: python-sssdconfig BuildRequires: systemd-python BuildRequires: python-nose BuildRequires: python-paste +%endif # with_lint # # Build dependencies for unit tests From 3bbd2f49b4dfd34ed9a22f8b1ebac576456dd3fc Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 24 Aug 2016 13:37:30 +0200 Subject: [PATCH 3/7] pylint: enable the import-error check Check for import errors with pylint to make sure new python package dependencies are not overlooked. --- client/ipa-client-automount | 2 ++ contrib/nssciphersuite/nssciphersuite.py | 5 ++++- install/tools/ipa-replica-manage | 4 +++- ipaclient/ipa_certupdate.py | 2 ++ ipalib/config.py | 2 ++ ipalib/parameters.py | 4 +++- ipalib/rpc.py | 1 + ipapython/config.py | 4 +++- ipapython/cookie.py | 2 ++ ipapython/dogtag.py | 3 +++ ipapython/nsslib.py | 1 + ipapython/secrets/kem.py | 6 +++++- ipapython/sysrestore.py | 2 ++ ipaserver/dcerpc.py | 11 +++++------ ipaserver/install/cainstance.py | 3 +++ ipaserver/install/installutils.py | 2 ++ ipaserver/install/ipa_backup.py | 6 ++++-- ipaserver/install/ipa_replica_prepare.py | 2 ++ ipaserver/install/ipa_restore.py | 2 ++ ipaserver/install/krainstance.py | 2 ++ ipaserver/install/server/upgrade.py | 2 ++ ipaserver/plugins/ldap2.py | 2 +- ipaserver/plugins/trust.py | 6 +++--- ipaserver/rpcserver.py | 4 +++- ipaserver/session.py | 2 ++ ipatests/test_ipalib/test_parameters.py | 4 +++- ipatests/test_ipalib/test_rpc.py | 5 +++-- ipatests/test_ipaserver/httptest.py | 1 + ipatests/test_webui/ui_driver.py | 5 ++++- pylintrc | 2 -- 30 files changed, 75 insertions(+), 24 deletions(-) diff --git a/client/ipa-client-automount b/client/ipa-client-automount index 88adb0a..fc619d0 100755 --- a/client/ipa-client-automount +++ b/client/ipa-client-automount @@ -30,7 +30,9 @@ import tempfile import gssapi import SSSDConfig +# pylint: disable=import-error from six.moves.urllib.parse import urlsplit +# pylint: enable=import-error from optparse import OptionParser from ipalib import api, errors diff --git a/contrib/nssciphersuite/nssciphersuite.py b/contrib/nssciphersuite/nssciphersuite.py index dee05d4..66e2b27 100755 --- a/contrib/nssciphersuite/nssciphersuite.py +++ b/contrib/nssciphersuite/nssciphersuite.py @@ -25,7 +25,10 @@ import operator import re -from urllib.request import urlopen # pylint: disable=no-name-in-module + +# pylint: disable=import-error,no-name-in-module +from urllib.request import urlopen +# pylint: enable=import-error,no-name-in-module SOURCE = "https://git.fedorahosted.org/cgit/mod_nss.git/plain/nss_engine_cipher.c" diff --git a/install/tools/ipa-replica-manage b/install/tools/ipa-replica-manage index d9dee9c..5ca7f59 100755 --- a/install/tools/ipa-replica-manage +++ b/install/tools/ipa-replica-manage @@ -28,7 +28,10 @@ import ldap import socket import traceback +# pylint: disable=import-error from six.moves.urllib.parse import urlparse +from six.moves.xmlrpc_client import MAXINT +# pylint: enable=import-error from ipapython import ipautil from ipaserver.install import replication, dsinstance, installutils @@ -42,7 +45,6 @@ from ipapython.ipa_log_manager import root_logger, standard_logging_setup from ipapython.dn import DN from ipapython.config import IPAOptionParser from ipaclient import ipadiscovery -from six.moves.xmlrpc_client import MAXINT from ipaplatform.paths import paths # dict of command name and tuples of min/max num of args needed diff --git a/ipaclient/ipa_certupdate.py b/ipaclient/ipa_certupdate.py index 2c6b94f..24cd041 100644 --- a/ipaclient/ipa_certupdate.py +++ b/ipaclient/ipa_certupdate.py @@ -21,7 +21,9 @@ import tempfile import shutil +# pylint: disable=import-error from six.moves.urllib.parse import urlsplit +# pylint: enable=import-error from ipapython import (admintool, ipautil, ipaldap, sysrestore, certmonger, certdb) diff --git a/ipalib/config.py b/ipalib/config.py index a273e3d..cf9e925 100644 --- a/ipalib/config.py +++ b/ipalib/config.py @@ -34,8 +34,10 @@ import sys import six +# pylint: disable=import-error from six.moves.urllib.parse import urlparse, urlunparse from six.moves.configparser import RawConfigParser, ParsingError +# pylint: enable=import-error from ipapython.dn import DN from ipalib.base import check_name diff --git a/ipalib/parameters.py b/ipalib/parameters.py index 1117fbe..073e138 100644 --- a/ipalib/parameters.py +++ b/ipalib/parameters.py @@ -103,9 +103,11 @@ import decimal import base64 import datetime -from six.moves.xmlrpc_client import MAXINT, MININT import six +# pylint: disable=import-error +from six.moves.xmlrpc_client import MAXINT, MININT +# pylint: enable=import-error from ipalib.text import _ as ugettext from ipalib.base import check_name diff --git a/ipalib/rpc.py b/ipalib/rpc.py index 19ce0cc..9594ab5 100644 --- a/ipalib/rpc.py +++ b/ipalib/rpc.py @@ -76,6 +76,7 @@ from xmlrpclib import (Binary, Fault, DateTime, dumps, loads, ServerProxy, Transport, ProtocolError, MININT, MAXINT) except ImportError: + # pylint: disable=import-error from xmlrpc.client import (Binary, Fault, DateTime, dumps, loads, ServerProxy, Transport, ProtocolError, MININT, MAXINT) diff --git a/ipapython/config.py b/ipapython/config.py index 59e4aa7..8e5708e 100644 --- a/ipapython/config.py +++ b/ipapython/config.py @@ -22,12 +22,14 @@ from dns import resolver, rdatatype from dns.exception import DNSException +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser +from six.moves.urllib.parse import urlsplit +# pylint: enable=import-error from ipapython.dn import DN from ipaplatform.paths import paths import dns.name -from six.moves.urllib.parse import urlsplit import socket diff --git a/ipapython/cookie.py b/ipapython/cookie.py index 97f24b2..8abd961 100644 --- a/ipapython/cookie.py +++ b/ipapython/cookie.py @@ -23,7 +23,9 @@ from calendar import timegm import six +# pylint: disable=import-error from six.moves.urllib.parse import urlparse +# pylint: enable=import-error from ipapython.ipa_log_manager import log_mgr diff --git a/ipapython/dogtag.py b/ipapython/dogtag.py index 179ce6d..f4f1955 100644 --- a/ipapython/dogtag.py +++ b/ipapython/dogtag.py @@ -22,7 +22,9 @@ import nss.nss as nss import six +# pylint: disable=import-error from six.moves.urllib.parse import urlencode +# pylint: enable=import-error from ipalib import api, errors from ipalib.errors import NetworkError @@ -35,6 +37,7 @@ try: import httplib except ImportError: + # pylint: disable=import-error import http.client as httplib if six.PY3: diff --git a/ipapython/nsslib.py b/ipapython/nsslib.py index f9f64c1..08d05fc 100644 --- a/ipapython/nsslib.py +++ b/ipapython/nsslib.py @@ -35,6 +35,7 @@ try: import httplib except ImportError: + # pylint: disable=import-error import http.client as httplib # NSS database currently open diff --git a/ipapython/secrets/kem.py b/ipapython/secrets/kem.py index fb51e64..7f92c9f 100644 --- a/ipapython/secrets/kem.py +++ b/ipapython/secrets/kem.py @@ -2,8 +2,12 @@ from __future__ import print_function import os -from ipaplatform.paths import paths + +# pylint: disable=import-error from six.moves.configparser import ConfigParser +# pylint: enable=import-error + +from ipaplatform.paths import paths from ipapython.dn import DN from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization diff --git a/ipapython/sysrestore.py b/ipapython/sysrestore.py index 6257268..b1bf4b9 100644 --- a/ipapython/sysrestore.py +++ b/ipapython/sysrestore.py @@ -30,7 +30,9 @@ import random import six +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser +# pylint: enable=import-error from ipaplatform.tasks import tasks from ipaplatform.paths import paths diff --git a/ipaserver/dcerpc.py b/ipaserver/dcerpc.py index bd1d8c1..ac13aac 100644 --- a/ipaserver/dcerpc.py +++ b/ipaserver/dcerpc.py @@ -44,12 +44,6 @@ import random from cryptography.hazmat.primitives.ciphers import Cipher, algorithms from cryptography.hazmat.backends import default_backend -# pylint: disable=F0401 -try: - from ldap.controls import RequestControl as LDAPControl -except ImportError: - from ldap.controls import LDAPControl as LDAPControl -# pylint: enable=F0401 import ldap as _ldap from ipapython.ipaldap import IPAdmin from ipaserver.session import krbccache_dir, krbccache_prefix @@ -63,6 +57,11 @@ from ldap.filter import escape_filter_chars from time import sleep +try: + from ldap.controls import RequestControl as LDAPControl +except ImportError: + from ldap.controls import LDAPControl as LDAPControl + if six.PY3: unicode = str long = int diff --git a/ipaserver/install/cainstance.py b/ipaserver/install/cainstance.py index 384abc3..f115624 100644 --- a/ipaserver/install/cainstance.py +++ b/ipaserver/install/cainstance.py @@ -39,8 +39,10 @@ import shlex import pipes +# pylint: disable=import-error from six.moves import urllib from six.moves.configparser import ConfigParser, RawConfigParser +# pylint: enable=import-error from ipalib import api from ipalib import pkcs10, x509 @@ -79,6 +81,7 @@ try: import httplib except ImportError: + # pylint: disable=import-error import http.client as httplib # We need to reset the template because the CA uses the regular boot diff --git a/ipaserver/install/installutils.py b/ipaserver/install/installutils.py index f240dc3..8111f18 100644 --- a/ipaserver/install/installutils.py +++ b/ipaserver/install/installutils.py @@ -40,7 +40,9 @@ import ldap import ldapurl import six +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser, NoOptionError +# pylint: enable=import-error import ipaplatform diff --git a/ipaserver/install/ipa_backup.py b/ipaserver/install/ipa_backup.py index e7fefd8..0ebcc35 100644 --- a/ipaserver/install/ipa_backup.py +++ b/ipaserver/install/ipa_backup.py @@ -22,11 +22,13 @@ import tempfile import time import pwd -from ipaplatform.paths import paths -from ipaplatform import services +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser +# pylint: enable=import-error +from ipaplatform.paths import paths +from ipaplatform import services from ipalib import api, errors from ipapython import version from ipapython.ipautil import run, write_tmp_file diff --git a/ipaserver/install/ipa_replica_prepare.py b/ipaserver/install/ipa_replica_prepare.py index d7ab813..2eef5fe 100644 --- a/ipaserver/install/ipa_replica_prepare.py +++ b/ipaserver/install/ipa_replica_prepare.py @@ -28,7 +28,9 @@ from optparse import OptionGroup, SUPPRESS_HELP import dns.resolver +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser +# pylint: enable=import-error from ipaserver.install import certs, installutils, bindinstance, dsinstance from ipaserver.install.replication import enable_replication_version_checking diff --git a/ipaserver/install/ipa_restore.py b/ipaserver/install/ipa_restore.py index 64ab9e4..ae0b28f 100644 --- a/ipaserver/install/ipa_restore.py +++ b/ipaserver/install/ipa_restore.py @@ -25,7 +25,9 @@ import ldif import itertools +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser +# pylint: enable=import-error from ipalib import api, errors from ipalib.constants import FQDN diff --git a/ipaserver/install/krainstance.py b/ipaserver/install/krainstance.py index 590a840..a2210a2 100644 --- a/ipaserver/install/krainstance.py +++ b/ipaserver/install/krainstance.py @@ -22,7 +22,9 @@ import shutil import tempfile +# pylint: disable=import-error from six.moves.configparser import ConfigParser +# pylint: enable=import-error from ipalib import api from ipalib import x509 diff --git a/ipaserver/install/server/upgrade.py b/ipaserver/install/server/upgrade.py index 4426b7f..021d02e 100644 --- a/ipaserver/install/server/upgrade.py +++ b/ipaserver/install/server/upgrade.py @@ -14,7 +14,9 @@ import dns.exception import six +# pylint: disable=import-error from six.moves.configparser import SafeConfigParser +# pylint: enable=import-error from ipalib import api import SSSDConfig diff --git a/ipaserver/plugins/ldap2.py b/ipaserver/plugins/ldap2.py index 1793503..1b90573 100644 --- a/ipaserver/plugins/ldap2.py +++ b/ipaserver/plugins/ldap2.py @@ -39,7 +39,7 @@ try: - from ldap.controls.simple import GetEffectiveRightsControl #pylint: disable=F0401,E0611 + from ldap.controls.simple import GetEffectiveRightsControl except ImportError: """ python-ldap 2.4.x introduced a new API for effective rights control, which diff --git a/ipaserver/plugins/trust.py b/ipaserver/plugins/trust.py index 5326255..c0c080d 100644 --- a/ipaserver/plugins/trust.py +++ b/ipaserver/plugins/trust.py @@ -49,20 +49,20 @@ unicode = str try: - import pysss_murmur #pylint: disable=F0401 + import pysss_murmur _murmur_installed = True except Exception as e: _murmur_installed = False try: - import pysss_nss_idmap #pylint: disable=F0401 + import pysss_nss_idmap _nss_idmap_installed = True except Exception as e: _nss_idmap_installed = False if api.env.in_server and api.env.context in ['lite', 'server']: try: - import ipaserver.dcerpc # pylint: disable=F0401 + import ipaserver.dcerpc from ipaserver.dcerpc import (TRUST_ONEWAY, TRUST_BIDIRECTIONAL, TRUST_JOIN_EXTERNAL) diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py index c4f724a..502629f 100644 --- a/ipaserver/rpcserver.py +++ b/ipaserver/rpcserver.py @@ -24,7 +24,6 @@ """ from xml.sax.saxutils import escape -from six.moves.xmlrpc_client import Fault import os import datetime import json @@ -36,7 +35,10 @@ from pyasn1.type import univ, namedtype from pyasn1.codec.ber import encoder import six +# pylint: disable=import-error from six.moves.urllib.parse import parse_qs +from six.moves.xmlrpc_client import Fault +# pylint: enable=import-error from ipalib import plugable, errors from ipalib.capabilities import VERSION_WITHOUT_CAPABILITIES diff --git a/ipaserver/session.py b/ipaserver/session.py index c5e5fac..85deb15 100644 --- a/ipaserver/session.py +++ b/ipaserver/session.py @@ -22,7 +22,9 @@ import re import time +# pylint: disable=import-error from six.moves.urllib.parse import urlparse +# pylint: enable=import-error from ipalib import errors from ipalib.text import _ diff --git a/ipatests/test_ipalib/test_parameters.py b/ipatests/test_ipalib/test_parameters.py index a23f97d..d0bab40 100644 --- a/ipatests/test_ipalib/test_parameters.py +++ b/ipatests/test_ipalib/test_parameters.py @@ -30,10 +30,12 @@ import sys from decimal import Decimal from inspect import isclass -from six.moves.xmlrpc_client import MAXINT, MININT import pytest import six +# pylint: disable=import-error +from six.moves.xmlrpc_client import MAXINT, MININT +# pylint: enable=import-error from ipatests.util import raises, ClassChecker, read_only from ipatests.util import dummy_ugettext, assert_equal diff --git a/ipatests/test_ipalib/test_rpc.py b/ipatests/test_ipalib/test_rpc.py index cfa1515..80cf2e7 100644 --- a/ipatests/test_ipalib/test_rpc.py +++ b/ipatests/test_ipalib/test_rpc.py @@ -22,10 +22,11 @@ """ from __future__ import print_function -from six.moves.xmlrpc_client import Binary, Fault, dumps, loads - import nose import six +# pylint: disable=import-error +from six.moves.xmlrpc_client import Binary, Fault, dumps, loads +# pylint: enable=import-error from ipatests.util import raises, assert_equal, PluginTester, DummyClass from ipatests.data import binary_bytes, utf8_bytes, unicode_str diff --git a/ipatests/test_ipaserver/httptest.py b/ipatests/test_ipaserver/httptest.py index 75d30af..c816456 100644 --- a/ipatests/test_ipaserver/httptest.py +++ b/ipatests/test_ipaserver/httptest.py @@ -29,6 +29,7 @@ try: import httplib except ImportError: + # pylint: disable=import-error import http.client as httplib class Unauthorized_HTTP_test(object): diff --git a/ipatests/test_webui/ui_driver.py b/ipatests/test_webui/ui_driver.py index d581ad4..4ce3668 100644 --- a/ipatests/test_webui/ui_driver.py +++ b/ipatests/test_webui/ui_driver.py @@ -32,6 +32,10 @@ from functools import wraps from nose.plugins.skip import SkipTest +# pylint: disable=import-error +from six.moves.urllib.error import URLError +# pylint: enable=import-error + try: from selenium import webdriver from selenium.common.exceptions import NoSuchElementException @@ -53,7 +57,6 @@ NO_YAML = False except ImportError: NO_YAML = True -from six.moves.urllib.error import URLError from ipaplatform.paths import paths ENV_MAP = { diff --git a/pylintrc b/pylintrc index 8643f8d..07acb1f 100644 --- a/pylintrc +++ b/pylintrc @@ -18,7 +18,6 @@ enable= disable= I, duplicate-code, - import-error, interface-not-implemented, no-self-use, redefined-variable-type, @@ -33,7 +32,6 @@ disable= too-many-public-methods, too-many-return-statements, too-many-statements, - import-error, abstract-method, anomalous-backslash-in-string, arguments-differ, From a5b013d41aa665d54ab54cd011679e3736a0043e Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 24 Aug 2016 12:52:08 +0200 Subject: [PATCH 4/7] ipaserver: remove ipalib import from setup.py Instead of importing ipalib to get IPA version string, create setup.py from a template and have the version string automatically filled in. This makes it possible to build the ipaserver package without having to have ipalib dependencies installed. --- Makefile | 2 ++ freeipa.spec.in | 12 ++++---- setup.py | 86 --------------------------------------------------------- setup.py.in | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 92 deletions(-) delete mode 100755 setup.py create mode 100755 setup.py.in diff --git a/Makefile b/Makefile index 6324308..c593990 100644 --- a/Makefile +++ b/Makefile @@ -166,6 +166,8 @@ version-update: release-update freeipa.spec.in > freeipa.spec sed -e s/__VERSION__/$(IPA_VERSION)/ version.m4.in \ > version.m4 + sed -e s/__VERSION__/$(IPA_VERSION)/ setup.py.in \ + > setup.py sed -e s/__VERSION__/$(IPA_VERSION)/ ipapython/setup.py.in \ > ipapython/setup.py sed -e s/__VERSION__/$(IPA_VERSION)/ ipaplatform/setup.py.in \ diff --git a/freeipa.spec.in b/freeipa.spec.in index 2236758..9db9f55 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -80,10 +80,6 @@ BuildRequires: nspr-devel BuildRequires: nss-devel BuildRequires: openssl-devel BuildRequires: libuuid-devel -BuildRequires: python-ldap -BuildRequires: python-netaddr -BuildRequires: python-gssapi -BuildRequires: python-dns BuildRequires: libsss_idmap-devel # 1.14.0: sss_nss_getnamebycert (https://fedorahosted.org/sssd/ticket/2897) BuildRequires: libsss_nss_idmap-devel >= 1.14.0 @@ -91,25 +87,29 @@ BuildRequires: rhino BuildRequires: libverto-devel BuildRequires: libunistring-devel BuildRequires: python-lesscpy -BuildRequires: python-six -BuildRequires: python-netifaces %endif # ONLY_CLIENT # # Build dependencies for makeapi/makeaci # BuildRequires: krb5-workstation +BuildRequires: python-ldap BuildRequires: python-setuptools BuildRequires: python-nss # 0.6: serialization.load_pem_private_key, load_pem_public_key BuildRequires: python-cryptography >= 0.6 +BuildRequires: python-netaddr +BuildRequires: python-gssapi BuildRequires: python-libipa_hbac BuildRequires: python-memcached BuildRequires: python-lxml BuildRequires: python-pyasn1 +BuildRequires: python-dns # pki Python package BuildRequires: pki-base +BuildRequires: python-six BuildRequires: dbus-python +BuildRequires: python-netifaces BuildRequires: python-libsss_nss_idmap BuildRequires: python-cffi diff --git a/setup.py b/setup.py deleted file mode 100755 index 960a8f2..0000000 --- a/setup.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/python2 - -# Authors: -# Jason Gerard DeRose <jder...@redhat.com> -# -# Copyright (C) 2008 Red Hat -# see file 'COPYING' for use and warranty information -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -""" -Python-level packaging using distutils. -""" - -from distutils.core import setup -from distutils.command.install_data import install_data as _install_data -from distutils.util import change_root, convert_path -from distutils import log -import ipalib -import os - -class install_data(_install_data): - """Override the built-in install_data to gzip files once they - are installed. - """ - - def run(self): - # install_data is a classic class so super() won't work. Call it - # directly to copy the files first. - _install_data.run(self) - - # Now gzip them - for f in self.data_files: - if isinstance(f, str): - # it's a simple file - f = convert_path(f) - cmd = '/bin/gzip %s/%s' % (self.install_dir, f) - log.info("gzipping %s/%s" % (self.install_dir, f)) - os.system(cmd) - else: - # it's a tuple with path and a list of files - dir = convert_path(f[0]) - if not os.path.isabs(dir): - dir = os.path.join(self.install_dir, dir) - elif self.root: - dir = change_root(self.root, dir) - - if f[1] == []: - # If there are no files listed the user must be - # trying to create an empty directory. So nothing - # to do here. - pass - else: - # gzip the files - for data in f[1]: - data = convert_path(data) - cmd = '/bin/gzip %s/%s' % (dir, data) - log.info("gzipping %s/%s" % (dir, data)) - os.system(cmd) - -setup( - name='freeipa', - version=ipalib.__version__, - license='GPLv3+', - url='http://freeipa.org/', - packages=[ - 'ipaserver', - 'ipaserver.advise', - 'ipaserver.advise.plugins', - 'ipaserver.plugins', - 'ipaserver.install', - 'ipaserver.install.plugins', - 'ipaserver.install.server', - ], -) diff --git a/setup.py.in b/setup.py.in new file mode 100755 index 0000000..dca81cc --- /dev/null +++ b/setup.py.in @@ -0,0 +1,85 @@ +#!/usr/bin/python2 + +# Authors: +# Jason Gerard DeRose <jder...@redhat.com> +# +# Copyright (C) 2008 Red Hat +# see file 'COPYING' for use and warranty information +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +""" +Python-level packaging using distutils. +""" + +from distutils.core import setup +from distutils.command.install_data import install_data as _install_data +from distutils.util import change_root, convert_path +from distutils import log +import os + +class install_data(_install_data): + """Override the built-in install_data to gzip files once they + are installed. + """ + + def run(self): + # install_data is a classic class so super() won't work. Call it + # directly to copy the files first. + _install_data.run(self) + + # Now gzip them + for f in self.data_files: + if isinstance(f, str): + # it's a simple file + f = convert_path(f) + cmd = '/bin/gzip %s/%s' % (self.install_dir, f) + log.info("gzipping %s/%s" % (self.install_dir, f)) + os.system(cmd) + else: + # it's a tuple with path and a list of files + dir = convert_path(f[0]) + if not os.path.isabs(dir): + dir = os.path.join(self.install_dir, dir) + elif self.root: + dir = change_root(self.root, dir) + + if f[1] == []: + # If there are no files listed the user must be + # trying to create an empty directory. So nothing + # to do here. + pass + else: + # gzip the files + for data in f[1]: + data = convert_path(data) + cmd = '/bin/gzip %s/%s' % (dir, data) + log.info("gzipping %s/%s" % (dir, data)) + os.system(cmd) + +setup( + name='freeipa', + version='__VERSION__', + license='GPLv3+', + url='http://freeipa.org/', + packages=[ + 'ipaserver', + 'ipaserver.advise', + 'ipaserver.advise.plugins', + 'ipaserver.plugins', + 'ipaserver.install', + 'ipaserver.install.plugins', + 'ipaserver.install.server', + ], +) From bf3d93c34621182b00062c75719b83beee6e0b05 Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 24 Aug 2016 13:36:12 +0200 Subject: [PATCH 5/7] makeapi, makeaci: do not fail on missing imports Add import hook to makeapi and makeaci which makes them ignore import errors in modules in our source tree and instead print a warning. This makes it possible to build IPA without having to have most of our runtime dependencies installed. --- freeipa.spec.in | 21 ++++++------ ignore_import_errors.py | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ makeaci | 2 ++ makeapi | 3 ++ 4 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 ignore_import_errors.py diff --git a/freeipa.spec.in b/freeipa.spec.in index 9db9f55..9b5800c 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -94,22 +94,11 @@ BuildRequires: python-lesscpy # BuildRequires: krb5-workstation BuildRequires: python-ldap -BuildRequires: python-setuptools BuildRequires: python-nss -# 0.6: serialization.load_pem_private_key, load_pem_public_key -BuildRequires: python-cryptography >= 0.6 BuildRequires: python-netaddr -BuildRequires: python-gssapi -BuildRequires: python-libipa_hbac -BuildRequires: python-memcached -BuildRequires: python-lxml BuildRequires: python-pyasn1 BuildRequires: python-dns -# pki Python package -BuildRequires: pki-base BuildRequires: python-six -BuildRequires: dbus-python -BuildRequires: python-netifaces BuildRequires: python-libsss_nss_idmap BuildRequires: python-cffi @@ -118,21 +107,31 @@ BuildRequires: python-cffi # %if 0%{?with_lint} BuildRequires: samba-python +BuildRequires: python-setuptools +# 0.6: serialization.load_pem_private_key, load_pem_public_key +BuildRequires: python-cryptography >= 0.6 +BuildRequires: python-gssapi BuildRequires: pylint >= 1.0 # workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1096506 BuildRequires: python2-polib +BuildRequires: python-libipa_hbac +BuildRequires: python-memcached +BuildRequires: python-lxml # 5.0.0: QRCode.print_ascii BuildRequires: python-qrcode-core >= 5.0.0 # 1.11.0: resolver.YXDOMAIN, Resolver.set_flags BuildRequires: python-dns >= 1.11.0 BuildRequires: jsl BuildRequires: python-yubico +# pki Python package # 10.2.1: crypto.NSSCryptoProvider(password_file) BuildRequires: pki-base >= 10.2.1 BuildRequires: python-pytest-multihost BuildRequires: python-pytest-sourceorder BuildRequires: python-jwcrypto BuildRequires: python-custodia +BuildRequires: dbus-python +BuildRequires: python-netifaces BuildRequires: python-sss BuildRequires: python-sssdconfig BuildRequires: systemd-python diff --git a/ignore_import_errors.py b/ignore_import_errors.py new file mode 100644 index 0000000..d9a9a41 --- /dev/null +++ b/ignore_import_errors.py @@ -0,0 +1,86 @@ +# +# Copyright (C) 2016 FreeIPA Contributors see COPYING for license +# + +""" +ImportError ignoring import hook. +""" + +from __future__ import print_function + +import imp +import inspect +import os.path +import sys + +DIRNAME = os.path.dirname(os.path.abspath(__file__)) + + +class FailedImport(object): + def __init__(self, loader, name): + self.__file__ = __file__ + self.__name__ = name + self.__path__ = [] + self.__loader__ = loader + self.__package__ = name + + def __repr__(self): + return '<failed import {!r}>'.format(self.__name__) + + +class IgnoringImporter(object): + def find_module(self, fullname, path=None): + parentname, dot, name = fullname.rpartition('.') + assert (not dot and path is None) or (dot and path is not None) + + # check if the module can be found + try: + file, filename, description = imp.find_module(name, path) + except ImportError: + pass + else: + if file is not None: + file.close() + # it can be found, do normal import + return None + + # check if the parent module import failed + if dot and isinstance(sys.modules[parentname], FailedImport): + # it did fail, so this import will fail as well + return self + + # find out from where are we importing + if path is None: + path = sys.path + for pathname in path: + pathname = os.path.abspath(pathname) + if not pathname.startswith(DIRNAME): + break + else: + # importing from our source tree, do normal import + return None + + # find out into what .py file are we importing + frame = inspect.currentframe().f_back + filename = frame.f_code.co_filename + if filename.startswith('<'): + # not a file, do normal import + return None + filename = os.path.abspath(filename) + if not filename.startswith(DIRNAME): + # not a file in our source tree, do normal import + return None + + return self + + def load_module(self, fullname): + frame = inspect.currentframe().f_back + print("{}:{}: No module named {}".format( + os.path.relpath(frame.f_code.co_filename), + frame.f_lineno, + fullname)) + + return sys.modules.setdefault(fullname, FailedImport(self, fullname)) + + +sys.meta_path.insert(0, IgnoringImporter()) diff --git a/makeaci b/makeaci index 6673112..98b199c 100755 --- a/makeaci +++ b/makeaci @@ -30,6 +30,8 @@ import sys import difflib from argparse import ArgumentParser +import ignore_import_errors # pylint: disable=unused-import + from ipalib import api from ipapython.dn import DN from ipapython.ipaldap import LDAPClient diff --git a/makeapi b/makeapi index 38ae166..a02a491 100755 --- a/makeapi +++ b/makeapi @@ -32,6 +32,9 @@ import os import re import inspect import operator + +import ignore_import_errors # pylint: disable=unused-import + from ipalib import api from ipalib.parameters import Param from ipalib.output import Output From 4fa5d2c94cf467063408c075b9994ac83883dde2 Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 24 Aug 2016 13:31:36 +0200 Subject: [PATCH 6/7] client: remove unused libcurl build dependency --- client/Makefile.am | 1 - client/configure.ac | 12 ------------ freeipa.spec.in | 1 - 3 files changed, 14 deletions(-) diff --git a/client/Makefile.am b/client/Makefile.am index 3d135a3..44a5ab6 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -86,7 +86,6 @@ ipa_join_LDADD = \ $(KRB5_LIBS) \ $(OPENLDAP_LIBS) \ $(SASL_LIBS) \ - $(CURL_LIBS) \ $(XMLRPC_LIBS) \ $(POPT_LIBS) \ $(LIBINTL_LIBS) \ diff --git a/client/configure.ac b/client/configure.ac index 58f23af..7d1a8cd 100644 --- a/client/configure.ac +++ b/client/configure.ac @@ -139,18 +139,6 @@ AC_CHECK_LIB(sasl2, sasl_client_init, [SASL_LIBS="-lsasl2"]) AC_SUBST(SASL_LIBS) dnl --------------------------------------------------------------------------- -dnl - Check for CURL -dnl --------------------------------------------------------------------------- - -CURL_LIBS= -AC_CHECK_HEADER(curl/curl.h, [], [AC_MSG_ERROR([curl/curl.h not found])]) -AC_CHECK_LIB(curl, curl_easy_init, [CURL_LIBS="-lcurl"]) -if test "x$CURL_LIBS" = "x" ; then - AC_MSG_ERROR([curl not found]) -fi -AC_SUBST(CURL_LIBS) - -dnl --------------------------------------------------------------------------- dnl - Check for XMLRPC-C dnl --------------------------------------------------------------------------- diff --git a/freeipa.spec.in b/freeipa.spec.in index 9b5800c..4430a73 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -49,7 +49,6 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: openldap-devel # 1.12: libkrad (http://krbdev.mit.edu/rt/Ticket/Display.html?id=7678) BuildRequires: krb5-devel >= 1.12 -BuildRequires: libcurl-devel # 1.27.4: xmlrpc_curl_xportparms.gssapi_delegation BuildRequires: xmlrpc-c-devel >= 1.27.4 BuildRequires: popt-devel From b624bd488630394443ce47ffe1a94983bf9f4631 Mon Sep 17 00:00:00 2001 From: Jan Cholasta <jchol...@redhat.com> Date: Wed, 24 Aug 2016 13:32:29 +0200 Subject: [PATCH 7/7] pwpolicy: do not run klist on import On pwpolicy module import, "klist -V" is run to determine if the installed krb5 version supports account lockout (>= 1.8). Remove the check, as we require a krb5 version which does support account lockout (1.12). --- freeipa.spec.in | 1 - ipaserver/plugins/pwpolicy.py | 56 +++++++++++++++---------------------------- 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/freeipa.spec.in b/freeipa.spec.in index 4430a73..c91b860 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -91,7 +91,6 @@ BuildRequires: python-lesscpy # # Build dependencies for makeapi/makeaci # -BuildRequires: krb5-workstation BuildRequires: python-ldap BuildRequires: python-nss BuildRequires: python-netaddr diff --git a/ipaserver/plugins/pwpolicy.py b/ipaserver/plugins/pwpolicy.py index e5e68fb..988a526 100644 --- a/ipaserver/plugins/pwpolicy.py +++ b/ipaserver/plugins/pwpolicy.py @@ -31,9 +31,7 @@ from ipalib import _ from ipalib.plugable import Registry from ipalib.request import context -from ipapython.ipautil import run from ipapython.dn import DN -from distutils import version import six @@ -282,40 +280,6 @@ class pwpolicy(LDAPObject): }, } - MIN_KRB5KDC_WITH_LOCKOUT = "1.8" - has_lockout = False - lockout_params = () - - result = run(['klist', '-V'], raiseonerr=False, capture_output=True) - if result.returncode == 0: - verstr = result.output.split()[-1] - ver = version.LooseVersion(verstr) - min = version.LooseVersion(MIN_KRB5KDC_WITH_LOCKOUT) - if ver >= min: - has_lockout = True - - if has_lockout: - lockout_params = ( - Int('krbpwdmaxfailure?', - cli_name='maxfail', - label=_('Max failures'), - doc=_('Consecutive failures before lockout'), - minvalue=0, - ), - Int('krbpwdfailurecountinterval?', - cli_name='failinterval', - label=_('Failure reset interval'), - doc=_('Period after which failure count will be reset (seconds)'), - minvalue=0, - ), - Int('krbpwdlockoutduration?', - cli_name='lockouttime', - label=_('Lockout duration'), - doc=_('Period for which lockout is enforced (seconds)'), - minvalue=0, - ), - ) - label = _('Password Policies') label_singular = _('Password Policy') @@ -365,7 +329,25 @@ class pwpolicy(LDAPObject): minvalue=0, flags=('virtual_attribute',), ), - ) + lockout_params + Int('krbpwdmaxfailure?', + cli_name='maxfail', + label=_('Max failures'), + doc=_('Consecutive failures before lockout'), + minvalue=0, + ), + Int('krbpwdfailurecountinterval?', + cli_name='failinterval', + label=_('Failure reset interval'), + doc=_('Period after which failure count will be reset (seconds)'), + minvalue=0, + ), + Int('krbpwdlockoutduration?', + cli_name='lockouttime', + label=_('Lockout duration'), + doc=_('Period for which lockout is enforced (seconds)'), + minvalue=0, + ), + ) def get_dn(self, *keys, **options): if keys[-1] is not None:
-- 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