misc/scripts/repair_splitbrain_ldapuser_source.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 24 Sep 2015 11:26:11 +0200
changeset 10921 977def81780a
parent 10589 7c23b7de2b8d
permissions -rw-r--r--
[migration] don't handle data deletion anymore on schema changes In most cases when we want to drop some entity/relation type, we don't care whether hooks are called on their deletion. There is even low chances that some hooks still exists, based on an old version of the schema. Last but not least, this is horribly inefficient. So this should be clearly documented and handled by application's programmer if desired. This patch removes unnecessary deletion (because table or column will be later dropped) and reimplements the case of partial deletion (only one relation definition among several, hence the database structure isn't modified) using sql. Only one test regarding deletion of inlined relation def is added as other cases seem to be covered by existing tests. Closes #7023315
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     1
"""
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     2
CAUTION: READ THIS CAREFULLY
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     3
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     4
Sometimes it happens that ldap (specifically ldapuser type) source
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     5
yield "ghost" users. The reasons may vary (server upgrade while some
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     6
instances are still running & syncing with the ldap source, unmanaged
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     7
updates to the upstream ldap, etc.).
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     8
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     9
This script was written and refined enough times that we are confident
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    10
in that it does something reasonnable (at least it did for the
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    11
target application).
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    12
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    13
However you should really REALLY understand what it does before
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    14
deciding to apply it for you. And then ADAPT it tou your needs.
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    15
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    16
"""
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    17
from __future__ import print_function
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    18
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    19
import base64
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    20
from collections import defaultdict
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    21
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    22
from cubicweb.server.session import hooks_control
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    23
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    24
try:
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    25
    source_name, = __args__
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    26
    source = repo.sources_by_uri[source_name]
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    27
except ValueError:
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    28
    print('you should specify the source name as script argument (i.e. after --'
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    29
          ' on the command line)')
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    30
    sys.exit(1)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    31
except KeyError:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    32
    print('%s is not an active source' % source_name)
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    33
    sys.exit(1)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    34
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    35
# check source is reachable before doing anything
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    36
if not source.get_connection().cnx:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    37
    print('%s is not reachable. Fix this before running this script' % source_name)
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    38
    sys.exit(1)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    39
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    40
def find_dupes():
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    41
    # XXX this retrieves entities from a source name "ldap"
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    42
    #     you will want to adjust
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    43
    rset = sql("SELECT eid, extid FROM entities WHERE source='%s'" % source_name)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    44
    extid2eids = defaultdict(list)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    45
    for eid, extid in rset:
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    46
        extid2eids[extid].append(eid)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    47
    return dict((base64.b64decode(extid).lower(), eids)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    48
                for extid, eids in extid2eids.items()
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    49
                if len(eids) > 1)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    50
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    51
def merge_dupes(dupes, docommit=False):
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    52
    gone_eids = []
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    53
    CWUser = schema['CWUser']
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    54
    for extid, eids in dupes.items():
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    55
        newest = eids.pop() # we merge everything on the newest
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    56
        print('merging ghosts of', extid, 'into', newest)
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    57
        # now we merge pairwise into the newest
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    58
        for old in eids:
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    59
            subst = {'old': old, 'new': newest}
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    60
            print('  merging', old)
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    61
            gone_eids.append(old)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    62
            for rschema in CWUser.subject_relations():
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    63
                if rschema.final or rschema == 'identity':
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    64
                    continue
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    65
                if CWUser.rdef(rschema, 'subject').composite == 'subject':
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    66
                    # old 'composite' property is wiped ...
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    67
                    # think about email addresses, excel preferences
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    68
                    for eschema in rschema.objects():
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    69
                        rql('DELETE %s X WHERE U %s X, U eid %%(old)s' % (eschema, rschema), subst)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    70
                else:
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    71
                    # relink the new user to its old relations
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    72
                    rql('SET NU %s X WHERE NU eid %%(new)s, NOT NU %s X, OU %s X, OU eid %%(old)s' %
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    73
                        (rschema, rschema, rschema), subst)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    74
                    # delete the old relations
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    75
                    rql('DELETE U %s X WHERE U eid %%(old)s' % rschema, subst)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    76
            # same thing ...
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    77
            for rschema in CWUser.object_relations():
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    78
                if rschema.final or rschema == 'identity':
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    79
                    continue
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    80
                rql('SET X %s NU WHERE NU eid %%(new)s, NOT X %s NU, X %s OU, OU eid %%(old)s' %
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    81
                    (rschema, rschema, rschema), subst)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    82
                rql('DELETE X %s U WHERE U eid %%(old)s' % rschema, subst)
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    83
    if not docommit:
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    84
        rollback()
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    85
        return
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    86
    commit() # XXX flushing operations is wanted rather than really committing
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    87
    print('clean up entities table')
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    88
    sql('DELETE FROM entities WHERE eid IN (%s)' % (', '.join(str(x) for x in gone_eids)))
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    89
    commit()
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    90
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    91
def main():
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    92
    dupes = find_dupes()
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    93
    if not dupes:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    94
        print('No duplicate user')
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    95
        return
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    96
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
    97
    print('Found %s duplicate user instances' % len(dupes))
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    98
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    99
    while True:
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
   100
        print('Fix or dry-run? (f/d)  ... or Ctrl-C to break out')
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   101
        answer = raw_input('> ')
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   102
        if answer.lower() not in 'fd':
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   103
            continue
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 8568
diff changeset
   104
        print('Please STOP THE APPLICATION INSTANCES (service or interactive), and press Return when done.')
8568
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   105
        raw_input('<I swear all running instances and workers of the application are stopped>')
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   106
        with hooks_control(session, session.HOOKS_DENY_ALL):
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   107
            merge_dupes(dupes, docommit=answer=='f')
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   108
56d9eb013feb [misc/scripts] a slightly experimental script to help repair LDAPUser cwusers suffering from split-brainite (closes #2497108)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   109
main()