summaryrefslogtreecommitdiffstats
path: root/ipa-server/ipa-install/ipa-replica-manage
blob: f5e93f41b439f525ce97c97b26aa2a52fd15dd83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#! /usr/bin/python -E
# Authors: Karl MacMillan <kmacmillan@mentalrootkit.com>
#
# Copyright (C) 2007  Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; version 2 only
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#

def parse_options():
    from optparse import OptionParser

    parser = OptionParser()
    parser.add_option("-H", "--host", dest="host", help="starting host")
    parser.add_option("-p", "--password", dest="dirman_passwd", help="Directory Manager password")
    parser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False,
                      help="provide additional information")

    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]):
        parser.error("must provide a comment [list | add | del | init | synch]")

    return options, args

def get_realm_name():
    c = krbV.default_context()
    return c.default_realm

def get_suffix():
    suffix = ipaldap.IPAdmin.normalizeDN(dsinstance.realm_to_suffix(get_realm_name()))
    return suffix

def get_host_name():
    hostname = installutils.get_fqdn()
    try:
        installutils.verify_fqdn(hostname)
    except RuntimeError, e:
        logging.error(str(e))
        sys.exit(1)

    return hostname

def list_masters(replman, verbose):
    dns = replman.find_replication_dns(replman.conn)

    for dn in dns:
        entry = replman.conn.search_s(dn, ldap.SCOPE_SUBTREE)[0]
        cn = entry.cn
        other = re.search("meTo([a-zA-Z\.]*)[0-9]*", cn).groups()[0]
        print other

        if verbose:
            print "  last init status: %s" % entry.nsds5replicalastinitstatus
            print "  last init ended: %s" % str(ipautil.parse_generalized_time(entry.nsds5replicalastinitend))
            print "  last update status: %s" % entry.nsds5replicalastupdatestatus
            print "  last update ended: %s" % str(ipautil.parse_generalized_time(entry.nsds5replicalastupdateend))
    
def del_master(replman, hostname):
    dirman_passwd = getpass.getpass("Directory Manager password (%s): " % hostname)
    other_replman = replication.ReplicationManager(hostname, dirman_passwd)
    other_replman.suffix = get_suffix()

    replman.delete_agreement(other_replman.conn)
    other_replman.delete_agreement(replman.conn)

def add_master(replman, hostname):
    replman.setup_replication(hostname, get_realm_name())

def init_master(replman, hostname):
    filter = "(&(nsDS5ReplicaHost=%s)(objectclass=nsds5ReplicationAgreement))" % hostname
    entry = replman.conn.search_s("cn=config", ldap.SCOPE_SUBTREE, filter)
    if len(entry) == 0:
        logging.error("Unable to find replication agreement for %s" % hostname)
        sys.exit(1)
    if len(entry) > 1:
        logging.error("Found multiple agreements for %s. Only initializing the first one returned: %s" % (hostname, entry[0].dn))
    replman.initialize_replication(entry[0].dn, replman.conn)

def synch_master(replman, hostname):
    filter = "(&(nsDS5ReplicaHost=%s)(objectclass=nsds5ReplicationAgreement))" % hostname
    entry = replman.conn.search_s("cn=config", ldap.SCOPE_SUBTREE, filter)
    if len(entry) == 0:
        logging.error("Unable to find replication agreement for %s" % hostname)
        sys.exit(1)
    if len(entry) > 1:
        logging.error("Found multiple agreements for %s. Only initializing the first one returned: %s" % (hostname, entry[0].dn))
    replman.force_synch(entry[0].dn, entry[0].nsds5replicaupdateschedule, replman.conn)

def main():
    options, args = parse_options()
    
    if options.dirman_passwd:
        dirman_passwd = options.dirman_passwd
    else:
        dirman_passwd = getpass.getpass("Directory Manager password: ")

    if options.host:
        host = options.host
    else:
        host = get_host_name()

    r = replication.ReplicationManager(host, dirman_passwd)
    r.suffix = get_suffix()

    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])
    elif args[0] == "add":
        if len(args) != 2:
            print "must provide hostname of master to add"
            sys.exit(1)
        add_master(r, args[1])
    elif args[0] == "init":
        if len(args) != 2:
            print "hostname of supplier to initialize from is required."
            sys.exit(1)
        init_master(r, 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])

try:
    import sys

    import getpass, ldap, re, krbV
    import traceback, logging

    from ipa import ipautil
    from ipaserver import replication, ipaldap, dsinstance, installutils

    main()
except KeyboardInterrupt:
    sys.exit(1)   
except SystemExit, e:
    sys.exit(e)
except ldap.INVALID_CREDENTIALS:
    print "Invalid password"
    sys.exit(1)
except Exception, e:
    print "unexpected error: %s" % str(e)