2013-11-27 14:53:57 +01:00
#! /usr/bin/python2 -E
# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com>
2010-12-06 16:16:49 -05:00
# Simo Sorce <ssorce@redhat.com>
# Rob Crittenden <rcritten@redhat.com>
#
2014-03-18 11:23:30 -04:00
# Copyright (C) 2007-2014 Red Hat
# see file 'COPYING' for use and warranty information
#
2010-12-09 13:59:11 +01:00
# 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
2010-12-09 13:59:11 +01:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# requires the following packages:
# fedora-ds-base
# openldap-clients
# nss-tools
import sys
2007-10-02 16:56:51 -04:00
import os
2011-01-28 15:45:19 -05:00
import grp
2007-10-02 16:56:51 -04:00
import signal
import shutil
2011-11-03 11:08:26 +01:00
import pickle
2009-08-27 14:12:55 -04:00
import random
2011-01-26 10:53:02 -05:00
import tempfile
2011-08-17 10:19:37 +02:00
import nss.error
2013-03-14 13:58:27 +01:00
import base64
2013-08-29 17:44:02 +02:00
import pwd
import textwrap
2014-09-24 16:31:39 +02:00
from optparse import OptionGroup , OptionValueError , SUPPRESS_HELP
2013-11-04 17:15:23 +02:00
try :
from ipaserver.install import adtrustinstance
_server_trust_ad_installed = True
except ImportError :
_server_trust_ad_installed = False
2009-02-02 13:50:53 -05:00
from ipaserver.install import dsinstance
from ipaserver.install import krbinstance
from ipaserver.install import bindinstance
from ipaserver.install import httpinstance
from ipaserver.install import ntpinstance
2009-04-13 13:39:15 -04:00
from ipaserver.install import certs
2010-02-24 11:38:09 -05:00
from ipaserver.install import cainstance
2014-03-18 11:23:30 -04:00
from ipaserver.install import krainstance
2012-02-06 13:15:06 -05:00
from ipaserver.install import memcacheinstance
2013-06-05 15:48:35 +02:00
from ipaserver.install import otpdinstance
2012-06-08 08:31:37 +02:00
from ipaserver.install import sysupgrade
2013-08-29 17:44:02 +02:00
from ipaserver.install import replication
2012-05-31 14:34:09 +02:00
from ipaserver.install import service , installutils
2009-02-05 15:03:08 -05:00
from ipapython import version
2012-10-23 16:31:37 -04:00
from ipapython import certmonger
2013-08-29 17:44:02 +02:00
from ipapython import ipaldap
2009-02-02 13:50:53 -05:00
from ipaserver.install.installutils import *
2010-03-24 15:51:31 +01:00
from ipaserver.plugins.ldap2 import ldap2
2009-02-05 15:03:08 -05:00
from ipapython import sysrestore
from ipapython.ipautil import *
2012-04-18 11:22:35 -04:00
from ipapython import ipautil
2012-08-23 12:38:45 -04:00
from ipapython import dogtag
2014-08-05 09:06:39 +02:00
from ipalib import api , errors , util , x509
2010-10-29 20:24:31 +02:00
from ipapython.config import IPAOptionParser
2012-05-11 15:56:43 -04:00
from ipalib.util import validate_domain_name
2013-09-11 08:27:34 +00:00
from ipalib.constants import CACERT
2011-11-15 14:39:31 -05:00
from ipapython.ipa_log_manager import *
2012-05-13 07:36:35 -04:00
from ipapython.dn import DN
2012-12-07 16:44:32 +01:00
import ipaclient.ntpconf
2014-05-29 10:51:08 +02:00
from ipaplatform.tasks import tasks
2014-05-29 10:37:18 +02:00
from ipaplatform import services
2014-06-17 11:45:43 +02:00
from ipaplatform.paths import paths
2012-12-07 16:44:32 +01:00
2010-04-27 17:51:13 -04:00
uninstalling = False
2011-11-29 09:10:31 +01:00
installation_cleanup = True
2008-07-11 11:34:29 -04:00
2012-08-15 21:33:15 -04:00
VALID_SUBJECT_ATTRS = [ 'st' , 'o' , 'ou' , 'dnqualifier' , 'c' ,
2011-07-07 11:55:20 -04:00
'serialnumber' , 'l' , 'title' , 'sn' , 'givenname' ,
'initials' , 'generationqualifier' , 'dc' , 'mail' ,
'uid' , 'postaladdress' , 'postalcode' , 'postofficebox' ,
'houseidentifier' , 'e' , 'street' , 'pseudonym' ,
'incorporationlocality' , 'incorporationstate' ,
'incorporationcountry' , 'businesscategory' ]
2014-06-17 11:45:43 +02:00
SYSRESTORE_DIR_PATH = paths . SYSRESTORE
2013-12-12 15:01:14 +01:00
2011-07-07 11:55:20 -04:00
def subject_callback ( option , opt_str , value , parser ):
"""
Make sure the certificate subject base is a valid DN
"""
v = unicode ( value , 'utf-8' )
2011-09-26 08:27:01 +02:00
if any ( ord ( c ) < 0x20 for c in v ):
raise OptionValueError ( "Subject base must not contain control characters" )
if '&' in v :
raise OptionValueError ( "Subject base must not contain an ampersand ( \" & \" )" )
2011-07-07 11:55:20 -04:00
try :
dn = DN ( v )
2011-07-28 14:32:26 -04:00
for rdn in dn :
if rdn . attr . lower () not in VALID_SUBJECT_ATTRS :
2012-08-15 21:33:15 -04:00
raise OptionValueError ( ' %s = %s has invalid attribute: " %s "' % ( opt_str , value , rdn . attr ))
2011-07-07 11:55:20 -04:00
except ValueError , e :
2012-08-15 21:33:15 -04:00
raise OptionValueError ( ' %s = %s has invalid subject base format: %s ' % ( opt_str , value , e ))
parser . values . subject = dn
2011-07-07 11:55:20 -04:00
2011-09-26 08:27:01 +02:00
def validate_dm_password ( password ):
if len ( password ) < 8 :
raise ValueError ( "Password must be at least 8 characters long" )
if any ( ord ( c ) < 0x20 for c in password ):
raise ValueError ( "Password must not contain control characters" )
2012-05-11 09:08:59 -04:00
if any ( ord ( c ) >= 0x7F for c in password ):
raise ValueError ( "Password must only contain ASCII characters" )
# Disallow characters that pkisilent doesn't process properly:
2014-07-24 13:32:37 +02:00
bad_characters = ' \\ '
if any ( c in bad_characters for c in password ):
raise ValueError ( 'Password must not contain these characters: %s ' %
', ' . join ( '" %s "' % c for c in bad_characters ))
# TODO: Check https://fedorahosted.org/389/ticket/47849
# Actual behavior of setup-ds.pl is that it does not accept white
# space characters in password when called interactively but does when
# provided such password in INF file. But it ignores leading and trailing
# white spaces in INF file.
# Disallow leading/trailing whaitespaces
if password . strip () != password :
raise ValueError ( 'Password must not start or end with whitespace.' )
def validate_admin_password ( password ):
if len ( password ) < 8 :
raise ValueError ( "Password must be at least 8 characters long" )
if any ( ord ( c ) < 0x20 for c in password ):
raise ValueError ( "Password must not contain control characters" )
if any ( ord ( c ) >= 0x7F for c in password ):
raise ValueError ( "Password must only contain ASCII characters" )
# Disallow characters that pkisilent doesn't process properly:
bad_characters = ' \\ '
2012-05-11 09:08:59 -04:00
if any ( c in bad_characters for c in password ):
raise ValueError ( 'Password must not contain these characters: %s ' %
', ' . join ( '" %s "' % c for c in bad_characters ))
2011-09-26 08:27:01 +02:00
def parse_options ():
2010-12-06 16:16:49 -05:00
# Guaranteed to give a random 200k range below the 2G mark (uint32_t limit)
namespace = random . randint ( 1 , 10000 ) * 200000
2010-10-29 20:24:31 +02:00
parser = IPAOptionParser ( version = version . VERSION )
2011-09-05 11:04:17 +02:00
basic_group = OptionGroup ( parser , "basic options" )
basic_group . add_option ( "-r" , "--realm" , dest = "realm_name" ,
help = "realm name" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "-n" , "--domain" , dest = "domain_name" ,
2008-02-15 20:47:29 -05:00
help = "domain name" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "-p" , "--ds-password" , dest = "dm_password" ,
2010-10-29 20:24:31 +02:00
sensitive = True , help = "admin password" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "-P" , "--master-password" ,
2010-10-29 20:24:31 +02:00
dest = "master_password" , sensitive = True ,
2008-02-25 17:18:18 -05:00
help = "kerberos master password (normally autogenerated)" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "-a" , "--admin-password" ,
2010-10-29 20:24:31 +02:00
sensitive = True , dest = "admin_password" ,
2007-08-31 18:40:01 -04:00
help = "admin user kerberos password" )
2013-03-27 13:48:01 +01:00
basic_group . add_option ( "--mkhomedir" ,
dest = "mkhomedir" ,
action = "store_true" ,
default = False ,
help = "create home directories for users "
"on their first login" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "--hostname" , dest = "host_name" , help = "fully qualified name of server" )
2014-08-27 13:50:21 +02:00
basic_group . add_option ( "--ip-address" , dest = "ip_addresses" ,
type = "ip" , ip_local = True , action = "append" , default = [],
2011-09-05 11:04:17 +02:00
help = "Master Server IP Address" )
basic_group . add_option ( "-N" , "--no-ntp" , dest = "conf_ntp" , action = "store_false" ,
help = "do not configure ntp" , default = True )
basic_group . add_option ( "--idstart" , dest = "idstart" , default = namespace , type = int ,
help = "The starting value for the IDs range (default random)" )
basic_group . add_option ( "--idmax" , dest = "idmax" , default = 0 , type = int ,
help = "The max value value for the IDs range (default: idstart+199999)" )
basic_group . add_option ( "--no_hbac_allow" , dest = "hbac_allow" , default = False ,
action = "store_true" ,
help = "Don't install allow_all HBAC rule" )
basic_group . add_option ( "--no-ui-redirect" , dest = "ui_redirect" , action = "store_false" ,
default = True , help = "Do not automatically redirect to the Web UI" )
2011-12-07 03:49:09 -05:00
basic_group . add_option ( "--ssh-trust-dns" , dest = "trust_sshfp" , default = False , action = "store_true" ,
help = "configure OpenSSH client to trust DNS SSHFP records" )
2012-09-12 09:19:26 -04:00
basic_group . add_option ( "--no-ssh" , dest = "conf_ssh" , default = True , action = "store_false" ,
help = "do not configure OpenSSH client" )
2011-12-07 03:49:09 -05:00
basic_group . add_option ( "--no-sshd" , dest = "conf_sshd" , default = True , action = "store_false" ,
help = "do not configure OpenSSH server" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "-d" , "--debug" , dest = "debug" , action = "store_true" ,
2007-09-20 15:10:21 -04:00
default = False , help = "print debugging information" )
2011-09-05 11:04:17 +02:00
basic_group . add_option ( "-U" , "--unattended" , dest = "unattended" , action = "store_true" ,
default = False , help = "unattended (un)installation never prompts the user" )
parser . add_option_group ( basic_group )
cert_group = OptionGroup ( parser , "certificate system options" )
cert_group . add_option ( "" , "--external-ca" , dest = "external_ca" , action = "store_true" ,
2014-08-08 10:15:26 +02:00
default = False , help = "Generate a CSR for the IPA CA certificate to be signed by an external CA" )
2014-09-24 16:31:39 +02:00
cert_group . add_option ( "--external-cert-file" , dest = "external_cert_files" ,
action = "append" , metavar = "FILE" ,
help = "File containing the IPA CA certificate and the external CA certificate chain" )
cert_group . add_option ( "--external_cert_file" , dest = "external_cert_files" ,
action = "append" ,
help = SUPPRESS_HELP )
cert_group . add_option ( "--external_ca_file" , dest = "external_cert_files" ,
action = "append" ,
help = SUPPRESS_HELP )
2011-09-05 11:04:17 +02:00
cert_group . add_option ( "--no-pkinit" , dest = "setup_pkinit" , action = "store_false" ,
default = True , help = "disables pkinit setup steps" )
2014-09-24 16:41:47 +02:00
cert_group . add_option ( "--dirsrv-cert-file" , dest = "dirsrv_cert_files" ,
action = "append" , metavar = "FILE" ,
help = "File containing the Directory Server SSL certificate and private key" )
cert_group . add_option ( "--dirsrv_pkcs12" , dest = "dirsrv_cert_files" ,
action = "append" ,
help = SUPPRESS_HELP )
cert_group . add_option ( "--http-cert-file" , dest = "http_cert_files" ,
action = "append" , metavar = "FILE" ,
help = "File containing the Apache Server SSL certificate and private key" )
cert_group . add_option ( "--http_pkcs12" , dest = "http_cert_files" ,
action = "append" ,
help = SUPPRESS_HELP )
cert_group . add_option ( "--pkinit-cert-file" , dest = "pkinit_cert_files" ,
action = "append" , metavar = "FILE" ,
help = "File containing the Kerberos KDC SSL certificate and private key" )
cert_group . add_option ( "--pkinit_pkcs12" , dest = "pkinit_cert_files" ,
action = "append" ,
help = SUPPRESS_HELP )
cert_group . add_option ( "--dirsrv-pin" , dest = "dirsrv_pin" , sensitive = True ,
metavar = "PIN" ,
help = "The password to unlock the Directory Server private key" )
2011-09-05 11:04:17 +02:00
cert_group . add_option ( "--dirsrv_pin" , dest = "dirsrv_pin" , sensitive = True ,
2014-09-24 16:41:47 +02:00
help = SUPPRESS_HELP )
cert_group . add_option ( "--http-pin" , dest = "http_pin" , sensitive = True ,
metavar = "PIN" ,
help = "The password to unlock the Apache Server private key" )
2011-09-05 11:04:17 +02:00
cert_group . add_option ( "--http_pin" , dest = "http_pin" , sensitive = True ,
2014-09-24 16:41:47 +02:00
help = SUPPRESS_HELP )
cert_group . add_option ( "--pkinit-pin" , dest = "pkinit_pin" , sensitive = True ,
metavar = "PIN" ,
help = "The password to unlock the Kerberos KDC private key" )
cert_group . add_option ( "--pkinit_pin" , dest = "pkinit_pin" , sensitive = True ,
help = SUPPRESS_HELP )
2014-09-24 16:48:15 +02:00
cert_group . add_option ( "--dirsrv-cert-name" , dest = "dirsrv_cert_name" ,
metavar = "NAME" ,
help = "Name of the Directory Server SSL certificate to install" )
cert_group . add_option ( "--http-cert-name" , dest = "http_cert_name" ,
metavar = "NAME" ,
help = "Name of the Apache Server SSL certificate to install" )
cert_group . add_option ( "--pkinit-cert-name" , dest = "pkinit_cert_name" ,
metavar = "NAME" ,
help = "Name of the Kerberos KDC SSL certificate to install" )
2014-09-24 16:41:47 +02:00
cert_group . add_option ( "--ca-cert-file" , dest = "ca_cert_files" ,
action = "append" , metavar = "FILE" ,
help = "File containing CA certificates for the service certificate files" )
cert_group . add_option ( "--root-ca-file" , dest = "ca_cert_files" ,
action = "append" ,
help = SUPPRESS_HELP )
2011-09-05 11:04:17 +02:00
cert_group . add_option ( "--subject" , action = "callback" , callback = subject_callback ,
type = "string" ,
help = "The certificate subject base (default O=<realm-name>)" )
2014-08-06 09:43:19 +02:00
cert_group . add_option ( "--ca-signing-algorithm" , dest = "ca_signing_algorithm" ,
type = "choice" ,
choices = ( 'SHA1withRSA' , 'SHA256withRSA' , 'SHA512withRSA' ),
help = "Signing algorithm of the IPA CA certificate" )
2011-09-05 11:04:17 +02:00
parser . add_option_group ( cert_group )
dns_group = OptionGroup ( parser , "DNS options" )
dns_group . add_option ( "--setup-dns" , dest = "setup_dns" , action = "store_true" ,
2009-06-25 14:42:08 +02:00
default = False , help = "configure bind with our zone" )
2011-09-05 11:04:17 +02:00
dns_group . add_option ( "--forwarder" , dest = "forwarders" , action = "append" ,
2011-06-16 10:47:11 +02:00
type = "ip" , help = "Add a DNS forwarder" )
2011-09-05 11:04:17 +02:00
dns_group . add_option ( "--no-forwarders" , dest = "no_forwarders" , action = "store_true" ,
2009-09-01 23:28:52 +02:00
default = False , help = "Do not add any DNS forwarders, use root servers instead" )
2014-08-27 13:50:21 +02:00
dns_group . add_option ( "--reverse-zone" , dest = "reverse_zones" , help = "The reverse DNS zone to use" ,
action = "append" , default = [])
2011-09-05 11:04:17 +02:00
dns_group . add_option ( "--no-reverse" , dest = "no_reverse" , action = "store_true" ,
2011-01-04 08:55:47 -05:00
default = False , help = "Do not create reverse DNS zone" )
2011-10-24 18:35:48 +02:00
dns_group . add_option ( "--zonemgr" , action = "callback" , callback = bindinstance . zonemgr_callback ,
2011-04-22 17:18:57 -04:00
type = "string" ,
2012-02-20 13:40:13 +01:00
help = "DNS zone manager e-mail address. Defaults to hostmaster@DOMAIN" )
2011-09-05 11:04:17 +02:00
dns_group . add_option ( "--no-host-dns" , dest = "no_host_dns" , action = "store_true" ,
2008-09-16 20:18:11 -06:00
default = False ,
help = "Do not use DNS for hostname lookup during installation" )
2011-12-07 03:40:51 -05:00
dns_group . add_option ( "--no-dns-sshfp" , dest = "create_sshfp" , default = True , action = "store_false" ,
2012-06-28 16:46:48 +02:00
help = "Do not automatically create DNS SSHFP records" )
2011-09-05 11:04:17 +02:00
parser . add_option_group ( dns_group )
uninstall_group = OptionGroup ( parser , "uninstall options" )
uninstall_group . add_option ( "" , "--uninstall" , dest = "uninstall" , action = "store_true" ,
default = False , help = "uninstall an existing installation. The uninstall can " \
"be run with --unattended option" )
parser . add_option_group ( uninstall_group )
options , args = parser . parse_args ()
2010-10-29 20:24:31 +02:00
safe_options = parser . get_safe_opts ( options )
2011-09-26 08:27:01 +02:00
if options . dm_password is not None :
try :
validate_dm_password ( options . dm_password )
except ValueError , e :
parser . error ( "DS admin password: " + str ( e ))
2014-07-24 13:32:37 +02:00
if options . admin_password is not None :
try :
validate_admin_password ( options . admin_password )
except ValueError , e :
parser . error ( "Admin user password: " + str ( e ))
2011-08-15 09:02:39 +02:00
2012-05-11 15:56:43 -04:00
if options . domain_name is not None :
try :
validate_domain_name ( options . domain_name )
except ValueError , e :
parser . error ( "invalid domain: " + unicode ( e ))
2009-09-01 23:28:52 +02:00
if not options . setup_dns :
if options . forwarders :
parser . error ( "You cannot specify a --forwarder option without the --setup-dns option" )
if options . no_forwarders :
parser . error ( "You cannot specify a --no-forwarders option without the --setup-dns option" )
2014-08-27 13:50:21 +02:00
if options . reverse_zones :
2011-07-11 10:14:53 +02:00
parser . error ( "You cannot specify a --reverse-zone option without the --setup-dns option" )
2011-01-04 08:55:47 -05:00
if options . no_reverse :
parser . error ( "You cannot specify a --no-reverse option without the --setup-dns option" )
2009-09-01 23:28:52 +02:00
elif options . forwarders and options . no_forwarders :
parser . error ( "You cannot specify a --forwarder option together with --no-forwarders" )
2014-08-27 13:50:21 +02:00
elif options . reverse_zones and options . no_reverse :
2011-07-11 10:14:53 +02:00
parser . error ( "You cannot specify a --reverse-zone option together with --no-reverse" )
2009-09-01 23:28:52 +02:00
2008-01-11 11:57:36 +00:00
if options . uninstall :
2011-01-28 15:45:19 -05:00
if ( options . realm_name or
2010-04-15 11:08:48 +02:00
options . admin_password or options . master_password ):
2011-01-28 15:45:19 -05:00
parser . error ( "In uninstall mode, -a, -r and -P options are not allowed" )
2008-01-11 11:57:36 +00:00
elif options . unattended :
2011-01-24 14:58:11 -05:00
if ( not options . realm_name or
2008-02-25 17:18:18 -05:00
not options . dm_password or not options . admin_password ):
2011-01-24 14:58:11 -05:00
parser . error ( "In unattended mode you need to provide at least -r, -p and -a options" )
2009-09-01 23:28:52 +02:00
if options . setup_dns :
if not options . forwarders and not options . no_forwarders :
parser . error ( "You must specify at least one --forwarder option or --no-forwarders option" )
2014-09-24 16:41:47 +02:00
# If any of the key file options are selected, all are required.
cert_file_req = ( options . dirsrv_cert_files , options . http_cert_files )
cert_file_opt = ( options . pkinit_cert_files ,)
if any ( cert_file_req + cert_file_opt ) and not all ( cert_file_req ):
parser . error ( "--dirsrv-cert-file and --http-cert-file are required if "
"any key file options are used." )
2013-07-09 10:23:47 +00:00
if options . unattended :
2014-09-24 16:41:47 +02:00
if options . dirsrv_cert_files and options . dirsrv_pin is None :
parser . error (
"You must specify --dirsrv-pin with --dirsrv-cert-file" )
if options . http_cert_files and options . http_pin is None :
parser . error (
"You must specify --http-pin with --http-cert-file" )
if options . pkinit_cert_files and options . pkinit_pin is None :
parser . error (
"You must specify --pkinit-pin with --pkinit-cert-file" )
if options . external_cert_files and options . dirsrv_cert_files :
2014-09-24 16:31:39 +02:00
parser . error ( "Service certificate file options cannot be used with "
"the external CA options." )
2009-09-10 16:15:14 -04:00
2011-07-26 13:21:36 +02:00
if options . external_ca :
2014-09-24 16:31:39 +02:00
if options . external_cert_files :
parser . error ( "You cannot specify --external-cert-file "
"together with --external-ca" )
2014-09-24 16:41:47 +02:00
if options . dirsrv_cert_files :
parser . error ( "You cannot specify service certificate file options "
"together with --external-ca" )
2011-07-26 13:21:36 +02:00
2014-09-24 16:31:39 +02:00
if ( options . external_cert_files and
any ( not os . path . isabs ( path ) for path in options . external_cert_files )):
2010-04-01 17:20:38 -04:00
parser . error ( "--external-cert-file must use an absolute path" )
2010-11-11 18:15:28 -05:00
if options . idmax == 0 :
2010-12-06 16:16:49 -05:00
options . idmax = int ( options . idstart ) + 200000 - 1
2010-11-11 18:15:28 -05:00
if options . idmax < options . idstart :
2011-04-07 17:26:15 +02:00
parser . error ( "idmax ( %u ) cannot be smaller than idstart ( %u )" %
2010-11-11 18:15:28 -05:00
( options . idmax , options . idstart ))
2010-11-19 11:22:10 -05:00
#Automatically disable pkinit w/ dogtag until that is supported
2013-03-08 15:13:19 +01:00
options . setup_pkinit = False
2010-11-19 11:22:10 -05:00
2010-10-29 20:24:31 +02:00
return safe_options , options
2007-10-02 16:56:51 -04:00
def signal_handler ( signum , frame ):
global ds
print " \n Cleaning up..."
if ds :
print "Removing configuration for %s instance" % ds . serverid
ds . stop ()
if ds . serverid :
2009-02-02 13:50:53 -05:00
dsinstance . erase_ds_instance_data ( ds . serverid )
2007-10-02 16:56:51 -04:00
sys . exit ( 1 )
2014-06-17 11:45:43 +02:00
ANSWER_CACHE = paths . ROOT_IPA_CACHE
2009-11-18 14:28:33 -05:00
2011-01-26 10:53:02 -05:00
def read_cache ( dm_password ):
2009-11-18 14:28:33 -05:00
"""
2011-11-03 11:08:26 +01:00
Returns a dict of cached answers or empty dict if no cache file exists.
2009-11-18 14:28:33 -05:00
"""
if not ipautil . file_exists ( ANSWER_CACHE ):
return {}
2011-01-26 10:53:02 -05:00
top_dir = tempfile . mkdtemp ( "ipa" )
2011-11-03 11:08:26 +01:00
fname = " %s /cache" % top_dir
2011-01-26 10:53:02 -05:00
try :
2011-11-03 11:08:26 +01:00
decrypt_file ( ANSWER_CACHE , fname , dm_password , top_dir )
2011-01-26 10:53:02 -05:00
except Exception , e :
shutil . rmtree ( top_dir )
2011-11-03 11:08:26 +01:00
raise Exception ( "Decryption of answer cache in %s failed, please check your password." % ANSWER_CACHE )
2011-01-26 10:53:02 -05:00
2009-11-18 14:28:33 -05:00
try :
2011-11-03 11:08:26 +01:00
with open ( fname , 'rb' ) as f :
try :
optdict = pickle . load ( f )
except Exception , e :
raise Exception ( "Parse error in %s : %s " % ( ANSWER_CACHE , str ( e )))
2009-11-18 14:28:33 -05:00
except IOError , e :
2011-11-03 11:08:26 +01:00
raise Exception ( "Read error in %s : %s " % ( ANSWER_CACHE , str ( e )))
2011-01-26 10:53:02 -05:00
finally :
shutil . rmtree ( top_dir )
2009-11-18 14:28:33 -05:00
# These are the only ones that may be overridden
2014-09-24 16:31:39 +02:00
try :
del optdict [ 'external_cert_files' ]
except KeyError :
pass
2009-11-18 14:28:33 -05:00
return optdict
def write_cache ( options ):
"""
Takes a dict as input and writes a cached file of answers
"""
2011-01-26 10:53:02 -05:00
top_dir = tempfile . mkdtemp ( "ipa" )
2011-11-03 11:08:26 +01:00
fname = " %s /cache" % top_dir
2009-11-18 14:28:33 -05:00
try :
2011-11-03 11:08:26 +01:00
with open ( fname , 'wb' ) as f :
pickle . dump ( options , f )
ipautil . encrypt_file ( fname , ANSWER_CACHE , options [ 'dm_password' ], top_dir )
2009-11-18 14:28:33 -05:00
except IOError , e :
2011-11-03 11:08:26 +01:00
raise Exception ( "Unable to cache command-line options %s " % str ( e ))
2011-01-26 10:53:02 -05:00
finally :
shutil . rmtree ( top_dir )
2009-11-18 14:28:33 -05:00
2008-09-16 20:18:11 -06:00
def read_host_name ( host_default , no_host_dns = False ):
host_name = ""
print "Enter the fully qualified domain name of the computer"
print "on which you're setting up server software. Using the form"
print "<hostname>.<domainname>"
print "Example: master.example.com."
print ""
print ""
if host_default == "" :
host_default = "master.example.com"
2011-10-06 11:26:03 +02:00
host_name = user_input ( "Server host name" , host_default , allow_empty = False )
print ""
verify_fqdn ( host_name , no_host_dns )
return host_name
2008-02-25 17:16:18 -05:00
def read_domain_name ( domain_name , unattended ):
2012-05-22 12:19:53 +02:00
print "The domain name has been determined based on the host name."
2008-02-15 20:47:29 -05:00
print ""
2008-02-25 17:16:18 -05:00
if not unattended :
2008-07-21 12:25:37 +02:00
domain_name = user_input ( "Please confirm the domain name" , domain_name )
2008-02-25 17:16:18 -05:00
print ""
2008-02-15 20:47:29 -05:00
return domain_name
2008-02-25 17:16:18 -05:00
def read_realm_name ( domain_name , unattended ):
print "The kerberos protocol requires a Realm name to be defined."
print "This is typically the domain name converted to uppercase."
print ""
2009-05-12 15:20:24 +02:00
2008-02-25 17:16:18 -05:00
if unattended :
2008-07-21 12:25:37 +02:00
return domain_name . upper ()
realm_name = user_input ( "Please provide a realm name" , domain_name . upper ())
2011-04-07 16:53:52 +02:00
upper_dom = realm_name . upper () #pylint: disable=E1103
2008-07-21 12:25:37 +02:00
if upper_dom != realm_name :
print "An upper-case realm name is required."
if not user_input ( "Do you want to use " + upper_dom + " as realm name?" , True ):
2008-02-25 17:16:18 -05:00
print ""
2008-07-21 12:25:37 +02:00
print "An upper-case realm name is required. Unable to continue."
sys . exit ( 1 )
else :
realm_name = upper_dom
print ""
return realm_name
2008-07-21 12:25:37 +02:00
def read_dm_password ():
print "Certain directory server operations require an administrative user."
print "This user is referred to as the Directory Manager and has full access"
2008-01-29 11:33:44 -05:00
print "to the Directory for system management tasks and will be added to the"
2008-01-25 17:08:36 -05:00
print "instance of directory server created for IPA."
print "The password must be at least 8 characters long."
print ""
#TODO: provide the option of generating a random password
2011-09-26 08:27:01 +02:00
dm_password = read_password ( "Directory Manager" , validator = validate_dm_password )
return dm_password
def read_admin_password ():
print "The IPA server requires an administrative user, named 'admin'."
print "This user is a regular system account used for IPA server administration."
print ""
#TODO: provide the option of generating a random password
2014-07-24 13:32:37 +02:00
admin_password = read_password ( "IPA admin" , validator = validate_admin_password )
return admin_password
2008-05-30 15:31:13 -04:00
def check_dirsrv ( unattended ):
2009-02-02 13:50:53 -05:00
( ds_unsecure , ds_secure ) = dsinstance . check_ports ()
2008-01-22 08:03:06 +00:00
if not ds_unsecure or not ds_secure :
print "IPA requires ports 389 and 636 for the Directory Server."
print "These are currently in use:"
if not ds_unsecure :
print " \t 389"
if not ds_secure :
print " \t 636"
sys . exit ( 1 )
2010-10-06 10:16:54 -04:00
def uninstall ():
2010-04-15 11:08:48 +02:00
2011-08-29 11:16:52 -04:00
rv = 0
2010-11-08 11:05:37 -05:00
print "Shutting down all IPA services"
try :
2014-06-17 11:45:43 +02:00
( stdout , stderr , rc ) = run ([ paths . IPACTL , "stop" ], raiseonerr = False )
2010-11-08 11:05:37 -05:00
except Exception , e :
pass
2012-08-23 12:38:45 -04:00
# Need to get dogtag info before /etc/ipa/default.conf is removed
dogtag_constants = dogtag . configured_constants ()
2010-11-08 11:05:37 -05:00
print "Removing IPA client configuration"
2008-03-31 17:35:45 -04:00
try :
2014-06-17 11:45:43 +02:00
( stdout , stderr , rc ) = run ([ paths . IPA_CLIENT_INSTALL , "--on-master" , "--unattended" , "--uninstall" ], raiseonerr = False )
2010-09-23 12:07:29 -04:00
if rc not in [ 0 , 2 ]:
2011-11-15 14:39:31 -05:00
root_logger . debug ( "ipa-client-install returned %d " % rc )
2010-08-31 17:21:25 -04:00
raise RuntimeError ( stdout )
2008-03-31 17:35:45 -04:00
except Exception , e :
2011-08-29 11:16:52 -04:00
rv = 1
2008-03-31 17:35:45 -04:00
print "Uninstall of client side components failed!"
print "ipa-client-install returned: " + str ( e )
2009-02-02 13:50:53 -05:00
ntpinstance . NTPInstance ( fstore ) . uninstall ()
2012-11-12 09:49:46 -05:00
if not dogtag_constants . SHARED_DB :
2012-09-19 23:35:42 -04:00
cads_instance = cainstance . CADSInstance (
dogtag_constants = dogtag_constants )
if cads_instance . is_configured ():
cads_instance . uninstall ()
2014-03-18 11:23:30 -04:00
kra_instance = krainstance . KRAInstance (
api . env . realm , dogtag_constants = dogtag_constants )
2014-10-07 16:46:15 +02:00
kra_instance . stop_tracking_certificates ()
2014-03-18 11:23:30 -04:00
if kra_instance . is_installed ():
kra_instance . uninstall ()
2012-08-23 12:38:45 -04:00
ca_instance = cainstance . CAInstance (
api . env . realm , certs . NSS_DIR , dogtag_constants = dogtag_constants )
2014-10-07 16:46:15 +02:00
ca_instance . stop_tracking_certificates ()
2012-08-23 12:38:45 -04:00
if ca_instance . is_configured ():
ca_instance . uninstall ()
2014-03-18 11:23:30 -04:00
2009-02-02 13:50:53 -05:00
bindinstance . BindInstance ( fstore ) . uninstall ()
httpinstance . HTTPInstance ( fstore ) . uninstall ()
krbinstance . KrbInstance ( fstore ) . uninstall ()
2011-03-01 14:17:03 +01:00
dsinstance . DsInstance ( fstore = fstore ) . uninstall ()
2013-11-04 17:15:23 +02:00
if _server_trust_ad_installed :
adtrustinstance . ADTRUSTInstance ( fstore ) . uninstall ()
2012-02-15 16:55:59 -05:00
memcacheinstance . MemcacheInstance () . uninstall ()
2013-06-05 15:48:35 +02:00
otpdinstance . OtpdInstance () . uninstall ()
2014-05-29 10:18:21 +02:00
tasks . restore_network_configuration ( fstore , sstore )
2008-03-27 19:01:38 -04:00
fstore . restore_all_files ()
2009-11-18 14:28:33 -05:00
try :
os . remove ( ANSWER_CACHE )
except Exception :
pass
2014-07-24 16:32:00 +02:00
try :
os . remove ( paths . ROOT_IPA_CSR )
except Exception :
pass
2011-09-09 17:07:09 -04:00
2010-01-28 14:22:50 -05:00
# ipa-client-install removes /etc/ipa/default.conf
2011-01-28 15:45:19 -05:00
2011-02-07 13:31:51 -05:00
sstore . _load ()
2012-12-07 16:44:32 +01:00
ipaclient . ntpconf . restore_forced_ntpd ( sstore )
2014-07-15 13:31:01 +02:00
# Clean up group_exists (unused since IPA 2.2, not being set since 4.1)
sstore . restore_state ( "install" , "group_exists" )
2011-01-28 15:45:19 -05:00
2014-05-29 10:37:18 +02:00
services . knownservices . ipa . disable ()
2011-03-07 16:29:08 -05:00
2012-12-05 10:50:05 +01:00
ipautil . restore_hostname ( sstore )
2011-10-13 12:16:15 +02:00
2012-06-08 08:31:37 +02:00
# remove upgrade state file
sysupgrade . remove_upgrade_file ()
2011-08-29 11:16:52 -04:00
if fstore . has_files ():
2013-12-12 15:01:14 +01:00
root_logger . error ( 'Some files have not been restored, see %s /sysrestore.index' % SYSRESTORE_DIR_PATH )
2011-08-29 11:16:52 -04:00
has_state = False
for module in IPA_MODULES : # from installutils
if sstore . has_state ( module ):
2013-12-12 15:01:14 +01:00
root_logger . error ( 'Some installation state for %s has not been restored, see %s /sysrestore.state' % ( module , SYSRESTORE_DIR_PATH ))
2011-08-29 11:16:52 -04:00
has_state = True
rv = 1
if has_state :
2013-12-12 15:01:14 +01:00
root_logger . error ( 'Some installation state has not been restored. \n '
'This may cause re-installation to fail. \n '
'It should be safe to remove %s /sysrestore.state but it may \n '
'mean your system hasn \' t be restored to its pre-installation state.' % SYSRESTORE_DIR_PATH )
2012-10-23 16:31:37 -04:00
# Note that this name will be wrong after the first uninstall.
dirname = dsinstance . config_dirname ( dsinstance . realm_to_serverid ( api . env . realm ))
2012-11-12 09:49:46 -05:00
dirs = [ dirname , dogtag_constants . ALIAS_DIR , certs . NSS_DIR ]
2012-10-23 16:31:37 -04:00
ids = certmonger . check_state ( dirs )
if ids :
root_logger . error ( 'Some certificates may still be tracked by certmonger. \n This will cause re-installation to fail. \n Start the certmonger service and list the certificates being tracked \n # getcert list \n These may be untracked by executing \n # getcert stop-tracking -i <request_id> \n for each id in: %s ' % ', ' . join ( ids ))
2011-08-29 11:16:52 -04:00
return rv
2008-01-11 11:57:36 +00:00
2009-11-02 14:16:27 -07:00
2011-02-15 14:11:27 -05:00
def set_subject_in_config ( realm_name , dm_password , suffix , subject_base ):
ldapuri = 'ldapi:// %% 2fvar %% 2frun %% 2fslapd- %s .socket' % (
dsinstance . realm_to_serverid ( realm_name )
)
2010-01-20 11:26:20 -05:00
try :
2010-03-24 15:51:31 +01:00
conn = ldap2 ( shared_instance = False , ldap_uri = ldapuri , base_dn = suffix )
2012-05-13 07:36:35 -04:00
conn . connect ( bind_dn = DN (( 'cn' , 'directory manager' )), bind_pw = dm_password )
2010-03-24 15:51:31 +01:00
except errors . ExecutionError , e :
2011-11-15 14:39:31 -05:00
root_logger . critical ( "Could not connect to the Directory Server on %s " % realm_name )
2010-01-20 11:26:20 -05:00
raise e
2013-10-31 16:54:49 +00:00
entry_attrs = conn . get_ipa_config ()
2010-03-24 15:51:31 +01:00
if 'ipacertificatesubjectbase' not in entry_attrs :
2013-10-31 16:54:49 +00:00
entry_attrs [ 'ipacertificatesubjectbase' ] = [ str ( subject_base )]
conn . update_entry ( entry_attrs )
2010-03-24 15:51:31 +01:00
conn . disconnect ()
2009-11-02 14:16:27 -07:00
2013-03-14 13:58:27 +01:00
def main ():
2007-10-02 16:56:51 -04:00
global ds
2010-04-27 17:51:13 -04:00
global uninstalling
2011-11-29 09:10:31 +01:00
global installation_cleanup
2007-10-02 16:56:51 -04:00
ds = None
2010-10-29 20:24:31 +02:00
safe_options , options = parse_options ()
2007-10-02 16:56:51 -04:00
if os . getegid () != 0 :
2010-11-08 23:13:48 +01:00
sys . exit ( "Must be root to set up server" )
2008-02-20 10:16:19 -05:00
2014-05-29 10:18:21 +02:00
tasks . check_selinux_status ()
2012-05-31 13:59:33 +02:00
2007-10-02 16:56:51 -04:00
signal . signal ( signal . SIGTERM , signal_handler )
signal . signal ( signal . SIGINT , signal_handler )
2008-03-24 12:22:34 -04:00
if options . uninstall :
2010-04-27 17:51:13 -04:00
uninstalling = True
2014-06-17 11:45:43 +02:00
standard_logging_setup ( paths . IPASERVER_UNINSTALL_LOG , debug = options . debug )
2011-11-29 09:10:31 +01:00
installation_cleanup = False
2008-03-24 12:22:34 -04:00
else :
2014-06-17 11:45:43 +02:00
standard_logging_setup ( paths . IPASERVER_INSTALL_LOG , debug = options . debug )
2008-03-24 12:22:34 -04:00
print " \n The log file for this installation can be found in /var/log/ipaserver-install.log"
2014-09-24 16:31:39 +02:00
if not options . external_ca and not options . external_cert_files and is_ipa_configured ():
2011-11-29 09:10:31 +01:00
installation_cleanup = False
2012-09-10 14:11:40 +03:00
sys . exit ( "IPA server is already configured on this system. \n " +
"If you want to reinstall the IPA server, please uninstall " +
"it first using 'ipa-server-install --uninstall'." )
2014-06-17 11:45:43 +02:00
client_fstore = sysrestore . FileStore ( paths . IPA_CLIENT_SYSRESTORE )
2011-02-24 13:02:27 +01:00
if client_fstore . has_files ():
2011-11-29 09:10:31 +01:00
installation_cleanup = False
2012-09-10 14:11:40 +03:00
sys . exit ( "IPA client is already configured on this system. \n " +
"Please uninstall it before configuring the IPA server, " +
"using 'ipa-client-install --uninstall'" )
2011-02-24 13:02:27 +01:00
2011-11-15 14:39:31 -05:00
root_logger . debug ( ' %s was invoked with options: %s ' % ( sys . argv [ 0 ], safe_options ))
root_logger . debug ( "missing options might be asked for interactively later \n " )
2014-03-19 13:54:20 +01:00
root_logger . debug ( 'IPA version %s ' % version . VENDOR_VERSION )
2010-10-29 20:24:31 +02:00
2008-03-27 19:01:38 -04:00
global fstore
2013-12-12 15:01:14 +01:00
fstore = sysrestore . FileStore ( SYSRESTORE_DIR_PATH )
2011-01-28 15:45:19 -05:00
global sstore
2013-12-12 15:01:14 +01:00
sstore = sysrestore . StateFile ( SYSRESTORE_DIR_PATH )
2008-03-27 19:01:38 -04:00
2009-12-03 16:32:56 +01:00
# Configuration for ipalib, we will bootstrap and finalize later, after
# we are sure we have the configuration file ready.
2009-11-02 14:16:27 -07:00
cfg = dict (
2010-03-17 10:01:24 -04:00
context = 'installer' ,
2009-11-02 14:16:27 -07:00
in_server = True ,
2009-11-19 10:33:50 -05:00
debug = options . debug
2009-11-02 14:16:27 -07:00
)
2009-09-28 23:34:15 -04:00
2008-01-11 11:57:36 +00:00
if options . uninstall :
2010-04-15 11:08:48 +02:00
# We will need at least api.env, finalize api now. This system is
# already installed, so the configuration file is there.
api . bootstrap ( ** cfg )
api . finalize ()
2008-03-31 17:35:45 -04:00
if not options . unattended :
print " \n This is a NON REVERSIBLE operation and will delete all data and configuration! \n "
2008-08-06 11:27:04 -04:00
if not user_input ( "Are you sure you want to continue with the uninstall procedure?" , False ):
2008-03-31 17:35:45 -04:00
print ""
print "Aborting uninstall operation."
sys . exit ( 1 )
2010-10-06 10:16:54 -04:00
2013-09-06 14:53:01 +02:00
try :
conn = ipaldap . IPAdmin (
api . env . host ,
ldapi = True ,
realm = api . env . realm
2013-08-29 17:44:02 +02:00
)
2013-09-06 14:53:01 +02:00
conn . do_external_bind ( pwd . getpwuid ( os . geteuid ()) . pw_name )
except Exception :
msg = ( " \n WARNING: Failed to connect to Directory Server to find "
"information about replication agreements. Uninstallation "
"will continue despite the possible existing replication "
"agreements. \n\n " )
2013-08-29 17:44:02 +02:00
print textwrap . fill ( msg , width = 80 , replace_whitespace = False )
2013-09-06 14:53:01 +02:00
else :
rm = replication . ReplicationManager (
realm = api . env . realm ,
hostname = api . env . host ,
dirman_passwd = None ,
conn = conn
)
agreements = rm . find_ipa_replication_agreements ()
if agreements :
other_masters = [ a . get ( 'cn' )[ 0 ][ 4 :] for a in agreements ]
msg = (
" \n Replication agreements with the following IPA masters "
"found: %s . Removing any replication agreements before "
"uninstalling the server is strongly recommended. You can "
"remove replication agreements by running the following "
"command on any other IPA master: \n " % ", " . join (
other_masters )
)
cmd = "$ ipa-replica-manage del %s \n " % api . env . host
print textwrap . fill ( msg , width = 80 , replace_whitespace = False )
print cmd
if not ( options . unattended or user_input ( "Are you sure you "
"want to continue "
"with the uninstall "
"procedure?" ,
False )):
print ""
print "Aborting uninstall operation."
sys . exit ( 1 )
2013-08-29 17:44:02 +02:00
2010-10-06 10:16:54 -04:00
return uninstall ()
2008-01-11 11:57:36 +00:00
2011-07-26 13:21:36 +02:00
if options . external_ca :
2012-09-19 23:35:42 -04:00
if cainstance . is_step_one_done ():
2014-07-24 16:32:00 +02:00
print ( "CA is already installed. \n Run the installer with "
2014-09-24 16:31:39 +02:00
"--external-cert-file." )
2014-07-24 16:32:00 +02:00
sys . exit ( 1 )
if ipautil . file_exists ( paths . ROOT_IPA_CSR ):
print ( "CA CSR file %s already exists. \n In order to continue "
"remove the file and run the installer again." %
paths . ROOT_IPA_CSR )
2011-07-26 13:21:36 +02:00
sys . exit ( 1 )
2014-09-24 16:31:39 +02:00
elif options . external_cert_files :
2012-09-19 23:35:42 -04:00
if not cainstance . is_step_one_done ():
2011-07-26 13:21:36 +02:00
# This can happen if someone passes external_ca_file without
# already having done the first stage of the CA install.
2014-07-24 16:32:00 +02:00
print ( "CA is not installed yet. To install with an external CA "
"is a two-stage process. \n First run the installer with "
"--external-ca." )
2011-07-26 13:21:36 +02:00
sys . exit ( 1 )
2009-11-18 14:28:33 -05:00
# This will override any settings passed in on the cmdline
2011-01-26 10:53:02 -05:00
if ipautil . file_exists ( ANSWER_CACHE ):
2012-08-17 09:51:36 +02:00
if options . dm_password is not None :
dm_password = options . dm_password
else :
dm_password = read_password ( "Directory Manager" , confirm = False )
2011-10-06 08:22:08 +02:00
if dm_password is None :
2013-07-09 10:29:21 +00:00
sys . exit ( "Directory Manager password required" )
2011-11-03 11:08:26 +01:00
try :
options . _update_loose ( read_cache ( dm_password ))
except Exception , e :
sys . exit ( "Cannot process the cache file: %s " % str ( e ))
2009-11-18 14:28:33 -05:00
2014-09-24 16:31:39 +02:00
if options . external_cert_files :
external_cert_file , external_ca_file = load_external_cert (
options . external_cert_files , options . subject )
2011-08-17 10:19:37 +02:00
2013-03-08 15:13:19 +01:00
# We only set up the CA if the PKCS#12 options are not given.
2014-09-24 16:41:47 +02:00
if options . dirsrv_cert_files :
2013-03-08 15:13:19 +01:00
setup_ca = False
2014-03-18 11:23:30 -04:00
setup_kra = False
2013-03-08 15:13:19 +01:00
else :
setup_ca = True
2014-03-18 11:23:30 -04:00
# setup_kra is set to False until Dogtag 10.2 is available for IPA to consume
# Until then users that want to install the KRA need to use ipa-install-kra
# TODO set setup_kra = True when Dogtag 10.2 is available
setup_kra = False
2013-03-08 15:13:19 +01:00
2013-02-25 17:15:23 +01:00
# Figure out what external CA step we're in. See cainstance.py for more
# info on the 3 states.
2014-09-24 16:31:39 +02:00
if options . external_cert_files :
2013-02-25 17:15:23 +01:00
external = 2
elif options . external_ca :
external = 1
else :
external = 0
print "=============================================================================="
2010-02-03 14:56:17 -05:00
print "This program will set up the FreeIPA Server."
print ""
2008-01-25 17:08:36 -05:00
print "This includes:"
2013-03-08 15:13:19 +01:00
if setup_ca :
2011-10-03 12:30:34 +02:00
print " * Configure a stand-alone CA (dogtag) for certificate management"
2014-03-18 11:23:30 -04:00
if setup_kra :
print " * Configure a stand-alone KRA (dogtag) for key storage"
2008-06-06 15:25:36 -04:00
if options . conf_ntp :
print " * Configure the Network Time Daemon (ntpd)"
2008-01-25 17:08:36 -05:00
print " * Create and configure an instance of Directory Server"
2008-03-04 14:47:47 -05:00
print " * Create and configure a Kerberos Key Distribution Center (KDC)"
2008-01-25 17:08:36 -05:00
print " * Configure Apache (httpd)"
2009-06-25 14:42:08 +02:00
if options . setup_dns :
2008-06-06 15:25:36 -04:00
print " * Configure DNS (bind)"
2010-10-29 16:23:21 -04:00
if options . setup_pkinit :
print " * Configure the KDC to enable PKINIT"
2008-06-06 15:25:36 -04:00
if not options . conf_ntp :
print ""
print "Excluded by options:"
print " * Configure the Network Time Daemon (ntpd)"
2013-04-22 16:48:43 +02:00
if not options . unattended :
print ""
print "To accept the default shown in brackets, press the Enter key."
print ""
2013-02-25 17:15:23 +01:00
if external != 2 :
# Make sure the 389-ds ports are available
check_dirsrv ( options . unattended )
2012-12-07 16:44:32 +01:00
if options . conf_ntp :
try :
ipaclient . ntpconf . check_timedate_services ()
except ipaclient . ntpconf . NTPConflictingService , e :
print "WARNING: conflicting time&date synchronization service ' %s '" \
" will be disabled" % e . conflicting_service
print "in favor of ntpd"
print ""
except ipaclient . ntpconf . NTPConfigurationError :
pass
2013-10-25 10:22:08 +02:00
# Check to see if httpd is already configured to listen on 443
if httpinstance . httpd_443_configured ():
sys . exit ( "Aborting installation" )
2007-08-20 18:40:32 -04:00
realm_name = ""
host_name = ""
2007-09-20 15:10:21 -04:00
domain_name = ""
2014-08-27 13:50:21 +02:00
ip_addresses = []
2007-08-20 18:40:32 -04:00
master_password = ""
2007-08-31 18:40:01 -04:00
dm_password = ""
admin_password = ""
2014-08-27 13:50:21 +02:00
reverse_zones = []
2007-08-20 18:40:32 -04:00
2013-02-14 08:49:17 -08:00
if not options . setup_dns and not options . unattended :
if ipautil . user_input ( "Do you want to configure integrated DNS (BIND)?" , False ):
options . setup_dns = True
print ""
2007-09-20 15:10:21 -04:00
# check bind packages are installed
2009-06-25 14:42:08 +02:00
if options . setup_dns :
2009-11-13 16:57:51 +01:00
if not bindinstance . check_inst ( options . unattended ):
2010-11-08 23:13:48 +01:00
sys . exit ( "Aborting installation" )
2007-09-20 15:10:21 -04:00
2011-03-03 16:03:44 -05:00
# Don't require an external DNS to say who we are if we are
# setting up a local DNS server.
options . no_host_dns = True
# check the hostname is correctly configured, it must be as the kldap
2010-12-01 17:22:56 +01:00
# utilities just use the hostname as returned by getaddrinfo to set
# up some of the standard entries
host_default = ""
if options . host_name :
host_default = options . host_name
else :
host_default = get_fqdn ()
2008-02-20 10:16:19 -05:00
2011-06-24 16:56:25 +02:00
try :
2012-11-13 12:01:35 -05:00
if options . unattended or options . host_name :
2008-09-16 20:18:11 -06:00
verify_fqdn ( host_default , options . no_host_dns )
2011-06-24 16:56:25 +02:00
host_name = host_default
else :
host_name = read_host_name ( host_default , options . no_host_dns )
2011-10-06 11:26:03 +02:00
except BadHostError , e :
2011-06-24 16:56:25 +02:00
sys . exit ( str ( e ) + " \n " )
2008-02-15 20:47:29 -05:00
2008-05-20 10:17:20 -04:00
host_name = host_name . lower ()
2011-11-15 14:39:31 -05:00
root_logger . debug ( "will use host_name: %s \n " % host_name )
2008-05-20 10:17:20 -04:00
2011-10-13 12:16:15 +02:00
system_hostname = get_fqdn ()
if host_name != system_hostname :
print >> sys . stderr
print >> sys . stderr , "Warning: hostname %s does not match system hostname %s ." \
% ( host_name , system_hostname )
print >> sys . stderr , "System hostname will be updated during the installation process"
print >> sys . stderr , "to prevent service failures."
print >> sys . stderr
2008-02-15 20:47:29 -05:00
if not options . domain_name :
2008-02-25 17:16:18 -05:00
domain_name = read_domain_name ( host_name [ host_name . find ( "." ) + 1 :], options . unattended )
2011-11-15 14:39:31 -05:00
root_logger . debug ( "read domain_name: %s \n " % domain_name )
2012-05-11 15:56:43 -04:00
try :
validate_domain_name ( domain_name )
except ValueError , e :
sys . exit ( "Invalid domain name: %s " % unicode ( e ))
2008-02-15 20:47:29 -05:00
else :
2008-02-25 17:16:18 -05:00
domain_name = options . domain_name
2007-09-20 15:10:21 -04:00
2008-05-20 10:17:20 -04:00
domain_name = domain_name . lower ()
2014-08-27 13:50:21 +02:00
ip_addresses = get_server_ip_address ( host_name , fstore ,
options . unattended , options . setup_dns , options . ip_addresses )
2007-09-20 15:10:21 -04:00
2007-08-20 18:40:32 -04:00
if not options . realm_name :
2008-02-25 17:16:18 -05:00
realm_name = read_realm_name ( domain_name , options . unattended )
2011-11-15 14:39:31 -05:00
root_logger . debug ( "read realm_name: %s \n " % realm_name )
2007-08-20 18:40:32 -04:00
else :
2008-06-03 11:28:27 -04:00
realm_name = options . realm_name . upper ()
2007-08-20 18:40:32 -04:00
2010-11-01 13:51:14 -04:00
if not options . subject :
2012-05-13 07:36:35 -04:00
options . subject = DN (( 'O' , realm_name ))
2010-11-01 13:51:14 -04:00
2014-09-24 16:41:47 +02:00
if options . http_cert_files :
2013-09-25 08:40:05 +00:00
if options . http_pin is None :
2013-07-09 10:23:47 +00:00
options . http_pin = installutils . read_password (
2014-09-24 16:41:47 +02:00
"Enter Apache Server private key unlock" ,
2013-07-09 10:23:47 +00:00
confirm = False , validate = False )
if options . http_pin is None :
2014-09-24 16:41:47 +02:00
sys . exit (
"Apache Server private key unlock password required" )
http_pkcs12_file , http_pin , http_ca_cert = load_pkcs12 (
cert_files = options . http_cert_files ,
key_password = options . http_pin ,
2014-09-24 16:48:15 +02:00
key_nickname = options . http_cert_name ,
2014-09-24 16:41:47 +02:00
ca_cert_files = options . ca_cert_files ,
host_name = host_name )
http_pkcs12_info = ( http_pkcs12_file . name , http_pin )
if options . dirsrv_cert_files :
2013-09-25 08:40:05 +00:00
if options . dirsrv_pin is None :
2014-09-24 16:41:47 +02:00
options . dirsrv_pin = read_password (
"Enter Directory Server private key unlock" ,
2013-07-09 10:23:47 +00:00
confirm = False , validate = False )
if options . dirsrv_pin is None :
2014-09-24 16:41:47 +02:00
sys . exit (
"Directory Server private key unlock password required" )
dirsrv_pkcs12_file , dirsrv_pin , dirsrv_ca_cert = load_pkcs12 (
cert_files = options . dirsrv_cert_files ,
key_password = options . dirsrv_pin ,
2014-09-24 16:48:15 +02:00
key_nickname = options . dirsrv_cert_name ,
2014-09-24 16:41:47 +02:00
ca_cert_files = options . ca_cert_files ,
host_name = host_name )
dirsrv_pkcs12_info = ( dirsrv_pkcs12_file . name , dirsrv_pin )
if options . pkinit_cert_files :
2013-09-25 08:40:05 +00:00
if options . pkinit_pin is None :
2014-09-24 16:41:47 +02:00
options . pkinit_pin = read_password (
"Enter Kerberos KDC private key unlock" ,
2013-07-09 10:23:47 +00:00
confirm = False , validate = False )
if options . pkinit_pin is None :
2014-09-24 16:41:47 +02:00
sys . exit (
"Kerberos KDC private key unlock password required" )
pkinit_pkcs12_file , pkinit_pin , pkinit_ca_cert = load_pkcs12 (
cert_files = options . pkinit_cert_files ,
key_password = options . pkinit_pin ,
2014-09-24 16:48:15 +02:00
key_nickname = options . pkinit_cert_name ,
2014-09-24 16:41:47 +02:00
ca_cert_files = options . ca_cert_files ,
host_name = host_name )
pkinit_pkcs12_info = ( pkinit_pkcs12_file . name , pkinit_pin )
if ( options . http_cert_files and options . dirsrv_cert_files and
2014-08-05 09:06:39 +02:00
http_ca_cert != dirsrv_ca_cert ):
2014-09-24 16:41:47 +02:00
sys . exit ( "Apache Server SSL certificate and Directory Server SSL "
"certificate are not signed by the same CA certificate" )
2014-08-05 09:06:39 +02:00
2007-08-31 18:40:01 -04:00
if not options . dm_password :
dm_password = read_dm_password ()
2011-10-06 08:22:08 +02:00
if dm_password is None :
2013-07-09 10:29:21 +00:00
sys . exit ( "Directory Manager password required" )
2007-08-20 18:40:32 -04:00
else :
2007-08-31 18:40:01 -04:00
dm_password = options . dm_password
2007-08-20 18:40:32 -04:00
if not options . master_password :
master_password = ipa_generate_password ()
2007-08-20 18:40:32 -04:00
else :
master_password = options . master_password
2007-08-31 18:40:01 -04:00
if not options . admin_password :
admin_password = read_admin_password ()
2011-10-06 08:22:08 +02:00
if admin_password is None :
2013-07-09 10:29:21 +00:00
sys . exit ( "IPA admin password required" )
2007-08-31 18:40:01 -04:00
else :
admin_password = options . admin_password
2009-09-01 23:28:52 +02:00
if options . setup_dns :
if options . no_forwarders :
dns_forwarders = ()
elif options . forwarders :
dns_forwarders = options . forwarders
else :
dns_forwarders = read_dns_forwarders ()
2011-07-26 14:53:19 +02:00
2014-08-27 13:50:21 +02:00
reverse_zones = bindinstance . check_reverse_zones ( ip_addresses ,
options . reverse_zones , options , options . unattended )
if reverse_zones :
print "Using reverse zone(s) %s " % ", " . join ( str ( rz ) for rz in reverse_zones )
2009-09-08 01:03:55 -06:00
else :
dns_forwarders = ()
2011-11-15 14:39:31 -05:00
root_logger . debug ( "will use dns_forwarders: %s \n " % str ( dns_forwarders ))
2009-09-01 23:28:52 +02:00
2011-12-07 13:58:35 +01:00
print
print "The IPA Master Server will be configured with:"
2014-08-27 13:50:21 +02:00
print "Hostname: %s " % host_name
print "IP address(es): %s " % ", " . join ( str ( ip ) for ip in ip_addresses )
print "Domain name: %s " % domain_name
print "Realm name: %s " % realm_name
2011-12-07 13:58:35 +01:00
print
if options . setup_dns :
print "BIND DNS server will be configured to serve IPA domain with:"
print "Forwarders: %s " % ( "No forwarders" if not dns_forwarders \
else ", " . join ([ str ( ip ) for ip in dns_forwarders ]))
2014-08-27 13:50:21 +02:00
print "Reverse zone(s): %s " % ( "No reverse zone" if options . no_reverse \
or reverse_zones is None else ", " . join ( str ( rz ) for rz in reverse_zones ))
2011-12-07 13:58:35 +01:00
print
2013-09-18 12:56:00 +02:00
# If domain name and realm does not match, IPA server will not be able
# to estabilish trust with Active Directory. Print big fat warning.
realm_not_matching_domain = ( domain_name . upper () != realm_name )
if realm_not_matching_domain :
print ( "WARNING: Realm name does not match the domain name. \n "
"You will not be able to estabilish trusts with Active "
2014-03-03 17:11:52 -07:00
"Directory unless \n the realm name of the IPA server matches "
2013-09-18 12:56:00 +02:00
"its domain name. \n\n " )
2011-12-07 13:58:35 +01:00
if not options . unattended and not user_input ( "Continue to configure the system with these values?" , False ):
sys . exit ( "Installation aborted" )
2011-11-29 09:10:31 +01:00
# Installation has started. No IPA sysrestore items are restored in case of
# failure to enable root cause investigation
installation_cleanup = False
2009-12-03 16:32:56 +01:00
# Create the management framework config file and finalize api
2014-06-17 11:45:43 +02:00
target_fname = paths . IPA_DEFAULT_CONF
2011-08-30 16:32:40 +02:00
fd = open ( target_fname , "w" )
fd . write ( "[global] \n " )
2012-05-13 07:36:35 -04:00
fd . write ( "host= %s \n " % host_name )
fd . write ( "basedn= %s \n " % ipautil . realm_to_suffix ( realm_name ))
fd . write ( "realm= %s \n " % realm_name )
fd . write ( "domain= %s \n " % domain_name )
2011-09-30 10:09:55 +02:00
fd . write ( "xmlrpc_uri=https:// %s /ipa/xml \n " % format_netloc ( host_name ))
2011-08-30 16:32:40 +02:00
fd . write ( "ldap_uri=ldapi:// %% 2fvar %% 2frun %% 2fslapd- %s .socket \n " % dsinstance . realm_to_serverid ( realm_name ))
2013-03-08 15:13:19 +01:00
if setup_ca :
fd . write ( "enable_ra=True \n " )
2011-08-30 16:32:40 +02:00
fd . write ( "ra_plugin=dogtag \n " )
2012-08-23 12:38:45 -04:00
fd . write ( "dogtag_version= %s \n " %
dogtag . install_constants . DOGTAG_VERSION )
2013-03-08 15:13:19 +01:00
else :
fd . write ( "enable_ra=False \n " )
2013-03-14 13:58:27 +01:00
fd . write ( "ra_plugin=none \n " )
2014-03-18 11:23:30 -04:00
fd . write ( "enable_kra= %s \n " % setup_kra )
2011-08-30 16:32:40 +02:00
fd . write ( "mode=production \n " )
fd . close ()
# Must be readable for everyone
os . chmod ( target_fname , 0644 )
2009-12-03 16:32:56 +01:00
api . bootstrap ( ** cfg )
api . finalize ()
2007-09-20 15:10:21 -04:00
if not options . unattended :
print ""
print "The following operations may take some minutes to complete."
print "Please wait until the prompt is returned."
2009-09-10 16:15:14 -04:00
print ""
2008-02-20 11:03:46 -05:00
2011-10-13 12:16:15 +02:00
if host_name != system_hostname :
2011-11-15 14:39:31 -05:00
root_logger . debug ( "Chosen hostname ( %s ) differs from system hostname ( %s ) - change it" \
2011-10-13 12:16:15 +02:00
% ( host_name , system_hostname ))
# configure /etc/sysconfig/network to contain the custom hostname
2014-05-29 10:18:21 +02:00
tasks . backup_and_replace_hostname ( fstore , sstore , host_name )
2011-10-13 12:16:15 +02:00
2014-07-15 13:31:01 +02:00
# Create DS user/group if it doesn't exist yet
dsinstance . create_ds_user ()
2011-01-28 15:45:19 -05:00
2013-03-08 15:13:19 +01:00
# Create a directory server instance
2013-02-25 17:15:23 +01:00
if external != 2 :
# Configure ntpd
if options . conf_ntp :
ipaclient . ntpconf . force_ntpd ( sstore )
ntp = ntpinstance . NTPInstance ( fstore )
if not ntp . is_configured ():
ntp . create_instance ()
2014-09-24 16:41:47 +02:00
if options . dirsrv_cert_files :
2014-08-05 09:06:39 +02:00
ds = dsinstance . DsInstance ( fstore = fstore )
2013-03-08 14:37:38 +01:00
ds . create_instance ( realm_name , host_name , domain_name ,
dm_password , dirsrv_pkcs12_info ,
2013-03-14 13:58:27 +01:00
idstart = options . idstart , idmax = options . idmax ,
2013-03-08 14:37:38 +01:00
subject_base = options . subject ,
2014-09-24 16:41:47 +02:00
hbac_allow = not options . hbac_allow )
2013-02-25 17:15:23 +01:00
else :
2013-03-14 13:58:27 +01:00
ds = dsinstance . DsInstance ( fstore = fstore )
2012-09-19 23:35:42 -04:00
ds . create_instance ( realm_name , host_name , domain_name ,
2013-03-08 15:13:19 +01:00
dm_password ,
2013-02-25 17:15:23 +01:00
idstart = options . idstart , idmax = options . idmax ,
subject_base = options . subject ,
hbac_allow = not options . hbac_allow )
2012-09-19 23:35:42 -04:00
else :
2013-03-14 13:58:27 +01:00
ds = dsinstance . DsInstance ( fstore = fstore )
2013-02-25 17:15:23 +01:00
ds . init_info (
realm_name , host_name , domain_name , dm_password ,
2013-03-27 14:25:18 +01:00
options . subject , 1101 , 1100 , None )
2013-02-25 17:15:23 +01:00
2012-09-19 23:35:42 -04:00
2013-03-08 15:13:19 +01:00
if setup_ca :
2012-08-23 12:38:45 -04:00
ca = cainstance . CAInstance ( realm_name , certs . NSS_DIR ,
dogtag_constants = dogtag . install_constants )
2009-09-10 16:15:14 -04:00
if external == 0 :
2012-11-19 10:32:28 -05:00
ca . configure_instance ( host_name , domain_name , dm_password ,
2014-08-06 09:43:19 +02:00
dm_password , subject_base = options . subject ,
ca_signing_algorithm = options . ca_signing_algorithm )
2009-09-10 16:15:14 -04:00
elif external == 1 :
2011-06-10 15:28:46 -04:00
# stage 1 of external CA installation
2010-04-01 17:20:38 -04:00
options . realm_name = realm_name
options . domain_name = domain_name
options . master_password = master_password
2011-01-26 10:53:02 -05:00
options . dm_password = dm_password
options . admin_password = admin_password
2011-07-26 13:21:36 +02:00
options . host_name = host_name
2010-04-01 17:20:38 -04:00
options . unattended = True
2011-07-26 13:21:36 +02:00
options . forwarders = dns_forwarders
2014-08-27 13:50:21 +02:00
options . reverse_zones = reverse_zones
2011-11-03 11:08:26 +01:00
write_cache ( vars ( options ))
2012-11-19 10:32:28 -05:00
ca . configure_instance ( host_name , domain_name , dm_password ,
2014-06-17 11:45:43 +02:00
dm_password , csr_file = paths . ROOT_IPA_CSR ,
2014-08-06 09:43:19 +02:00
subject_base = options . subject ,
ca_signing_algorithm = options . ca_signing_algorithm )
2009-09-10 16:15:14 -04:00
else :
2011-06-10 15:28:46 -04:00
# stage 2 of external CA installation
2012-11-19 10:32:28 -05:00
ca . configure_instance ( host_name , domain_name , dm_password ,
dm_password ,
2014-09-24 16:31:39 +02:00
cert_file = external_cert_file . name ,
cert_chain_file = external_ca_file . name ,
2014-08-06 09:43:19 +02:00
subject_base = options . subject ,
ca_signing_algorithm = options . ca_signing_algorithm )
2009-09-10 16:15:14 -04:00
2013-03-08 15:13:19 +01:00
# Now put the CA cert where other instances exepct it
2013-09-11 08:27:34 +00:00
ca . publish_ca_cert ( CACERT )
2013-10-15 12:23:47 +00:00
else :
# Put the CA cert where other instances expect it
2014-08-05 09:06:39 +02:00
x509 . write_certificate ( http_ca_cert , CACERT )
2013-10-15 12:23:47 +00:00
os . chmod ( CACERT , 0444 )
2010-12-10 14:53:06 -05:00
2012-09-19 23:35:42 -04:00
# we now need to enable ssl on the ds
ds . enable_ssl ()
2013-03-08 15:13:19 +01:00
if setup_ca :
2013-03-14 13:58:27 +01:00
# We need to ldap_enable the CA now that DS is up and running
2010-12-10 14:53:06 -05:00
ca . ldap_enable ( 'CA' , host_name , dm_password ,
2013-10-16 08:51:06 +00:00
ipautil . realm_to_suffix ( realm_name ), [ 'caRenewalMaster' ])
2013-08-01 14:47:52 +02:00
# This is done within stopped_service context, which restarts CA
2014-03-18 11:23:30 -04:00
ca . enable_client_auth_to_db ( ca . dogtag_constants . CS_CFG_PATH )
2011-03-10 00:06:15 -05:00
2009-02-02 13:50:53 -05:00
krb = krbinstance . KrbInstance ( fstore )
2014-09-24 16:41:47 +02:00
if options . pkinit_cert_files :
2011-01-28 15:45:19 -05:00
krb . create_instance ( realm_name , host_name , domain_name ,
2010-10-29 16:23:21 -04:00
dm_password , master_password ,
setup_pkinit = options . setup_pkinit ,
2013-03-08 14:37:38 +01:00
pkcs12_info = pkinit_pkcs12_info ,
2010-10-29 16:23:21 -04:00
subject_base = options . subject )
else :
2011-01-28 15:45:19 -05:00
krb . create_instance ( realm_name , host_name , domain_name ,
2010-10-29 16:23:21 -04:00
dm_password , master_password ,
setup_pkinit = options . setup_pkinit ,
subject_base = options . subject )
2009-12-07 23:17:00 -05:00
# The DS instance is created before the keytab, add the SSL cert we
# generated
ds . add_cert_to_service ()
2012-02-06 13:15:06 -05:00
memcache = memcacheinstance . MemcacheInstance ()
2013-06-05 15:48:35 +02:00
memcache . create_instance ( 'MEMCACHE' , host_name , dm_password ,
ipautil . realm_to_suffix ( realm_name ))
2012-02-06 13:15:06 -05:00
2013-06-05 15:48:35 +02:00
otpd = otpdinstance . OtpdInstance ()
otpd . create_instance ( 'OTPD' , host_name , dm_password ,
ipautil . realm_to_suffix ( realm_name ))
# Create a HTTP instance
2009-02-02 13:50:53 -05:00
http = httpinstance . HTTPInstance ( fstore )
2014-09-24 16:41:47 +02:00
if options . http_cert_files :
2013-03-08 14:37:38 +01:00
http . create_instance (
2013-06-25 16:53:24 +02:00
realm_name , host_name , domain_name , dm_password ,
2013-03-08 14:37:38 +01:00
pkcs12_info = http_pkcs12_info , subject_base = options . subject ,
2014-09-24 16:41:47 +02:00
auto_redirect = options . ui_redirect )
2008-07-11 11:34:29 -04:00
else :
2013-03-08 15:13:19 +01:00
http . create_instance (
2013-06-25 16:53:24 +02:00
realm_name , host_name , domain_name , dm_password ,
2013-03-08 15:13:19 +01:00
subject_base = options . subject , auto_redirect = options . ui_redirect )
2014-06-17 11:45:43 +02:00
tasks . restore_context ( paths . CACHE_IPA_SESSIONS )
2014-07-03 11:59:00 +02:00
# Export full CA chain
ca_db = certs . CertDB ( realm_name )
os . chmod ( CACERT , 0644 )
ca_db . publish_ca_cert ( CACERT )
2012-04-18 11:22:35 -04:00
set_subject_in_config ( realm_name , dm_password , ipautil . realm_to_suffix ( realm_name ), options . subject )
2010-01-20 11:26:20 -05:00
2008-09-15 18:15:12 -04:00
# Apply any LDAP updates. Needs to be done after the configuration file
# is created
service . print_msg ( "Applying LDAP updates" )
ds . apply_updates ()
2007-09-20 15:10:21 -04:00
# Restart ds and krb after configurations have been changed
2011-02-02 16:24:30 +01:00
service . print_msg ( "Restarting the directory server" )
2007-06-28 19:09:54 -04:00
ds . restart ()
2008-02-20 10:16:19 -05:00
2011-02-02 16:24:30 +01:00
service . print_msg ( "Restarting the KDC" )
2007-09-20 15:10:21 -04:00
krb . restart ()
2007-06-28 19:09:54 -04:00
2014-03-13 08:25:11 +01:00
if setup_ca :
service . print_msg ( "Restarting the certificate server" )
ca . restart ( dogtag . configured_constants () . PKI_INSTANCE_NAME )
2009-09-02 12:24:17 +02:00
# Create a BIND instance
bind = bindinstance . BindInstance ( fstore , dm_password )
2014-08-27 13:50:21 +02:00
bind . setup ( host_name , ip_addresses , realm_name , domain_name , dns_forwarders ,
options . conf_ntp , reverse_zones , zonemgr = options . zonemgr ,
2013-03-08 15:13:19 +01:00
ca_configured = setup_ca )
2009-09-02 12:24:17 +02:00
if options . setup_dns :
2012-05-13 07:36:35 -04:00
api . Backend . ldap2 . connect ( bind_dn = DN (( 'cn' , 'Directory Manager' )), bind_pw = dm_password )
2009-09-02 16:22:50 +02:00
2009-09-02 12:24:17 +02:00
bind . create_instance ()
2012-03-15 13:51:59 +01:00
print ""
bind . check_global_configuration ()
print ""
2009-09-02 12:24:17 +02:00
else :
bind . create_sample_bind_zone ()
2012-03-06 13:26:45 +01:00
# Restart httpd to pick up the new IPA configuration
service . print_msg ( "Restarting the web server" )
http . restart ()
2014-03-18 11:23:30 -04:00
if setup_kra :
kra = krainstance . KRAInstance ( realm_name ,
dogtag_constants = dogtag . install_constants )
kra . configure_instance ( host_name , domain_name , dm_password ,
dm_password , subject_base = options . subject )
# This is done within stopped_service context, which restarts KRA
service . print_msg ( "Restarting the directory server" )
ds . restart ()
service . print_msg ( "Enabling KRA to authenticate with the database "
"using client certificates" )
kra . enable_client_auth_to_db ( kra . dogtag_constants . KRA_CS_CFG_PATH )
2007-08-31 18:40:01 -04:00
# Set the admin user kerberos password
ds . change_admin_password ( admin_password )
2008-02-20 10:16:19 -05:00
# Call client install script
try :
2014-06-17 11:45:43 +02:00
args = [ paths . IPA_CLIENT_INSTALL , "--on-master" , "--unattended" , "--domain" , domain_name , "--server" , host_name , "--realm" , realm_name , "--hostname" , host_name ]
2011-12-07 03:40:51 -05:00
if not options . create_sshfp :
args . append ( "--no-dns-sshfp" )
2011-12-07 03:49:09 -05:00
if options . trust_sshfp :
args . append ( "--ssh-trust-dns" )
2012-09-12 09:19:26 -04:00
if not options . conf_ssh :
args . append ( "--no-ssh" )
2011-12-07 03:49:09 -05:00
if not options . conf_sshd :
args . append ( "--no-sshd" )
2013-03-27 13:48:01 +01:00
if options . mkhomedir :
args . append ( "--mkhomedir" )
2011-12-07 03:40:51 -05:00
run ( args )
2008-02-20 10:16:19 -05:00
except Exception , e :
2010-11-08 23:13:48 +01:00
sys . exit ( "Configuration of client side components failed! \n ipa-client-install returned: " + str ( e ))
2008-02-20 10:16:19 -05:00
2010-12-04 15:42:14 -05:00
#Everything installed properly, activate ipa service.
2014-05-29 10:37:18 +02:00
services . knownservices . ipa . enable ()
2010-12-04 15:42:14 -05:00
print "=============================================================================="
print "Setup complete"
print ""
print "Next steps:"
2008-06-06 15:25:36 -04:00
print " \t 1. You must make sure these network ports are open:"
print " \t\t TCP Ports:"
2008-01-25 17:08:36 -05:00
print " \t\t * 80, 443: HTTP/HTTPS"
print " \t\t * 389, 636: LDAP/LDAPS"
print " \t\t * 88, 464: kerberos"
2009-06-25 14:42:08 +02:00
if options . setup_dns :
2008-06-06 15:25:36 -04:00
print " \t\t * 53: bind"
print " \t\t UDP Ports:"
print " \t\t * 88, 464: kerberos"
2009-06-25 14:42:08 +02:00
if options . setup_dns :
2008-06-06 15:25:36 -04:00
print " \t\t * 53: bind"
if options . conf_ntp :
print " \t\t * 123: ntp"
print ""
2008-02-05 12:23:53 -05:00
print " \t 2. You can now obtain a kerberos ticket using the command: 'kinit admin'"
2010-02-03 14:47:51 -05:00
print " \t This ticket will allow you to use the IPA tools (e.g., ipa user-add)"
print " \t and the web user interface."
2014-05-29 10:37:18 +02:00
if not services . knownservices . ntpd . is_running ():
print " \t 3. Kerberos requires time synchronization between clients"
print " \t and servers for correct operation. You should consider enabling ntpd."
2008-02-05 12:23:53 -05:00
print ""
2013-03-08 15:13:19 +01:00
if setup_ca :
2014-03-18 11:23:30 -04:00
print "Be sure to back up the CA certificates stored in " + paths . CACERT_P12
if setup_kra :
print "and the KRA certificates stored in " + paths . KRACERT_P12
print "These files are required to create replicas. The password for these"
print "files is the Directory Manager password"
2013-03-08 15:13:19 +01:00
else :
2008-07-11 11:34:29 -04:00
print "In order for Firefox autoconfiguration to work you will need to"
print "use a SSL signing certificate. See the IPA documentation for more details."
2011-01-26 10:53:02 -05:00
if ipautil . file_exists ( ANSWER_CACHE ):
os . remove ( ANSWER_CACHE )
return 0
2012-05-31 14:34:09 +02:00
if __name__ == '__main__' :
success = False
2013-06-03 12:06:06 +02:00
2008-07-11 11:34:29 -04:00
try :
2012-05-31 14:34:09 +02:00
# FIXME: Common option parsing, logging setup, etc should be factored
# out from all install scripts
safe_options , options = parse_options ()
if options . uninstall :
2014-06-17 11:45:43 +02:00
log_file_name = paths . IPASERVER_UNINSTALL_LOG
2010-04-27 17:51:13 -04:00
else :
2014-06-17 11:45:43 +02:00
log_file_name = paths . IPASERVER_INSTALL_LOG
2011-11-29 09:10:31 +01:00
2013-06-03 12:06:06 +02:00
# Use private ccache
with private_ccache ():
installutils . run_script ( main , log_file_name = log_file_name ,
operation_name = 'ipa-server-install' )
2012-05-31 14:34:09 +02:00
success = True
finally :
if not success and installation_cleanup :
# Do a cautious clean up as we don't know what failed and what is
# the state of the environment
try :
2014-06-17 11:45:43 +02:00
fstore . restore_file ( paths . HOSTS )
2012-05-31 14:34:09 +02:00
except :
pass