2016-11-09 05:44:22 -06:00
|
|
|
#
|
|
|
|
# Copyright (C) 2016 FreeIPA Contributors see COPYING for license
|
|
|
|
#
|
|
|
|
|
|
|
|
"""
|
|
|
|
Base service installer module
|
|
|
|
"""
|
|
|
|
|
|
|
|
from ipalib.util import validate_domain_name
|
|
|
|
from ipapython.install import common, core, typing
|
|
|
|
from ipapython.install.core import knob
|
|
|
|
|
|
|
|
|
|
|
|
def prepare_only(obj):
|
|
|
|
"""
|
|
|
|
Decorator which makes an installer attribute appear only in the prepare
|
|
|
|
phase of the install
|
|
|
|
"""
|
|
|
|
obj.__exclude__ = getattr(obj, '__exclude__', set()) | {'enroll'}
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
def enroll_only(obj):
|
|
|
|
"""
|
|
|
|
Decorator which makes an installer attribute appear only in the enroll
|
|
|
|
phase of the install
|
|
|
|
"""
|
|
|
|
obj.__exclude__ = getattr(obj, '__exclude__', set()) | {'prepare'}
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
def master_install_only(obj):
|
|
|
|
"""
|
|
|
|
Decorator which makes an installer attribute appear only in master install
|
|
|
|
"""
|
|
|
|
obj.__exclude__ = getattr(obj, '__exclude__', set()) | {'replica_install'}
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
def replica_install_only(obj):
|
|
|
|
"""
|
|
|
|
Decorator which makes an installer attribute appear only in replica install
|
|
|
|
"""
|
|
|
|
obj.__exclude__ = getattr(obj, '__exclude__', set()) | {'master_install'}
|
|
|
|
return obj
|
|
|
|
|
|
|
|
|
|
|
|
def _does(cls, arg):
|
|
|
|
def remove(name):
|
|
|
|
def removed(self):
|
|
|
|
raise AttributeError(name)
|
|
|
|
|
|
|
|
return property(removed)
|
|
|
|
|
|
|
|
return type(
|
|
|
|
cls.__name__,
|
|
|
|
(cls,),
|
|
|
|
{
|
|
|
|
n: remove(n) for n in dir(cls)
|
|
|
|
if arg in getattr(getattr(cls, n), '__exclude__', set())
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def prepares(cls):
|
|
|
|
"""
|
|
|
|
Returns installer class stripped of attributes not related to the prepare
|
|
|
|
phase of the install
|
|
|
|
"""
|
|
|
|
return _does(cls, 'prepare')
|
|
|
|
|
|
|
|
|
|
|
|
def enrolls(cls):
|
|
|
|
"""
|
|
|
|
Returns installer class stripped of attributes not related to the enroll
|
|
|
|
phase of the install
|
|
|
|
"""
|
|
|
|
return _does(cls, 'enroll')
|
|
|
|
|
|
|
|
|
|
|
|
def installs_master(cls):
|
|
|
|
"""
|
|
|
|
Returns installer class stripped of attributes not related to master
|
|
|
|
install
|
|
|
|
"""
|
|
|
|
return _does(cls, 'master_install')
|
|
|
|
|
|
|
|
|
|
|
|
def installs_replica(cls):
|
|
|
|
"""
|
|
|
|
Returns installer class stripped of attributes not related to replica
|
|
|
|
install
|
|
|
|
"""
|
|
|
|
return _does(cls, 'replica_install')
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceInstallInterface(common.Installable,
|
|
|
|
common.Interactive,
|
|
|
|
core.Composite):
|
|
|
|
"""
|
|
|
|
Interface common to all service installers
|
|
|
|
"""
|
|
|
|
|
|
|
|
domain_name = knob(
|
|
|
|
str, None,
|
2017-01-02 06:22:07 -06:00
|
|
|
description="primary DNS domain of the IPA deployment "
|
|
|
|
"(not necessarily related to the current hostname)",
|
2016-11-09 05:44:22 -06:00
|
|
|
cli_names='--domain',
|
|
|
|
)
|
|
|
|
|
|
|
|
@domain_name.validator
|
|
|
|
def domain_name(self, value):
|
|
|
|
validate_domain_name(value)
|
|
|
|
|
|
|
|
servers = knob(
|
|
|
|
# pylint: disable=invalid-sequence-index
|
|
|
|
typing.List[str], None,
|
|
|
|
description="FQDN of IPA server",
|
|
|
|
cli_names='--server',
|
|
|
|
cli_metavar='SERVER',
|
|
|
|
)
|
|
|
|
|
|
|
|
realm_name = knob(
|
|
|
|
str, None,
|
2017-03-07 07:20:38 -06:00
|
|
|
description="Kerberos realm name of the IPA deployment (typically "
|
2017-01-02 06:22:07 -06:00
|
|
|
"an upper-cased name of the primary DNS domain)",
|
2016-11-09 05:44:22 -06:00
|
|
|
cli_names='--realm',
|
|
|
|
)
|
|
|
|
|
|
|
|
host_name = knob(
|
|
|
|
str, None,
|
|
|
|
description="The hostname of this machine (FQDN). If specified, the "
|
|
|
|
"hostname will be set and the system configuration will "
|
|
|
|
"be updated to persist over reboot. By default the result "
|
|
|
|
"of getfqdn() call from Python's socket module is used.",
|
|
|
|
cli_names='--hostname',
|
|
|
|
)
|
|
|
|
|
|
|
|
ca_cert_files = knob(
|
|
|
|
# pylint: disable=invalid-sequence-index
|
|
|
|
typing.List[str], None,
|
|
|
|
description="load the CA certificate from this file",
|
|
|
|
cli_names='--ca-cert-file',
|
|
|
|
cli_metavar='FILE',
|
|
|
|
)
|
|
|
|
|
|
|
|
replica_file = knob(
|
|
|
|
str, None,
|
|
|
|
description="a file generated by ipa-replica-prepare",
|
|
|
|
)
|
|
|
|
replica_file = replica_install_only(replica_file)
|
|
|
|
|
|
|
|
dm_password = knob(
|
|
|
|
str, None,
|
|
|
|
sensitive=True,
|
|
|
|
description="Directory Manager password (for the existing master)",
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceAdminInstallInterface(ServiceInstallInterface):
|
|
|
|
"""
|
|
|
|
Interface common to all service installers which require admin user
|
|
|
|
authentication
|
|
|
|
"""
|
|
|
|
|
|
|
|
principal = knob(
|
|
|
|
str, None,
|
|
|
|
)
|
|
|
|
principal = enroll_only(principal)
|
|
|
|
principal = replica_install_only(principal)
|
|
|
|
|
|
|
|
admin_password = knob(
|
|
|
|
str, None,
|
|
|
|
sensitive=True,
|
|
|
|
)
|
|
|
|
admin_password = enroll_only(admin_password)
|