summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2010-12-14 18:40:28 -0500
committerSimo Sorce <ssorce@redhat.com>2010-12-21 17:28:13 -0500
commit6bbd4eed9f4b1dcb3cb2fdc136575671832fca5f (patch)
treefe11ba12246e6d2b384f0855b43a6ad08a32ea5a
parenta21d91c0035b68bb5df864240cd2a2c8d0ecdf55 (diff)
downloadfreeipa-6bbd4eed9f4b1dcb3cb2fdc136575671832fca5f.tar.gz
freeipa-6bbd4eed9f4b1dcb3cb2fdc136575671832fca5f.tar.xz
freeipa-6bbd4eed9f4b1dcb3cb2fdc136575671832fca5f.zip
Rename add command to connect in ipa-replica-manage
This change also improves command syntax parsing Fixes: https://fedorahosted.org/freeipa/ticket/623
-rwxr-xr-xinstall/tools/ipa-replica-manage106
1 files changed, 71 insertions, 35 deletions
diff --git a/install/tools/ipa-replica-manage b/install/tools/ipa-replica-manage
index 3c789d0ee..1007462a8 100755
--- a/install/tools/ipa-replica-manage
+++ b/install/tools/ipa-replica-manage
@@ -28,6 +28,21 @@ from ipaserver.plugins.ldap2 import ldap2
from ipapython import version
from ipalib import errors, util
+# dict of command name and tuples of min/max num of args needed
+commands = {
+ "list":(0, 0, "", ""),
+ "connect":(1, 2, "<master fqdn> [other master fqdn]",
+ "must provide the name of the servers to connect"),
+ "disconnect":(1, 2, "<master fqdn> [other master fqdn]",
+ "must provide the name of the server to disconnect"),
+ "del":(1, 1, "<master fqdn>",
+ "must provide hostname of master to delete"),
+ "init":(1, 1, "<master fqdn>",
+ "hostname of master to initialize is required"),
+ "synch":(1, 1, "master fqdn>",
+ "must provide hostname of supplier to synchronize with")
+}
+
def parse_options():
from optparse import OptionParser
@@ -55,8 +70,27 @@ def parse_options():
options, args = parser.parse_args()
- if not len(args) or not ("list" in args[0] or "add" in args[0] or "del" in args[0] or "init" in args[0] or "synch" in args[0] or "disconnect" in args[0]):
- parser.error("must provide a command [list | add | del | init | synch | disconnect]")
+ valid_syntax = False
+
+ if len(args):
+ n = len(args) - 1
+ k = commands.keys()
+ for cmd in k:
+ if cmd == args[0]:
+ v = commands[cmd]
+ err = None
+ if n < v[0]:
+ err = v[3]
+ elif n > v[1]:
+ err = "too many arguments"
+ else:
+ valid_syntax = True
+ if err:
+ parser.error("Invalid syntax: %s\nUsage: %s [options] %s" % (err, cmd, v[2]))
+
+ if not valid_syntax:
+ cmdstr = " | ".join(commands.keys())
+ parser.error("must provide a command [%s]" % cmdstr)
# set log level
if options.verbose:
@@ -228,7 +262,8 @@ def del_master(replman, hostname, force=False):
print "Failed to cleanup %s entries: %s" % (hostname, str(e))
print "You may need to manually remove them from the tree"
-def add_master(replman, hostname, options):
+def add_link(replica1, replica2, dirman_passwd, options):
+
other_args = {}
if options.port:
other_args['port'] = options.port
@@ -247,22 +282,35 @@ def add_master(replman, hostname, options):
if not options.binddn or not options.bindpw or not options.cacert or not options.passsync:
logging.error("The arguments --binddn, --bindpw, --passsync and --cacert are required to create a winsync agreement")
sys.exit(1)
+
if options.cacert:
# have to install the given CA cert before doing anything else
ds = dsinstance.DsInstance(realm_name = get_realm_name(),
- dm_password = replman.dirman_passwd)
+ dm_password = dirman_passwd)
if not ds.add_ca_cert(options.cacert):
- logging.error("Could not load the required CA certificate file [%s]" %
- options.cacert)
- sys.exit(1)
+ print "Could not load the required CA certificate file [%s]" % options.cacert
+ return
else:
- logging.info("Added CA certificate %s to certificate database for %s" %
- (options.cacert, replman.hostname))
- # have to reconnect replman connection since the directory server was restarted
- replman = replication.ReplicationManager(replman.hostname, replman.dirman_passwd)
- logging.info("Restarted directory server " + replman.hostname)
- replman.setup_replication(hostname, get_realm_name(), **other_args)
- logging.info("Added agreement for other host " + hostname)
+ print "Added CA certificate %s to certificate database for %s" % (options.cacert, replica1)
+
+ # need to wait until cacert is installed as that command may restart
+ # the directory server and kill the connection
+ try:
+ repl1 = replication.ReplicationManager(replica1, dirman_passwd)
+ repl1.suffix = get_suffix()
+
+ except ldap.NO_SUCH_OBJECT:
+ print "Cannot find replica '%s'" % replica1
+ return
+ except errors.NotFound:
+ print "Cannot find replica '%s'" % replica1
+ return
+ except Exception, e:
+ print "Failed to get data from '%s': %s" % (replica1, str(e))
+ return
+
+ repl1.setup_replication(replica2, get_realm_name(), **other_args)
+ print "Connected '%s' to '%s'" % (replica1, replica2)
def init_master(replman, dirman_passwd, hostname):
filter = "(&(nsDS5ReplicaHost=%s)(|(objectclass=nsDSWindowsReplicationAgreement)(objectclass=nsds5ReplicationAgreement)))" % hostname
@@ -299,7 +347,7 @@ def main():
if options.dirman_passwd:
dirman_passwd = options.dirman_passwd
else:
- if (not test_connection(host)) or args[0] in ["add", "init"]:
+ if (not test_connection(host)) or args[0] in ["connect", "init"]:
dirman_passwd = getpass.getpass("Directory Manager password: ")
r = replication.ReplicationManager(host, dirman_passwd)
@@ -308,25 +356,19 @@ def main():
if args[0] == "list":
list_masters(r, options.verbose)
elif args[0] == "del":
- if len(args) != 2:
- print "must provide hostname of master to delete"
- sys.exit(1)
del_master(r, args[1], options.force)
- elif args[0] == "add":
- if len(args) != 2:
- print "must provide hostname of master to add"
- sys.exit(1)
- add_master(r, args[1], options)
elif args[0] == "init":
- if len(args) != 2:
- print "hostname of master to initialize is required."
- sys.exit(1)
init_master(r, dirman_passwd, args[1])
elif args[0] == "synch":
- if len(args) != 2:
- print "must provide hostname of supplier to synchronize with"
- sys.exit(1)
synch_master(r, args[1])
+ elif args[0] == "connect":
+ if len(args) == 3:
+ replica1 = args[1]
+ replica2 = args[2]
+ elif len(args) == 2:
+ replica1 = host
+ replica2 = args[1]
+ add_link(replica1, replica2, dirman_passwd, options)
elif args[0] == "disconnect":
if len(args) == 3:
replica1 = args[1]
@@ -334,13 +376,7 @@ def main():
elif len(args) == 2:
replica1 = host
replica2 = args[1]
- else:
- print "must provide the name of the server you want to disconnect"
- sys.exit(1)
del_link(replica1, replica2, dirman_passwd)
- else:
- print "unknown command: %s" % args[0]
- sys.exit(1)
try:
main()