Set explicit confdir option for global contexts

Some API contexts are used to modify global state (e.g. files in /etc
and /var). These contexts do not support confdir overrides. Initialize
the API with an explicit confdir argument to paths.ETC_IPA.

The special contexts are:

* backup
* cli_installer
* installer
* ipctl
* renew
* restore
* server
* updates

The patch also corrects the context of the ipa-httpd-kdcproxy script to
'server'.

https://fedorahosted.org/freeipa/ticket/6389

Signed-off-by: Christian Heimes <cheimes@redhat.com>
Reviewed-By: Jan Cholasta <jcholast@redhat.com>
This commit is contained in:
Christian Heimes 2016-11-28 16:24:33 +01:00 committed by Jan Cholasta
parent 98f0077360
commit 1e6a204b43
32 changed files with 86 additions and 42 deletions

View File

@ -384,6 +384,7 @@ def main():
cfg = dict( cfg = dict(
context='cli_installer', context='cli_installer',
confdir=paths.ETC_IPA,
in_server=False, in_server=False,
debug=options.debug, debug=options.debug,
verbose=0, verbose=0,

View File

@ -122,7 +122,10 @@ def ldap2replica_zone_keys_sync(log, ldapkeydb, localhsm):
# IPA framework initialization # IPA framework initialization
ipalib.api.bootstrap(in_server=True, log=None) # no logging to file ipalib.api.bootstrap(
context='dns', confdir=paths.ETC_IPA,
in_server=True, log=None, # no logging to file
)
ipalib.api.finalize() ipalib.api.finalize()
standard_logging_setup(verbose=True, debug = True) # debug=ipalib.api.env.debug) standard_logging_setup(verbose=True, debug = True) # debug=ipalib.api.env.debug)
log = root_logger log = root_logger

View File

@ -19,7 +19,10 @@ from ipaplatform.paths import paths
from ipaserver.dnssec.keysyncer import KeySyncer from ipaserver.dnssec.keysyncer import KeySyncer
# IPA framework initialization # IPA framework initialization
api.bootstrap(in_server=True, log=None) # no logging to file api.bootstrap(
context='dns', confdir=paths.ETC_IPA,
in_server=True, log=None, # no logging to file
)
api.finalize() api.finalize()
standard_logging_setup(verbose=True, debug=api.env.debug) standard_logging_setup(verbose=True, debug=api.env.debug)
log = root_logger log = root_logger

View File

@ -614,7 +614,10 @@ elif len(sys.argv) == 2:
log.addHandler(console) log.addHandler(console)
# IPA framework initialization # IPA framework initialization
ipalib.api.bootstrap(in_server=True, log=None) # no logging to file ipalib.api.bootstrap(
context='dns', confdir=paths.ETC_IPA,
in_server=True, log=None, # no logging to file
)
ipalib.api.finalize() ipalib.api.finalize()
# Kerberos initialization # Kerberos initialization

View File

