diff options
author | Tomas Babej <tbabej@redhat.com> | 2012-10-02 09:15:33 -0400 |
---|---|---|
committer | Rob Crittenden <rcritten@redhat.com> | 2012-10-31 11:54:15 -0400 |
commit | e7c99e7d21f7923c92cf9dae9fd8c7d5ae4aa8cd (patch) | |
tree | b150a2142a9b2022f6edddc24ebfc3f60fbab43c | |
parent | fe66fbe637132ac5eb22eea388e2261f33497bf5 (diff) | |
download | freeipa.git-e7c99e7d21f7923c92cf9dae9fd8c7d5ae4aa8cd.tar.gz freeipa.git-e7c99e7d21f7923c92cf9dae9fd8c7d5ae4aa8cd.tar.xz freeipa.git-e7c99e7d21f7923c92cf9dae9fd8c7d5ae4aa8cd.zip |
IPA Server check in ipa-replica-manage
When executing ipa-replica-manage connect to an master that raises
NotFound error we now check if the master is at least IPA server.
If so, we inform the user that it is probably foreign or previously
deleted master. If not, we inform the user that the master is not
an IPA server at all.
https://fedorahosted.org/freeipa/ticket/3105
-rwxr-xr-x | install/tools/ipa-replica-manage | 50 | ||||
-rw-r--r-- | ipapython/ipautil.py | 13 |
2 files changed, 62 insertions, 1 deletions
diff --git a/install/tools/ipa-replica-manage b/install/tools/ipa-replica-manage index a62974a0..d489275c 100755 --- a/install/tools/ipa-replica-manage +++ b/install/tools/ipa-replica-manage @@ -33,6 +33,7 @@ from ipalib import api, errors, util from ipapython.ipa_log_manager import * from ipapython.dn import DN from ipapython.config import IPAOptionParser +from ipaclient import ipadiscovery CACERT = "/etc/ipa/ca.crt" @@ -136,6 +137,9 @@ def test_connection(realm, host): def list_replicas(realm, host, replica, dirman_passwd, verbose): + for check_host in [host, replica]: + enforce_host_existence(check_host) + is_replica = False winsync_peer = None peers = {} @@ -222,6 +226,9 @@ def del_link(realm, replica1, replica2, dirman_passwd, force=False): @force: force deletion even if one server is down """ + for check_host in [replica1, replica2]: + enforce_host_existence(check_host) + repl2 = None try: @@ -309,6 +316,9 @@ def get_ruv(realm, host, dirman_passwd): """ Return the RUV entries as a list of tuples: (hostname, rid) """ + + enforce_host_existence(host) + try: thisrepl = replication.ReplicationManager(realm, host, dirman_passwd) except Exception, e: @@ -342,6 +352,9 @@ def list_ruv(realm, host, dirman_passwd, verbose): List the Replica Update Vectors on this host to get the available replica IDs. """ + + enforce_host_existence(host) + servers = get_ruv(realm, host, dirman_passwd) for (netloc, rid) in servers: print "%s: %s" % (netloc, rid) @@ -431,6 +444,9 @@ def list_clean_ruv(realm, host, dirman_passwd, verbose): """ List all clean RUV tasks. """ + + enforce_host_existence(host) + repl = replication.ReplicationManager(realm, host, dirman_passwd) dn = DN(('cn', 'cleanallruv'),('cn', 'tasks'), ('cn', 'config')) try: @@ -507,8 +523,17 @@ def check_last_link(delrepl, realm, dirman_passwd, force): else: return None +def enforce_host_existence(host, message=None): + if not ipautil.host_exists(host): + if message is None: + message = "Unknown host %s" % host + + sys.exit(message) + def del_master(realm, hostname, options): + enforce_host_existence(hostname) + force_del = False delrepl = None @@ -651,6 +676,9 @@ def del_master(realm, hostname, options): def add_link(realm, replica1, replica2, dirman_passwd, options): + for check_host in [replica1,replica2]: + enforce_host_existence(check_host) + if options.winsync: if not options.binddn or not options.bindpw or not options.cacert or not options.passsync: root_logger.error("The arguments --binddn, --bindpw, --passsync and --cacert are required to create a winsync agreement") @@ -715,12 +743,29 @@ def add_link(realm, replica1, replica2, dirman_passwd, options): repl2.conn.getEntry(master2_dn, ldap.SCOPE_BASE) except errors.NotFound: - sys.exit("You cannot connect to a previously deleted master") + standard_logging_setup(console_format='%(message)s') + + ds = ipadiscovery.IPADiscovery() + ret = ds.search(server=replica2) + + if ret == ipadiscovery.NOT_IPA_SERVER: + sys.exit("Connection unsuccessful: %s is not an IPA Server." % + replica2) + elif ret == 0: # success + sys.exit("Connection unsuccessful: %s is an IPA Server, " + "but it might be unknown, foreign or previously deleted " + "one." % replica2) + else: + sys.exit("Connection to %s unsuccessful." % replica2) + repl1.setup_gssapi_replication(replica2, DN(('cn', 'Directory Manager')), dirman_passwd) print "Connected '%s' to '%s'" % (replica1, replica2) def re_initialize(realm, thishost, fromhost, dirman_passwd): + for check_host in [thishost, fromhost]: + enforce_host_existence(check_host) + thisrepl = replication.ReplicationManager(realm, thishost, dirman_passwd) agreement = thisrepl.get_replication_agreement(fromhost) if agreement is None: @@ -747,6 +792,9 @@ def re_initialize(realm, thishost, fromhost, dirman_passwd): def force_sync(realm, thishost, fromhost, dirman_passwd): + for check_host in [thishost, fromhost]: + enforce_host_existence(check_host) + thisrepl = replication.ReplicationManager(realm, thishost, dirman_passwd) agreement = thisrepl.get_replication_agreement(fromhost) if agreement is None: diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py index e76d87d3..c444d8c9 100644 --- a/ipapython/ipautil.py +++ b/ipapython/ipautil.py @@ -810,6 +810,19 @@ def is_host_resolvable(fqdn): return False +def host_exists(host): + """ + Resolve the host to see if it exists. + + Returns True/False + """ + try: + socket.getaddrinfo(host, 80) + except socket.gaierror: + return False + else: + return True + def get_ipa_basedn(conn): """ Get base DN of IPA suffix in given LDAP server. |