summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipa-admintools/ipa-addgroup17
-rw-r--r--ipa-admintools/ipa-adduser50
-rw-r--r--ipa-admintools/ipa-moduser55
-rw-r--r--ipa-client/ipa-install/ipa-client-install23
-rw-r--r--ipa-python/ipautil.py66
-rw-r--r--ipa-radius-server/ipa-radius-install3
-rw-r--r--ipa-server/ipa-install/ipa-replica-install10
-rw-r--r--ipa-server/ipa-install/ipa-server-certinstall19
-rw-r--r--ipa-server/ipa-install/ipa-server-install64
9 files changed, 118 insertions, 189 deletions
diff --git a/ipa-admintools/ipa-addgroup b/ipa-admintools/ipa-addgroup
index caf4e93dc..cc813836c 100644
--- a/ipa-admintools/ipa-addgroup
+++ b/ipa-admintools/ipa-addgroup
@@ -81,29 +81,16 @@ def main():
if options.usage:
usage()
- cont = False
-
if (len(args) != 2):
- while (cont != True):
- cn = raw_input("Group name: ")
- if (ipavalidate.String(cn, notEmpty=True)):
- print "Please enter a value"
- else:
- cont = True
+ cn = ipautil.user_input("Group name", allow_empty = False)
else:
cn = args[1]
if (ipavalidate.String(cn, notEmpty=True)):
print "Please enter a value"
return 1
- cont = False
if not options.desc:
- while (cont != True):
- desc = raw_input("Description: ")
- if (ipavalidate.String(desc, notEmpty=True)):
- print "Please enter a value"
- else:
- cont = True
+ desc = ipautil.user_input("Description", allow_empty = False)
else:
desc = options.desc
if (ipavalidate.String(desc, notEmpty=True)):
diff --git a/ipa-admintools/ipa-adduser b/ipa-admintools/ipa-adduser
index 2c32d1e58..17c75edf8 100644
--- a/ipa-admintools/ipa-adduser
+++ b/ipa-admintools/ipa-adduser
@@ -102,7 +102,6 @@ def main():
groups = ""
match = False
- cont = False
all_interactive = False
@@ -116,40 +115,23 @@ def main():
all_interactive = True
if not options.gn:
- while (cont != True):
- givenname = raw_input("First name: ")
- if (ipavalidate.String(givenname, notEmpty=True)):
- print "Please enter a value"
- else:
- cont = True
+ givenname = ipautil.user_input("First name", allow_empty = False)
else:
givenname = options.gn
if (ipavalidate.String(givenname, notEmpty=True)):
print "Please enter a value"
return 1
- cont = False
if not options.sn:
- while (cont != True):
- lastname = raw_input("Last name: ")
- if (ipavalidate.String(lastname, notEmpty=True)):
- print "Please enter a value"
- else:
- cont = True
+ lastname = ipautil.user_input("Last name", allow_empty = False)
else:
lastname = options.sn
if (ipavalidate.String(lastname, notEmpty=True)):
print "Please enter a value"
return 1
- cont = False
if (len(args) != 2):
- while (cont != True):
- username = raw_input("Login name: ")
- if (ipavalidate.Plain(username, notEmpty=True, allowSpaces=False)):
- print "Please enter a value"
- else:
- cont = True
+ username = ipautil.user_input_plain("Login name", allow_empty = False, allow_spaces = False)
else:
username = args[1]
if (ipavalidate.Plain(username, notEmpty=True, allowSpaces=False)):
@@ -180,32 +162,12 @@ def main():
# Ask the questions we don't normally force. We don't require answers
# for these.
if all_interactive is True:
- cont = False
if not options.gecos:
- while (cont != True):
- gecos = raw_input("gecos []: ")
- if (ipavalidate.String(gecos, notEmpty=False)):
- print "Please enter a value"
- else:
- cont = True
- cont = False
+ gecos = ipautil.user_input("gecos")
if not options.directory:
- while (cont != True):
- directory = raw_input("home directory [/home/"+username+"]: ")
- if directory == "":
- directory = "/home/"+username
- if (ipavalidate.Path(directory, notEmpty=False)):
- print "Please enter a value"
- else:
- cont = True
- cont = False
+ directory = ipautil.user_input_path("Home directory", "/home/" + username, allow_empty = True)
if not options.shell:
- while (cont != True):
- shell = raw_input("shell [/bin/sh]: ")
-
- if len(shell) < 1:
- shell = None
- cont = True
+ shell = ipautil.user_input("Shell", "/bin/sh", allow_empty = False)
else:
gecos = options.gecos
diff --git a/ipa-admintools/ipa-moduser b/ipa-admintools/ipa-moduser
index 22f231893..4b3bd5c9c 100644
--- a/ipa-admintools/ipa-moduser
+++ b/ipa-admintools/ipa-moduser
@@ -97,7 +97,6 @@ def main():
shell = ""
match = False
- cont = False
options, args = parse_options()
@@ -141,46 +140,23 @@ def main():
shell = options.shell
else:
if not options.gn:
- while (cont != True):
- givenname = raw_input("First name: [%s] " % user.getValue('givenname'))
- if (ipavalidate.String(givenname, notEmpty=False)):
- print "Please enter a value"
- else:
- cont = True
- if len(givenname) < 1:
- givenname = None
- cont = True
+ givenname = ipautil.user_input("First name", user.getValue('givenname'), allow_empty = False)
else:
givenname = options.gn
if (ipavalidate.String(givenname, notEmpty=True)):
print "Please enter a value"
return 1
- cont = False
if not options.sn:
- while (cont != True):
- lastname = raw_input(" Last name: [%s] " % user.getValue('sn'))
- if (ipavalidate.String(lastname, notEmpty=False)):
- print "Please enter a value"
- else:
- cont = True
- if len(lastname) < 1:
- lastname = None
- cont = True
+ lastname = ipautil.user_input("Last name", user.getValue('sn'), allow_empty = False)
else:
lastname = options.sn
if (ipavalidate.String(lastname, notEmpty=True)):
print "Please enter a value"
return 1
- cont = False
if not options.mail:
- while (cont != True):
- mail = raw_input("E-mail addr: [%s]" % user.getValue('mail'))
- if (ipavalidate.Email(mail, notEmpty=False)):
- print "E-mail must include a user and domain name"
- else:
- cont = True
+ mail = ipautil.user_input_email("E-mail address", user.getValue('mail'), allow_empty = True)
else:
mail = options.mail
if (ipavalidate.Email(mail)):
@@ -189,32 +165,13 @@ def main():
# Ask the questions we don't normally force. We don't require answers
# for these.
- cont = False
if not options.gecos:
- while (cont != True):
- gecos = raw_input("gecos: [%s] " % user.getValue('gecos'))
- if (ipavalidate.String(gecos, notEmpty=False)):
- print "Please enter a value"
- else:
- cont = True
+ gecos = ipautil.user_input("gecos", user.getValue('gecos'))
- cont = False
if not options.directory:
- while (cont != True):
- directory = raw_input("home directory: [%s] " % user.getValue('homeDirectory'))
- if (ipavalidate.Path(gecos, notEmpty=False)):
- print "Valid path is required"
- else:
- cont = True
- cont = False
+ directory = ipautil.user_input_path("Home directory", user.getValue('homeDirectory'))
if not options.shell:
- while (cont != True):
- shell = raw_input("shell: [%s] " % user.getValue('loginshell'))
-
- if len(shell) < 1:
- shell = None
- cont = True
- cont = False
+ shell = ipautil.user_input("Shell", user.getValue('loginshell'), allow_empty = False)
if givenname:
user.setValue('givenname', givenname)
diff --git a/ipa-client/ipa-install/ipa-client-install b/ipa-client/ipa-install/ipa-client-install
index ecdf92740..eec36e4e3 100644
--- a/ipa-client/ipa-install/ipa-client-install
+++ b/ipa-client/ipa-install/ipa-client-install
@@ -30,7 +30,7 @@ try:
import ipaclient.ipadiscovery
import ipaclient.ipachangeconf
import ipaclient.ntpconf
- from ipa.ipautil import run
+ from ipa.ipautil import run, user_input
from ipa import sysrestore
from ipa import version
except ImportError:
@@ -70,13 +70,6 @@ def parse_options():
return options
-def ask_for_confirmation(message):
- yesno = raw_input(message + " [y/N]: ")
- if not yesno or yesno.lower()[0] != "y":
- return False
- print "\n"
- return True
-
def logging_setup(options):
# Always log everything (i.e., DEBUG) to the log
# file.
@@ -124,7 +117,7 @@ def uninstall(options):
print "The original nsswitch.conf configuration has been restored."
print "You may need to restart services or reboot the machine."
if not options.on_master:
- if ask_for_confirmation("Do you want to reboot the machine?"):
+ if user_input("Do you want to reboot the machine?", False):
try:
run(["/usr/bin/reboot"])
except Exception, e:
@@ -163,9 +156,7 @@ def main():
return ret
else:
print "DNS discovery failed to determine your DNS domain"
- cli_domain = ""
- while cli_domain == "":
- cli_domain = raw_input("Please provide the domain name of your IPA server (ex: example.com): ")
+ cli_domain = user_input("Please provide the domain name of your IPA server (ex: example.com)", allow_empty = False)
ret = ds.search(domain=cli_domain, server=options.server)
if not cli_domain:
if ds.getDomainName():
@@ -180,9 +171,7 @@ def main():
return ret
else:
print "DNS discovery failed to find the IPA Server"
- cli_server = ""
- while cli_server == "":
- cli_server = raw_input("Please provide your IPA server name (ex: ipa.example.com): ")
+ cli_server = user_input("Please provide your IPA server name (ex: ipa.example.com)", allow_empty = False)
ret = ds.search(domain=cli_domain, server=cli_server)
if not cli_server:
if ds.getServerName():
@@ -203,7 +192,7 @@ def main():
print "If you proceed with the installation, services will be configured to always"
print "access the discovered server for all operation and will not fail over to"
print "other servers in case of failure.\n"
- if not ask_for_confirmation("Do you want to proceed and configure the system with fixed values with no DNS discovery?"):
+ if not user_input("Do you want to proceed and configure the system with fixed values with no DNS discovery?", False):
return ret
if options.realm_name and options.realm_name != ds.getRealmName():
@@ -220,7 +209,7 @@ def main():
print "BaseDN: "+cli_basedn
print "\n"
- if not options.unattended and not ask_for_confirmation("Continue to configure the system with these values?"):
+ if not options.unattended and not user_input("Continue to configure the system with these values?", False):
return 1
# Configure ipa.conf
diff --git a/ipa-python/ipautil.py b/ipa-python/ipautil.py
index 4e065fc4b..3526cc7a8 100644
--- a/ipa-python/ipautil.py
+++ b/ipa-python/ipautil.py
@@ -29,6 +29,7 @@ import os, sys, traceback, readline
import stat
import shutil
+from ipa import ipavalidate
from types import *
import re
@@ -482,6 +483,71 @@ def read_items_file(filename):
if fd != sys.stdin: fd.close()
return items
+def user_input(prompt, default = None, allow_empty = True):
+ if default == None:
+ while True:
+ ret = raw_input("%s: " % prompt)
+ if allow_empty or ret.strip():
+ return ret
+
+ if isinstance(default, basestring):
+ while True:
+ ret = raw_input("%s [%s]: " % (prompt, default))
+ if not ret and (allow_empty or default):
+ return default
+ elif ret.strip():
+ return ret
+ if isinstance(default, bool):
+ if default:
+ choice = "yes"
+ else:
+ choice = "no"
+ while True:
+ ret = raw_input("%s [%s]: " % (prompt, choice))
+ if not ret:
+ return default
+ elif ret.lower()[0] == "y":
+ return True
+ elif ret.lower()[0] == "n":
+ return False
+ if isinstance(default, int):
+ while True:
+ try:
+ ret = raw_input("%s [%s]: " % (prompt, default))
+ if not ret:
+ return default
+ ret = int(ret)
+ except ValueError:
+ pass
+ else:
+ return ret
+
+def user_input_email(prompt, default = None, allow_empty = False):
+ if default != None and allow_empty:
+ prompt += " (enter \"none\" for empty)"
+ while True:
+ ret = user_input(prompt, default, allow_empty)
+ if allow_empty and ret.lower() == "none":
+ return ""
+ if not ipavalidate.Email(ret, not allow_empty):
+ return ret.strip()
+
+def user_input_plain(prompt, default = None, allow_empty = True, allow_spaces = True):
+ while True:
+ ret = user_input(prompt, default, allow_empty)
+ if not ipavalidate.Plain(ret, not allow_empty, allow_spaces):
+ return ret
+
+def user_input_path(prompt, default = None, allow_empty = True):
+ if default != None and allow_empty:
+ prompt += " (enter \"none\" for empty)"
+ while True:
+ ret = user_input(prompt, default, allow_empty)
+ if allow_empty and ret.lower() == "none":
+ return ""
+ if not ipavalidate.Path(ret, not allow_empty):
+ return ret
+
class AttributeValueCompleter:
'''
diff --git a/ipa-radius-server/ipa-radius-install b/ipa-radius-server/ipa-radius-install
index 8ed3aabb6..83215b3b3 100644
--- a/ipa-radius-server/ipa-radius-install
+++ b/ipa-radius-server/ipa-radius-install
@@ -45,8 +45,7 @@ def main():
if not ipautil.file_exists("/etc/ipa/ipa.conf"):
print "This system does not appear to have IPA configured."
print "Has ipa-server-install been run?"
- yesno = raw_input("Continue with radius install [y/N]? ")
- if yesno.lower() != "y":
+ if not ipautil.user_input("Continue with radius install?", False)
sys.exit(1)
installutils.standard_logging_setup("iparadius-install.log", False)
diff --git a/ipa-server/ipa-install/ipa-replica-install b/ipa-server/ipa-install/ipa-replica-install
index 31fd4ccd6..ab66a8382 100644
--- a/ipa-server/ipa-install/ipa-replica-install
+++ b/ipa-server/ipa-install/ipa-replica-install
@@ -145,8 +145,7 @@ def check_dirsrv():
if serverids:
print ""
print "An existing Directory Server has been detected."
- yesno = raw_input("Do you wish to remove it and create a new one? [no]: ")
- if not yesno or yesno.lower()[0] != "y":
+ if not ipautil.user_input("Do you wish to remove it and create a new one?", False)
print ""
print "Only a single Directory Server instance is allowed on an IPA"
print "server, the one used by IPA itself."
@@ -189,12 +188,9 @@ def main():
if host != config.host_name:
try:
print "This replica was created for '%s' but this machine is named '%s'" % (host, config.host_name)
- yesno = raw_input("This may cause problems. Continue? [Y/n]: ")
- print ""
- if not yesno or yesno.lower()[0] == "y":
- pass
- else:
+ if not ipautil.user_input("This may cause problems. Continue?", True)
sys.exit(0)
+ print ""
except KeyboardInterrupt:
sys.exit(0)
config.repl_password = ipautil.ipa_generate_password()
diff --git a/ipa-server/ipa-install/ipa-server-certinstall b/ipa-server/ipa-install/ipa-server-certinstall
index 835af0aa8..a0d118568 100644
--- a/ipa-server/ipa-install/ipa-server-certinstall
+++ b/ipa-server/ipa-install/ipa-server-certinstall
@@ -27,6 +27,7 @@ import traceback
import krbV, ldap, getpass
+from ipa.ipautil import user_input
from ipaserver import certs, dsinstance, httpinstance, ipaldap, installutils
def get_realm_name():
@@ -76,25 +77,15 @@ def choose_server_cert(server_certs):
print "%d. %s" % (num, cert[0])
num += 1
- cert_num = 0
while 1:
- cert_input = raw_input("Certificate number [1]: ")
+ num = user_input("Certificate number", 1)
print ""
- if cert_input == "":
- break
+ if num < 1 or num > len(server_certs):
+ print "number out of range"
else:
- try:
- num = int(cert_input)
- except ValueError:
- print "invalid number"
- continue
- if num > len(server_certs):
- print "number out of range"
- continue
- cert_num = num - 1
break
- return server_certs[cert_num]
+ return server_certs[num - 1]
def import_cert(dirname, pkcs12_fname, pkcs12_passwd, db_password):
cdb = certs.CertDB(dirname)
diff --git a/ipa-server/ipa-install/ipa-server-install b/ipa-server/ipa-install/ipa-server-install
index 8b5b831c7..ce300cc7f 100644
--- a/ipa-server/ipa-install/ipa-server-install
+++ b/ipa-server/ipa-install/ipa-server-install
@@ -120,7 +120,6 @@ def signal_handler(signum, frame):
sys.exit(1)
def read_host_name(host_default):
- host_ok = False
host_name = ""
print "Enter the fully qualified domain name of the computer"
@@ -131,19 +130,15 @@ def read_host_name(host_default):
print ""
if host_default == "":
host_default = "master.example.com"
- while not host_ok:
- host_input = raw_input("Server host name [" + host_default + "]: ")
+ while True:
+ host_name = user_input("Server host name", host_default, allow_empty = False)
print ""
- if host_input == "":
- host_name = host_default
- else:
- host_name = host_input
try:
verify_fqdn(host_name)
except Exception, e:
raise e
else:
- host_ok = True
+ break
return host_name
def resolve_host(host_name):
@@ -178,10 +173,8 @@ def verify_ip_address(ip):
def read_ip_address(host_name):
while True:
- ip = raw_input("Please provide the IP address to be used for this host name: ")
+ ip = user_input("Please provide the IP address to be used for this host name", allow_empty = False)
- if ip == "":
- continue
if ip == "127.0.0.1" or ip == "::1":
print "The IPA Server can't use localhost as a valid IP"
continue
@@ -213,13 +206,12 @@ def read_ds_user():
print "A user account named 'dirsrv' already exists. This is the user id"
print "that the Directory Server will run as."
print ""
- yesno = raw_input("Do you want to use the existing 'dirsrv' account? [yes]: ")
- print ""
- if not yesno or yesno.lower()[0] != "n":
+ if user_input("Do you want to use the existing 'dirsrv' account?", True):
ds_user = "dirsrv"
else:
- ds_user = raw_input("Which account name do you want to use for the DS instance? ")
print ""
+ ds_user = user_input_plain("Which account name do you want to use for the DS instance?", allow_empty = False, allow_spaces = False)
+ print ""
except KeyError:
ds_user = "dirsrv"
@@ -229,37 +221,31 @@ def read_domain_name(domain_name, unattended):
print "The domain name has been calculated based on the host name."
print ""
if not unattended:
- dn = raw_input("Please confirm the domain name ["+domain_name+"]: ")
+ domain_name = user_input("Please confirm the domain name", domain_name)
print ""
- if dn != "":
- domain_name = dn
return domain_name
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 ""
- upper_dom = domain_name.upper()
+
if unattended:
- realm_name = upper_dom
- else:
- realm_name = raw_input("Please provide a realm name ["+upper_dom+"]: ")
- print ""
- if realm_name == "":
- realm_name = upper_dom
- else:
- upper_dom = realm_name.upper()
- if upper_dom != realm_name:
- print "An upper-case realm name is required."
- dom_realm = raw_input("Do you want to use "+upper_dom+" as realm name ? [yes]: ")
+ return domain_name.upper()
+ realm_name = user_input("Please provide a realm name", domain_name.upper())
+ upper_dom = realm_name.upper()
+ 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):
print ""
- if dom_realm and dom_realm.lower()[0] != "y":
- print "An upper-case realm name is required. Unable to continue."
- sys.exit(1)
- else:
- realm_name = upper_dom
+ print "An upper-case realm name is required. Unable to continue."
+ sys.exit(1)
+ else:
+ realm_name = upper_dom
+ print ""
return realm_name
+
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"
@@ -284,10 +270,7 @@ def check_dirsrv(unattended):
if serverids:
print ""
print "An existing Directory Server has been detected."
- if unattended:
- sys.exit(1)
- yesno = raw_input("Do you wish to remove it and create a new one? [no]: ")
- if not yesno or yesno.lower()[0] != "y":
+ if unattended or user_input("Do you wish to remove it and create a new one?", False):
print ""
print "Only a single Directory Server instance is allowed on an IPA"
print "server, the one used by IPA itself."
@@ -354,8 +337,7 @@ def main():
if options.uninstall:
if not options.unattended:
print "\nThis is a NON REVERSIBLE operation and will delete all data and configuration!\n"
- yesno = raw_input("Are you sure you want to continue with the uninstall procedure?:[NO/yes] ")
- if not yesno or yesno.lower() != "yes":
+ if not user_input("Are you sure you want to continue with the uninstall procedure?", False)
print ""
print "Aborting uninstall operation."
sys.exit(1)