@ -494,7 +494,7 @@ def main():
'ipaCACertRenewal': renew_ca_cert, 'ipaCACertRenewal': renew_ca_cert,
} }
api.bootstrap(in_server=True, context='renew') api.bootstrap(in_server=True, context='renew', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
api.Backend.ldap2.connect() api.Backend.ldap2.connect()

View File

@ -24,6 +24,7 @@ import cgi
import errno import errno
from wsgiref.util import request_uri from wsgiref.util import request_uri
from ipaplatform.paths import paths
from ipapython.ipa_log_manager import root_logger from ipapython.ipa_log_manager import root_logger
from ipapython.dn import DN from ipapython.dn import DN
from ipapython import ipaldap from ipapython import ipaldap
@ -72,7 +73,7 @@ def application(environ, start_response):
# API object only for configuration, finalize() not needed # API object only for configuration, finalize() not needed
api = create_api(mode=None) api = create_api(mode=None)
api.bootstrap(context='server', in_server=True) api.bootstrap(context='server', confdir=paths.ETC_IPA, in_server=True)
try: try:
bind(api.env.ldap_uri, api.env.basedn, bind(api.env.ldap_uri, api.env.basedn,
form_data['username'].value, form_data['password'].value) form_data['username'].value, form_data['password'].value)

View File

@ -8,6 +8,7 @@ from ipapython.dn import DN
from ipalib.config import Env from ipalib.config import Env
from ipalib.constants import DEFAULT_CONFIG from ipalib.constants import DEFAULT_CONFIG
from ipaplatform.constants import constants from ipaplatform.constants import constants
from ipaplatform.paths import paths
import sys import sys
import os import os
import pwd import pwd
@ -95,7 +96,8 @@ env._bootstrap(debug=options.debug, log=None)
env._finalize_core(**dict(DEFAULT_CONFIG)) env._finalize_core(**dict(DEFAULT_CONFIG))
# Initialize the API with the proper debug level # Initialize the API with the proper debug level
api.bootstrap(in_server=True, debug=env.debug, log=None, context='server') api.bootstrap(in_server=True, debug=env.debug, log=None,
context='server', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
# Only import trust plugin after api is initialized or internal imports # Only import trust plugin after api is initialized or internal imports

View File

@ -40,7 +40,7 @@ from ipaplatform.paths import paths
def _main(): def _main():
nickname = sys.argv[1] nickname = sys.argv[1]
api.bootstrap(in_server=True, context='restart') api.bootstrap(in_server=True, context='restart', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
api.Backend.ldap2.connect() api.Backend.ldap2.connect()

View File

@ -36,7 +36,7 @@ from ipaplatform.paths import paths
def _main(): def _main():
nickname = 'ipaCert' nickname = 'ipaCert'
api.bootstrap(in_server=True, context='restart') api.bootstrap(in_server=True, context='restart', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
api.Backend.ldap2.connect() api.Backend.ldap2.connect()

View File

@ -24,6 +24,7 @@ import syslog
import traceback import traceback
from ipalib import api from ipalib import api
from ipaplatform import services from ipaplatform import services
from ipaplatform.paths import paths
from ipaserver.install import certs from ipaserver.install import certs
@ -33,7 +34,7 @@ def _main():
except IndexError: except IndexError:
instance = "" instance = ""
api.bootstrap(in_server=True, context='restart') api.bootstrap(in_server=True, context='restart', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
syslog.syslog(syslog.LOG_NOTICE, "certmonger restarted dirsrv instance '%s'" % instance) syslog.syslog(syslog.LOG_NOTICE, "certmonger restarted dirsrv instance '%s'" % instance)

View File

@ -23,11 +23,12 @@ import syslog
import traceback import traceback
from ipalib import api from ipalib import api
from ipaplatform import services from ipaplatform import services
from ipaplatform.paths import paths
from ipaserver.install import certs from ipaserver.install import certs
def main(): def main():
api.bootstrap(in_server=True, context='restart') api.bootstrap(in_server=True, context='restart', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
dogtag_service = services.knownservices['pki_tomcatd'] dogtag_service = services.knownservices['pki_tomcatd']

View File

@ -114,7 +114,7 @@ def main():
standard_logging_setup(verbose=True) standard_logging_setup(verbose=True)
# In 3.0, restarting needs access to api.env # In 3.0, restarting needs access to api.env
api.bootstrap_with_global_options(context='server') api.bootstrap_with_global_options(context='server', confdir=paths.ETC_IPA)
add_ca_schema() add_ca_schema()
restart_pki_ds() restart_pki_ds()

View File

@ -23,6 +23,7 @@
""" """
WSGI appliction for IPA server. WSGI appliction for IPA server.
""" """
from ipaplatform.paths import paths
from ipalib import api from ipalib import api
from ipalib.config import Env from ipalib.config import Env
from ipalib.constants import DEFAULT_CONFIG from ipalib.constants import DEFAULT_CONFIG
@ -31,11 +32,12 @@ from ipalib.constants import DEFAULT_CONFIG
# by reading in the configuration file(s). The server always reads # by reading in the configuration file(s). The server always reads
# default.conf and will also read in `context'.conf. # default.conf and will also read in `context'.conf.
env = Env() env = Env()
env._bootstrap(context='server', log=None) env._bootstrap(context='server', log=None, confdir=paths.ETC_IPA)
env._finalize_core(**dict(DEFAULT_CONFIG)) env._finalize_core(**dict(DEFAULT_CONFIG))
# Initialize the API with the proper debug level # Initialize the API with the proper debug level
api.bootstrap(context='server', debug=env.debug, log=None) api.bootstrap(context='server', confdir=paths.ETC_IPA,
debug=env.debug, log=None)
try: try:
api.finalize() api.finalize()
except Exception as e: except Exception as e:

View File

@ -263,11 +263,12 @@ def main():
sys.exit("Aborting installation.") sys.exit("Aborting installation.")
# Initialize the ipalib api # Initialize the ipalib api
cfg = dict( api.bootstrap(
in_server=True, in_server=True,
debug=options.debug, debug=options.debug,
context='install',
confdir=paths.ETC_IPA
) )
api.bootstrap(**cfg)
api.finalize() api.finalize()
# If domain name and realm does not match, IPA server will not be able # If domain name and realm does not match, IPA server will not be able

View File

@ -261,7 +261,10 @@ def main():
# override ra_plugin setting read from default.conf so that we have # override ra_plugin setting read from default.conf so that we have
# functional dogtag backend plugins during CA install # functional dogtag backend plugins during CA install
api.bootstrap(in_server=True, ra_plugin='dogtag') api.bootstrap(
context='install', confdir=paths.ETC_IPA,
in_server=True, ra_plugin='dogtag'
)
api.finalize() api.finalize()
api.Backend.ldap2.connect() api.Backend.ldap2.connect()

View File

@ -408,14 +408,13 @@ def main():
# Just initialize the environment. This is so the installer can have # Just initialize the environment. This is so the installer can have
# access to the plugin environment # access to the plugin environment
api_env = {'in_server' : True, api_env = {}
'verbose' : options.verbose,
}
if os.getegid() != 0: if os.getegid() != 0:
api_env['log'] = None # turn off logging for non-root api_env['log'] = None # turn off logging for non-root
api.bootstrap(**api_env) api.bootstrap(
context='cli', in_server=True, verbose=options.verbose, **api_env
)
api.finalize() api.finalize()
dirman_passwd = None dirman_passwd = None

View File

@ -132,11 +132,10 @@ def main():
installutils.check_server_configuration() installutils.check_server_configuration()
# Initialize the ipalib api # Initialize the ipalib api
cfg = dict( api.bootstrap(
in_server=True, context='install', confdir=paths.ETC_IPA,
debug=options.debug, in_server=True, debug=options.debug,
) )
api.bootstrap(**cfg)
api.finalize() api.finalize()
api.Backend.ldap2.connect() api.Backend.ldap2.connect()

View File

@ -184,7 +184,8 @@ class KDCProxyConfig(object):
def main(debug=DEBUG, time_limit=TIME_LIMIT): def main(debug=DEBUG, time_limit=TIME_LIMIT):
# initialize API without file logging # initialize API without file logging
if not api.isdone('bootstrap'): if not api.isdone('bootstrap'):
api.bootstrap(context='ipa-httpd-kdcproxy', log=None, debug=debug) api.bootstrap(context='server', confdir=paths.ETC_IPA,
log=None, debug=debug)
standard_logging_setup(verbose=True, debug=debug) standard_logging_setup(verbose=True, debug=debug)
try: try:

View File

@ -113,7 +113,9 @@ def main():
if not dirman_password: if not dirman_password:
sys.exit("No password supplied") sys.exit("No password supplied")
api.bootstrap(context='cli', debug=options.debug, in_server=True) api.bootstrap(
context='cli', confdir=paths.ETC_IPA,
debug=options.debug, in_server=True)
api.finalize() api.finalize()
api.Backend.ldap2.connect(bind_pw=dirman_password) api.Backend.ldap2.connect(bind_pw=dirman_password)

View File

@ -554,7 +554,9 @@ def main():
else: else:
nss_dir = None nss_dir = None
api.bootstrap(context='client', xmlrpc_uri=xmlrpc_uri, api.bootstrap(context='client',
confdir=paths.ETC_IPA,
xmlrpc_uri=xmlrpc_uri,
nss_dir=nss_db.secdir) nss_dir=nss_db.secdir)
api.finalize() api.finalize()
try: try:

View File

@ -1508,7 +1508,10 @@ def main(options, args):
if os.getegid() != 0: if os.getegid() != 0:
api_env['log'] = None # turn off logging for non-root api_env['log'] = None # turn off logging for non-root
api.bootstrap(**api_env) api.bootstrap(
context='cli', confdir=paths.ETC_IPA,
in_server=True, verbose=options.verbose
)
api.finalize() api.finalize()
dirman_passwd = None dirman_passwd = None

View File

@ -560,7 +560,10 @@ def main():
else: else:
raise e raise e
api.bootstrap(in_server=True, context='ipactl', debug=options.debug) api.bootstrap(in_server=True,
context='ipactl',
confdir=paths.ETC_IPA,
debug=options.debug)
api.finalize() api.finalize()
if '.' not in api.env.host: if '.' not in api.env.host:

View File

@ -2620,6 +2620,7 @@ def _install(options):
with certdb.NSSDatabase() as tmp_db: with certdb.NSSDatabase() as tmp_db:
api.bootstrap(context='cli_installer', api.bootstrap(context='cli_installer',
confdir=paths.ETC_IPA,
debug=options.debug, debug=options.debug,
delegate=False, delegate=False,
nss_dir=tmp_db.secdir) nss_dir=tmp_db.secdir)

View File

@ -53,7 +53,7 @@ class CertUpdate(admintool.AdminTool):
raise admintool.ScriptError( raise admintool.ScriptError(
"IPA client is not configured on this system.") "IPA client is not configured on this system.")
api.bootstrap(context='cli_installer') api.bootstrap(context='cli_installer', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
server = urlsplit(api.env.jsonrpc_uri).hostname server = urlsplit(api.env.jsonrpc_uri).hostname

View File

@ -256,7 +256,7 @@ class Backup(admintool.AdminTool):
options = self.options options = self.options
super(Backup, self).run() super(Backup, self).run()
api.bootstrap(in_server=True, context='backup') api.bootstrap(in_server=True, context='backup', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
self.log.info("Preparing backup on %s", api.env.host) self.log.info("Preparing backup on %s", api.env.host)

View File

@ -89,7 +89,7 @@ class LDAPUpdater(admintool.AdminTool):
def run(self): def run(self):
super(LDAPUpdater, self).run() super(LDAPUpdater, self).run()
api.bootstrap(in_server=True, context='updates') api.bootstrap(in_server=True, context='updates', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
def handle_error(self, exception): def handle_error(self, exception):

View File

@ -841,6 +841,7 @@ class Restore(admintool.AdminTool):
services.knownservices.certmonger.restart() services.knownservices.certmonger.restart()
def init_api(self, **overrides): def init_api(self, **overrides):
overrides.setdefault('confdir', paths.ETC_IPA)
api.bootstrap(in_server=True, context='restore', **overrides) api.bootstrap(in_server=True, context='restore', **overrides)
api.finalize() api.finalize()

View File

@ -38,7 +38,7 @@ class ServerUpgrade(admintool.AdminTool):
def run(self): def run(self):
super(ServerUpgrade, self).run() super(ServerUpgrade, self).run()
api.bootstrap(in_server=True, context='updates') api.bootstrap(in_server=True, context='updates', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
try: try:

View File

@ -24,6 +24,7 @@ import six
from ipalib import api from ipalib import api
from ipalib import errors from ipalib import errors
from ipaplatform.paths import paths
from ipapython import admintool from ipapython import admintool
from ipapython.dn import DN from ipapython.dn import DN
from ipapython.ipautil import realm_to_suffix, posixify from ipapython.ipautil import realm_to_suffix, posixify
@ -346,7 +347,7 @@ class WinsyncMigrate(admintool.AdminTool):
sys.exit(e) sys.exit(e)
# Finalize API # Finalize API
api.bootstrap(in_server=True, context='server') api.bootstrap(in_server=True, context='server', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
# Setup LDAP connection # Setup LDAP connection

View File

@ -308,7 +308,9 @@ class LDAPUpdate(object):
self.sub_dict["TOTAL_EXCLUDES"] = "(objectclass=*) $ EXCLUDE " + \ self.sub_dict["TOTAL_EXCLUDES"] = "(objectclass=*) $ EXCLUDE " + \
" ".join(constants.REPL_AGMT_TOTAL_EXCLUDES) " ".join(constants.REPL_AGMT_TOTAL_EXCLUDES)
self.api = create_api(mode=None) self.api = create_api(mode=None)
self.api.bootstrap(in_server=True, context='updates', self.api.bootstrap(in_server=True,
context='updates',
confdir=paths.ETC_IPA,
ldap_uri=self.ldapuri) ldap_uri=self.ldapuri)
self.api.finalize() self.api.finalize()
if online: if online:

View File

@ -566,6 +566,7 @@ def install_check(installer):
# we are sure we have the configuration file ready. # we are sure we have the configuration file ready.
cfg = dict( cfg = dict(
context='installer', context='installer',
confdir=paths.ETC_IPA,
in_server=True, in_server=True,
# make sure host name specified by user is used instead of default # make sure host name specified by user is used instead of default
host=host_name, host=host_name,
@ -962,6 +963,7 @@ def uninstall_check(installer):
# we are sure we have the configuration file ready. # we are sure we have the configuration file ready.
cfg = dict( cfg = dict(
context='installer', context='installer',
confdir=paths.ETC_IPA,
in_server=True, in_server=True,
) )

View File

@ -692,7 +692,7 @@ def install_check(installer):
# Note: We must do this before bootstraping and finalizing ipalib.api # Note: We must do this before bootstraping and finalizing ipalib.api
create_ipa_conf(fstore, config, ca_enabled) create_ipa_conf(fstore, config, ca_enabled)
api.bootstrap(in_server=True, context='installer') api.bootstrap(in_server=True, context='installer', confdir=paths.ETC_IPA)
api.finalize() api.finalize()
installutils.verify_fqdn(config.master_host_name, options.no_host_dns) installutils.verify_fqdn(config.master_host_name, options.no_host_dns)
@ -731,7 +731,9 @@ def install_check(installer):
ldapuri = 'ldaps://%s' % ipautil.format_netloc(config.master_host_name) ldapuri = 'ldaps://%s' % ipautil.format_netloc(config.master_host_name)
remote_api = create_api(mode=None) remote_api = create_api(mode=None)
remote_api.bootstrap(in_server=True, context='installer', remote_api.bootstrap(in_server=True,
context='installer',
confdir=paths.ETC_IPA,
ldap_uri=ldapuri) ldap_uri=ldapuri)
remote_api.finalize() remote_api.finalize()
conn = remote_api.Backend.ldap2 conn = remote_api.Backend.ldap2
@ -954,12 +956,14 @@ def promote_check(installer):
fstore = sysrestore.FileStore(paths.SYSRESTORE) fstore = sysrestore.FileStore(paths.SYSRESTORE)
env = Env() env = Env()
env._bootstrap(context='installer', log=None) env._bootstrap(context='installer', confdir=paths.ETC_IPA, log=None)
env._finalize_core(**dict(constants.DEFAULT_CONFIG)) env._finalize_core(**dict(constants.DEFAULT_CONFIG))
# pylint: disable=no-member # pylint: disable=no-member
xmlrpc_uri = 'https://{}/ipa/xml'.format(ipautil.format_netloc(env.host)) xmlrpc_uri = 'https://{}/ipa/xml'.format(ipautil.format_netloc(env.host))
api.bootstrap(in_server=True, context='installer', api.bootstrap(in_server=True,
context='installer',
confdir=paths.ETC_IPA,
ldap_uri=installutils.realm_to_ldapi_uri(env.realm), ldap_uri=installutils.realm_to_ldapi_uri(env.realm),
xmlrpc_uri=xmlrpc_uri) xmlrpc_uri=xmlrpc_uri)
# pylint: enable=no-member # pylint: enable=no-member
@ -1056,8 +1060,11 @@ def promote_check(installer):
xmlrpc_uri = 'https://{}/ipa/xml'.format( xmlrpc_uri = 'https://{}/ipa/xml'.format(
ipautil.format_netloc(config.master_host_name)) ipautil.format_netloc(config.master_host_name))
remote_api = create_api(mode=None) remote_api = create_api(mode=None)
remote_api.bootstrap(in_server=True, context='installer', remote_api.bootstrap(in_server=True,
ldap_uri=ldapuri, xmlrpc_uri=xmlrpc_uri) context='installer',
confdir=paths.ETC_IPA,
ldap_uri=ldapuri,
xmlrpc_uri=xmlrpc_uri)
remote_api.finalize() remote_api.finalize()
check_remote_version(remote_api) check_remote_version(remote_api)