summaryrefslogtreecommitdiffstats
path: root/install/tools/ipa-compliance
diff options
context:
space:
mode:
Diffstat (limited to 'install/tools/ipa-compliance')
-rw-r--r--install/tools/ipa-compliance201
1 files changed, 0 insertions, 201 deletions
diff --git a/install/tools/ipa-compliance b/install/tools/ipa-compliance
deleted file mode 100644
index 9b34350b4..000000000
--- a/install/tools/ipa-compliance
+++ /dev/null
@@ -1,201 +0,0 @@
-#!/usr/bin/env python
-#
-# Authors:
-# Rob Crittenden <rcritten@redhat.com>
-#
-# Copyright (C) 2010 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/>.
-#
-# An LDAP client to count entitlements and log to syslog if the number is
-# exceeded.
-
-try:
- import sys
- import os
- import syslog
- import tempfile
- import krbV
- import base64
- import shutil
-
- from rhsm.certificate import EntitlementCertificate
-
- from ipaserver.plugins.ldap2 import ldap2
- from ipalib import api, errors, backend
- from ipaserver.install import installutils
- from ipapython.dn import DN
-except ImportError, e:
- # If python-rhsm isn't installed exit gracefully and quietly.
- if e.args[0] == 'No module named rhsm.certificate':
- sys.exit(0)
- print >> sys.stderr, """\
-There was a problem importing one of the required Python modules. The
-error was:
-
- %s
-""" % sys.exc_value
- sys.exit(1)
-
-# Each IPA server comes with this many entitlements
-DEFAULT_ENTITLEMENTS = 25
-
-class client(backend.Executioner):
- """
- A simple-minded IPA client that can execute remote commands.
- """
-
- def run(self, method, **kw):
- self.create_context()
- result = self.execute(method, **kw)
- return result
-
-def parse_options():
- from optparse import OptionParser
-
- parser = OptionParser()
- parser.add_option("--debug", dest="debug", action="store_true",
- default=False, help="enable debugging")
-
- options, args = parser.parse_args()
- return options, args
-
-def check_compliance(tmpdir, debug=False):
- cfg = dict(
- context='cli',
- in_server=False,
- debug=debug,
- verbose=0,
- )
-
- api.bootstrap(**cfg)
- api.register(client)
- api.finalize()
- from ipalib.x509 import normalize_certificate, make_pem
-
- try:
- # Create a new credentials cache for this tool. This executes
- # using the systems host principal.
- ccache_file = 'FILE:%s/ccache' % tmpdir
- krbcontext = krbV.default_context()
- principal = str('host/%s@%s' % (api.env.host, api.env.realm))
- keytab = krbV.Keytab(name='/etc/krb5.keytab', context=krbcontext)
- principal = krbV.Principal(name=principal, context=krbcontext)
- os.environ['KRB5CCNAME'] = ccache_file
- ccache = krbV.CCache(name=ccache_file, context=krbcontext, primary_principal=principal)
- ccache.init(principal)
- ccache.init_creds_keytab(keytab=keytab, principal=principal)
- except krbV.Krb5Error, e:
- raise StandardError('Error initializing principal %s in %s: %s' % (principal.name, '/etc/krb5.keytab', str(e)))
-
- # entitle-sync doesn't return any information we want to see, it just
- # needs to be done so the LDAP data is correct.
- try:
- result = api.Backend.client.run('entitle_sync')
- except errors.NotRegisteredError:
- # Even if not registered they have some default entitlements
- pass
-
- conn = ldap2(shared_instance=False)
-
- # Bind using GSSAPI
- conn.connect(ccache=ccache_file)
-
- hostcount = 0
- # Get the hosts first
- try:
- (entries, truncated) = conn.find_entries('(krblastpwdchange=*)', [],
- DN(api.env.container_host, api.env.basedn),
- conn.SCOPE_ONELEVEL,
- size_limit = -1)
- except errors.NotFound:
- # No hosts
- pass
-
- if not truncated:
- hostcount = len(entries)
- else:
- # This will not happen unless we bump into a server-side limit.
- msg = 'The host count result was truncated, they will be underreported'
- syslog.syslog(syslog.LOG_ERR, msg)
- if sys.stdin.isatty():
- print msg
-
- available = 0
- try:
- (entries, truncated) = conn.find_entries('(objectclass=ipaentitlement)',
- ['userCertificate'],
- DN(api.env.container_entitlements, api.env.basedn),
- conn.SCOPE_ONELEVEL,
- size_limit = -1)
-
- for entry in entries:
- (dn, attrs) = entry
- if 'usercertificate' in attrs:
- rawcert = attrs['usercertificate'][0]
- rawcert = normalize_certificate(rawcert)
- cert = make_pem(base64.b64encode(rawcert))
- cert = EntitlementCertificate(cert)
- order = cert.getOrder()
- available += int(order.getQuantityUsed())
- except errors.NotFound:
- pass
-
- conn.disconnect()
-
- available += DEFAULT_ENTITLEMENTS
-
- if hostcount > available:
- syslog.syslog(syslog.LOG_ERR, 'IPA is out of compliance: %d of %d entitlements used.' % (hostcount, available))
- if sys.stdin.isatty():
- print 'IPA is out of compliance: %d of %d entitlements used.' % (hostcount, available)
- else:
- if sys.stdin.isatty():
- # If run from the command-line display some info
- print 'IPA is in compliance: %d of %d entitlements used.' % (hostcount, available)
-
-def main():
- installutils.check_server_configuration()
-
- if not os.path.exists('/etc/ipa/default.conf'):
- return 0
-
- options, args = parse_options()
-
- try:
- tmpdir = tempfile.mkdtemp(prefix = "tmp-")
- try:
- check_compliance(tmpdir, options.debug)
- finally:
- shutil.rmtree(tmpdir)
- except KeyboardInterrupt:
- return 1
- except (StandardError, errors.PublicError), e:
- syslog.syslog(syslog.LOG_ERR, 'IPA compliance checking failed: %s' % str(e))
- if sys.stdin.isatty():
- print 'IPA compliance checking failed: %s' % str(e)
- return 1
-
- return 0
-
-try:
- if not os.geteuid()==0:
- sys.exit("\nMust be root to check compliance\n")
-
- main()
-except SystemExit, e:
- sys.exit(e)
-except RuntimeError, e:
- sys.exit(e)