From 3567367b22bb4c92b815772fdd0b44c6d8e032c2 Mon Sep 17 00:00:00 2001 From: Tibor Dudlák Date: Apr 11 2019 10:04:36 +0000 Subject: Support interactive prompt for ntp options As the FreeIPA server is no longer a NTP service providing instance its clients and replicas configuration of time service can not be handled as it was before change to chrony. Configuration using master FQDN or autodiscovery for DNS record would make no difference because every FreeIPA instance is only chrony client now and does not update DNS _ntp._udp record. FreeIPA now asks user for NTP source server or pool address in interactive mode if there is no server nor pool specified and autodiscovery has not found any NTP source in DNS records. Resolves: https://pagure.io/freeipa/issue/7747 Reviewed-By: Christian Heimes Reviewed-By: Rob Crittenden --- diff --git a/ipaclient/install/client.py b/ipaclient/install/client.py index 6125588..a4aa39b 100644 --- a/ipaclient/install/client.py +++ b/ipaclient/install/client.py @@ -2472,18 +2472,21 @@ def sync_time(options, fstore, statestore): # disable other time&date services first timeconf.force_chrony(statestore) - logger.info('Synchronizing time') - - if not options.ntp_servers: + if not options.ntp_servers and not options.ntp_pool: ds = ipadiscovery.IPADiscovery() ntp_servers = ds.ipadns_search_srv(cli_domain, '_ntp._udp', None, break_on_first=False) - else: - ntp_servers = options.ntp_servers + if not ntp_servers and not options.unattended: + options.ntp_servers, options.ntp_pool = timeconf.get_time_source() + else: + options.ntp_servers = ntp_servers + + logger.info('Synchronizing time') configured = False - if ntp_servers or options.ntp_pool: - configured = timeconf.configure_chrony(ntp_servers, options.ntp_pool, + if options.ntp_servers or options.ntp_pool: + configured = timeconf.configure_chrony(options.ntp_servers, + options.ntp_pool, fstore, statestore) else: logger.warning("No SRV records of NTP servers found and no NTP server " diff --git a/ipaclient/install/timeconf.py b/ipaclient/install/timeconf.py index 57ab50a..4afe5b3 100644 --- a/ipaclient/install/timeconf.py +++ b/ipaclient/install/timeconf.py @@ -28,6 +28,7 @@ from ipapython import ipautil from ipaplatform.tasks import tasks from ipaplatform import services from ipaplatform.paths import paths +from ipapython.ipautil import user_input logger = logging.getLogger(__name__) @@ -39,6 +40,36 @@ def __backup_config(path, fstore=None): shutil.copy(path, "%s.ipasave" % (path)) +def get_time_source(): + """ + While in interactive installation user has to specify NTP server or pool + to be used in chrony configuration. This method asks user input on these + values in case that they were not specified before installation start. + """ + ntp_servers = [] + ntp_pool = "" + + if ipautil.user_input("Do you want to configure chrony " + "with NTP server or pool address?", False): + servers = user_input("Enter NTP source server addresses separated by " + "comma, or press Enter to skip", allow_empty=True) + if servers: # if user input is not '' (empty) + logger.debug("User provided NTP server(s):") + # cut possible multiple servers separated by comma into list + for server in servers.split(","): + # users tend to separate servers by ", " so strip() whitespaces + server = server.strip() + ntp_servers.append(server) + logger.debug("\t%s", server) + + ntp_pool = user_input("Enter a NTP source pool address, " + "or press Enter to skip", allow_empty=True) + if ntp_pool: # if user input is not '' (empty) + logger.debug("User provided NTP pool:\n\t%s", ntp_pool) + + return ntp_servers, ntp_pool + + def sync_chrony(): """ This method enables chronyd service on boot and restarts it to reload