mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Add interactive prompts to ipa-server-install
Change unattended flag to be -U Change master password flag to be -P instead of -m Improve ipa-client-install readability for user prompts
This commit is contained in:
@@ -37,7 +37,7 @@ def parse_options():
|
|||||||
parser.add_option("--realm", dest="realm_name", help="realm name")
|
parser.add_option("--realm", dest="realm_name", help="realm name")
|
||||||
parser.add_option("-d", "--debug", dest="debug", action="store_true",
|
parser.add_option("-d", "--debug", dest="debug", action="store_true",
|
||||||
dest="debug", default=False, help="print debugging information")
|
dest="debug", default=False, help="print debugging information")
|
||||||
parser.add_option("-u", "--unattended", dest="unattended",
|
parser.add_option("-U", "--unattended", dest="unattended",
|
||||||
help="unattended installation never prompts the user")
|
help="unattended installation never prompts the user")
|
||||||
|
|
||||||
options, args = parser.parse_args()
|
options, args = parser.parse_args()
|
||||||
@@ -83,7 +83,7 @@ def main():
|
|||||||
return ret
|
return ret
|
||||||
else:
|
else:
|
||||||
print "Failed to determine your DNS domain (DNS misconfigured?)"
|
print "Failed to determine your DNS domain (DNS misconfigured?)"
|
||||||
dom = raw_input("Please provide your domain name (ex: example.com):")
|
dom = raw_input("Please provide your domain name (ex: example.com): ")
|
||||||
ret = ds.search(domain=dom)
|
ret = ds.search(domain=dom)
|
||||||
if ret == -2:
|
if ret == -2:
|
||||||
logging.debug("IPA Server not found")
|
logging.debug("IPA Server not found")
|
||||||
@@ -93,7 +93,7 @@ def main():
|
|||||||
return ret
|
return ret
|
||||||
else:
|
else:
|
||||||
print "Failed to find the IPA Server (DNS misconfigured?)"
|
print "Failed to find the IPA Server (DNS misconfigured?)"
|
||||||
srv = raw_input("Please provide your server name (ex: ipa.example.com):")
|
srv = raw_input("Please provide your server name (ex: ipa.example.com): ")
|
||||||
ret = ds.search(domain=dom, server=srv)
|
ret = ds.search(domain=dom, server=srv)
|
||||||
if ret != 0:
|
if ret != 0:
|
||||||
print "Failed to verify that "+srv+" is an IPA Server, aborting!"
|
print "Failed to verify that "+srv+" is an IPA Server, aborting!"
|
||||||
|
|||||||
@@ -42,18 +42,23 @@ def parse_options():
|
|||||||
help="ds user")
|
help="ds user")
|
||||||
parser.add_option("-r", "--realm", dest="realm_name",
|
parser.add_option("-r", "--realm", dest="realm_name",
|
||||||
help="realm name")
|
help="realm name")
|
||||||
parser.add_option("-p", "--password", dest="password",
|
parser.add_option("-p", "--ds-password", dest="ds_password",
|
||||||
help="admin password")
|
help="admin password")
|
||||||
parser.add_option("-m", "--master-password", dest="master_password",
|
parser.add_option("-P", "--master-password", dest="master_password",
|
||||||
help="kerberos master password")
|
help="kerberos master password")
|
||||||
parser.add_option("-d", "--debug", dest="debug", action="store_true",
|
parser.add_option("-d", "--debug", dest="debug", action="store_true",
|
||||||
dest="debug", default=False, help="print debugging information")
|
dest="debug", default=False, help="print debugging information")
|
||||||
parser.add_option("--hostname", dest="host_name", help="fully qualified name of server")
|
parser.add_option("--hostname", dest="host_name", help="fully qualified name of server")
|
||||||
|
parser.add_option("-U", "--unattended", dest="unattended",
|
||||||
|
help="unattended installation never prompts the user")
|
||||||
|
|
||||||
options, args = parser.parse_args()
|
options, args = parser.parse_args()
|
||||||
|
|
||||||
if not options.ds_user or not options.realm_name or not options.password or not options.master_password:
|
if options.unattended and (not options.ds_user or
|
||||||
parser.error("error: all options are required")
|
not options.realm_name or
|
||||||
|
not options.ds_password or
|
||||||
|
not options.master_password):
|
||||||
|
parser.error("error: In unattended mode you need to provide -u, -r, -p and -P options")
|
||||||
|
|
||||||
return options
|
return options
|
||||||
|
|
||||||
@@ -76,10 +81,22 @@ def logging_setup(options):
|
|||||||
console.setFormatter(formatter)
|
console.setFormatter(formatter)
|
||||||
logging.getLogger('').addHandler(console)
|
logging.getLogger('').addHandler(console)
|
||||||
|
|
||||||
|
def setup_hosts(host, ip):
|
||||||
|
print ""
|
||||||
|
print "TODO"
|
||||||
|
print ""
|
||||||
|
print ""
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
options = parse_options()
|
options = parse_options()
|
||||||
logging_setup(options)
|
logging_setup(options)
|
||||||
|
|
||||||
|
ds_user = ""
|
||||||
|
realm_name = ""
|
||||||
|
host_name = ""
|
||||||
|
master_password = ""
|
||||||
|
ds_password = ""
|
||||||
|
|
||||||
# check the hostname is correctly configured, it must be as the kldap
|
# check the hostname is correctly configured, it must be as the kldap
|
||||||
# utilities just use the hostname as returned by gethostbyname to set
|
# utilities just use the hostname as returned by gethostbyname to set
|
||||||
# up some of the standard entries
|
# up some of the standard entries
|
||||||
@@ -93,25 +110,102 @@ def main():
|
|||||||
print "Check the /etc/hosts file and make sure to have a valid FQDN"
|
print "Check the /etc/hosts file and make sure to have a valid FQDN"
|
||||||
return "-Fatal Error-"
|
return "-Fatal Error-"
|
||||||
|
|
||||||
if socket.gethostbyname(host_name) == "127.0.0.1":
|
ip = socket.gethostbyname(host_name)
|
||||||
|
if ip == "127.0.0.1":
|
||||||
print "The hostname resolves to the localhost address (127.0.0.1)"
|
print "The hostname resolves to the localhost address (127.0.0.1)"
|
||||||
print "Please change your /etc/hosts file or your DNS so that the"
|
print "Please change your /etc/hosts file or your DNS so that the"
|
||||||
print "hostname resolves to the ip address of your network interface."
|
print "hostname resolves to the ip address of your network interface."
|
||||||
print "The KDC service does not listen on 127.0.0.1"
|
print "The KDC service does not listen on 127.0.0.1"
|
||||||
return "-Fatal Error-"
|
print ""
|
||||||
|
if not options.unattended:
|
||||||
|
change_hosts = raw_input("Do you want to change the /etc/hosts file ? [y/N] ")
|
||||||
|
print ""
|
||||||
|
if change_hosts.lower() == "y":
|
||||||
|
ip = raw_input("What is the netowrk IP address used by this server ? ")
|
||||||
|
print ""
|
||||||
|
if (ip.find(".") == -1):
|
||||||
|
print "["+ip+"] is an invalid IP address"
|
||||||
|
return "-Fatal Error-"
|
||||||
|
setup_hosts(host_name, ip)
|
||||||
|
else:
|
||||||
|
print "Please fix your /etc/hosts file and restart the setup program"
|
||||||
|
print "-Aborted-"
|
||||||
|
else:
|
||||||
|
return "-Fatal Error-"
|
||||||
|
|
||||||
print "The Final KDC Host Name will be: " + host_name
|
print "The Final KDC Host Name will be: " + host_name + ". With IP address: " + ip
|
||||||
|
print ""
|
||||||
|
|
||||||
|
if not options.ds_user:
|
||||||
|
print "To securely run Directory Server we need a user account to be set up."
|
||||||
|
print "This will allow DS to run as a user and not as root."
|
||||||
|
print "The user account will have access to some security material so it should not be shared with any other application."
|
||||||
|
print "A good user account name could be 'ds' or 'dirsrv', if it does not exist it will be created as part of the installation procedure."
|
||||||
|
print ""
|
||||||
|
ds_user = raw_input("Which account name do you want to use for the DS instance ? ")
|
||||||
|
print ""
|
||||||
|
if ds_user == "":
|
||||||
|
return "-Aborted-"
|
||||||
|
else:
|
||||||
|
ds_user = options.ds_user
|
||||||
|
|
||||||
|
if not options.realm_name:
|
||||||
|
print "The kerberos protocol requires a Realm name to be defined."
|
||||||
|
print "Usually the domain name all in uppercase is used as realm name."
|
||||||
|
print ""
|
||||||
|
upper_dom = (host_name[host_name.find(".")+1:]).upper()
|
||||||
|
dom_realm = raw_input("Do you want to use ["+upper_dom+"] as the realm name ? [y/N] ")
|
||||||
|
print ""
|
||||||
|
if dom_realm.lower() == "y":
|
||||||
|
realm_name = upper_dom
|
||||||
|
else:
|
||||||
|
realm_name = raw_input("Please provide a realm name: ")
|
||||||
|
print ""
|
||||||
|
if realm_name == "":
|
||||||
|
return "-Aborted-"
|
||||||
|
upper_dom = realm_name.upper()
|
||||||
|
if upper_dom != realm_name:
|
||||||
|
print "It is strongly adviced to use a completely uppercased name for the realm."
|
||||||
|
dom_realm = raw_input("Do you want to use "+upper_dom+" as realm name ? [Y/n] ")
|
||||||
|
print ""
|
||||||
|
if dom_realm.lower() != "y":
|
||||||
|
print "WARNING: Using a non upper-cased realm name may cause unexpected problems."
|
||||||
|
else:
|
||||||
|
realm_name = upper_dom
|
||||||
|
if realm_name == "":
|
||||||
|
print "-Aborted-"
|
||||||
|
else:
|
||||||
|
realm_name = options.realm_name
|
||||||
|
|
||||||
|
if not options.ds_password:
|
||||||
|
print "The Directory Manager user is the equivalent of 'root' for Diretcory Server."
|
||||||
|
print ""
|
||||||
|
#TODO: provide the option of generating a random password
|
||||||
|
ds_password = raw_input("Please provide a password for the Directory Manager: ")
|
||||||
|
print ""
|
||||||
|
else:
|
||||||
|
ds_password = options.ds_password
|
||||||
|
|
||||||
|
if not options.master_password:
|
||||||
|
print "The Kerberos database is usually encrypted using a master password."
|
||||||
|
print "Please store this password offline in a secure place."
|
||||||
|
print "It may be necessary in a recovery situation or to install a replica."
|
||||||
|
print "Without the master password the encrypted material can't be used by the KDC."
|
||||||
|
print "If the master password gets lost all kerberos related secrets will be lost."
|
||||||
|
print ""
|
||||||
|
#TODO: provide the option of generating a random password
|
||||||
|
master_password = raw_input("Please provide a master password: ")
|
||||||
|
print ""
|
||||||
|
else:
|
||||||
|
master_password = options.master_password
|
||||||
|
|
||||||
# Create a directory server instance
|
# Create a directory server instance
|
||||||
ds = ipaserver.dsinstance.DsInstance()
|
ds = ipaserver.dsinstance.DsInstance()
|
||||||
ds.create_instance(options.ds_user, options.realm_name, host_name,
|
ds.create_instance(ds_user, realm_name, host_name, ds_password)
|
||||||
options.password)
|
|
||||||
|
|
||||||
# Create a kerberos instance
|
# Create a kerberos instance
|
||||||
krb = ipaserver.krbinstance.KrbInstance()
|
krb = ipaserver.krbinstance.KrbInstance()
|
||||||
krb.create_instance(options.ds_user, options.realm_name, host_name,
|
krb.create_instance(ds_user, realm_name, host_name, ds_password, master_password)
|
||||||
options.password, options.master_password)
|
|
||||||
|
|
||||||
# Restart ds after the krb instance has changed ds configurations
|
# Restart ds after the krb instance has changed ds configurations
|
||||||
ds.restart()
|
ds.restart()
|
||||||
@@ -138,7 +232,7 @@ def main():
|
|||||||
fd = open("/etc/ipa/ipa.conf", "w")
|
fd = open("/etc/ipa/ipa.conf", "w")
|
||||||
fd.write("[defaults]\n")
|
fd.write("[defaults]\n")
|
||||||
fd.write("server=" + host_name + "\n")
|
fd.write("server=" + host_name + "\n")
|
||||||
fd.write("realm=" + options.realm_name + "\n")
|
fd.write("realm=" + realm_name + "\n")
|
||||||
fd.close()
|
fd.close()
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Reference in New Issue
Block a user