1 | #!/usr/bin/python
|
---|
2 | #
|
---|
3 | # Copyright (C) Matthieu Patou <mat@matws.net> 2009
|
---|
4 | # This script realize an offline reorganisation of an LDB
|
---|
5 | # file it helps to reduce (sometime drastically) the
|
---|
6 | # size of LDB files.
|
---|
7 | import sys
|
---|
8 | import optparse
|
---|
9 | import os
|
---|
10 | sys.path.insert(0, "bin/python")
|
---|
11 |
|
---|
12 | import samba
|
---|
13 | from samba.credentials import DONT_USE_KERBEROS
|
---|
14 | from samba.auth import system_session
|
---|
15 | from samba import Ldb, substitute_var, valid_netbios_name, check_all_substituted
|
---|
16 | from ldb import SCOPE_SUBTREE, SCOPE_ONELEVEL, SCOPE_BASE, LdbError
|
---|
17 | import ldb
|
---|
18 | import samba.getopt as options
|
---|
19 | from samba.samdb import SamDB
|
---|
20 | from samba import param
|
---|
21 | from samba.provision import ProvisionPaths, ProvisionNames,provision_paths_from_lp, Schema
|
---|
22 |
|
---|
23 | parser = optparse.OptionParser("provision [options]")
|
---|
24 | sambaopts = options.SambaOptions(parser)
|
---|
25 | parser.add_option_group(sambaopts)
|
---|
26 | parser.add_option_group(options.VersionOptions(parser))
|
---|
27 | credopts = options.CredentialsOptions(parser)
|
---|
28 | parser.add_option_group(credopts)
|
---|
29 | parser.add_option("--database", type="string", metavar="FILE",
|
---|
30 | help="LDB to reorganize")
|
---|
31 | opts = parser.parse_args()[0]
|
---|
32 | lp = sambaopts.get_loadparm()
|
---|
33 | smbconf = lp.configfile
|
---|
34 |
|
---|
35 | if not opts.database:
|
---|
36 | print "Parameter database is mandatory"
|
---|
37 | sys.exit(1)
|
---|
38 | creds = credopts.get_credentials(lp)
|
---|
39 | creds.set_kerberos_state(DONT_USE_KERBEROS)
|
---|
40 | session = system_session()
|
---|
41 | empty = ldb.Message()
|
---|
42 | newname="%s.new"%(opts.database)
|
---|
43 | if os.path.exists(newname):
|
---|
44 | os.remove(newname)
|
---|
45 | old_ldb = Ldb(opts.database, session_info=session, credentials=creds,lp=lp)
|
---|
46 | new_ldb = Ldb(newname,session_info=session, credentials=creds,lp=lp)
|
---|
47 |
|
---|
48 | new_ldb.transaction_start()
|
---|
49 | res = old_ldb.search(expression="(dn=*)",base="", scope=SCOPE_SUBTREE)
|
---|
50 | for i in range(0,len(res)):
|
---|
51 | if str(res[i].dn) == "@BASEINFO":
|
---|
52 | continue
|
---|
53 | if str(res[i].dn).startswith("@INDEX:"):
|
---|
54 | continue
|
---|
55 | delta = new_ldb.msg_diff(empty,res[i])
|
---|
56 | delta.dn = res[i].dn
|
---|
57 | delta.remove("distinguishedName")
|
---|
58 | new_ldb.add(delta)
|
---|
59 |
|
---|
60 | new_ldb.transaction_commit()
|
---|