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
10 sys
.path
.insert(0, "bin/python")
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
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
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
36 print "Parameter database is mandatory"
38 creds
= credopts
.get_credentials(lp
)
39 creds
.set_kerberos_state(DONT_USE_KERBEROS
)
40 session
= system_session()
42 newname
="%s.new"%(opts
.database
)
43 if os
.path
.exists(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
)
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":
53 if str(res
[i
].dn
).startswith("@INDEX:"):
55 delta
= new_ldb
.msg_diff(empty
,res
[i
])
57 delta
.remove("distinguishedName")
60 new_ldb
.transaction_commit()