3 # Unix SMB/CIFS implementation.
4 # Extended attributes (re)building
5 # Copyright (C) Matthieu Patou <mat@matws.net> 2009
7 # Based on provision a Samba4 server by
8 # Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2008
9 # Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 3 of the License, or
15 # (at your option) any later version.
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # GNU General Public License for more details.
22 # You should have received a copy of the GNU General Public License
23 # along with this program. If not, see <http://www.gnu.org/licenses/>.
29 # Find right directory when running from source tree
30 sys
.path
.insert(0, "bin/python")
33 from samba
.credentials
import DONT_USE_KERBEROS
34 from samba
.auth
import system_session
36 from ldb
import SCOPE_SUBTREE
, SCOPE_BASE
38 import samba
.getopt
as options
39 from samba
import param
40 from samba
.provision
import ProvisionNames
, provision_paths_from_lp
41 from samba
.schema
import get_dnsyntax_attributes
, get_linked_attributes
43 parser
= optparse
.OptionParser("provision [options]")
44 sambaopts
= options
.SambaOptions(parser
)
45 parser
.add_option_group(sambaopts
)
46 parser
.add_option_group(options
.VersionOptions(parser
))
47 credopts
= options
.CredentialsOptions(parser
)
48 parser
.add_option_group(credopts
)
49 parser
.add_option("--targetdir", type="string", metavar
="DIR",
50 help="Set target directory")
52 opts
= parser
.parse_args()[0]
55 """print a message if quiet is not set."""
59 if len(sys
.argv
) == 1:
60 opts
.interactive
= True
62 lp
= sambaopts
.get_loadparm()
63 smbconf
= lp
.configfile
65 creds
= credopts
.get_credentials(lp
)
67 creds
.set_kerberos_state(DONT_USE_KERBEROS
)
69 session
= system_session()
72 def get_paths(targetdir
=None,smbconf
=None):
73 if targetdir
is not None:
74 if (not os
.path
.exists(os
.path
.join(targetdir
, "etc"))):
75 os
.makedirs(os
.path
.join(targetdir
, "etc"))
76 smbconf
= os
.path
.join(targetdir
, "etc", "smb.conf")
78 smbconf
= param
.default_path()
80 if not os
.path
.exists(smbconf
):
81 print >>sys
.stderr
, "Unable to find smb.conf .. "+smbconf
87 paths
= provision_paths_from_lp(lp
,"foo")
92 def rebuild_en_dn(credentials
,session_info
,paths
):
94 lp
.load(paths
.smbconf
)
95 names
= ProvisionNames()
96 names
.domain
= lp
.get("workgroup")
97 names
.realm
= lp
.get("realm")
98 names
.rootdn
= "DC=" + names
.realm
.replace(".",",DC=")
102 sam_ldb
= Ldb(paths
.samdb
, session_info
=session_info
, credentials
=credentials
,lp
=lp
)
103 attrs2
= ["schemaNamingContext"]
104 res2
= sam_ldb
.search(expression
="(objectClass=*)",base
="", scope
=SCOPE_BASE
, attrs
=attrs2
)
105 attrs
.extend(get_linked_attributes(ldb
.Dn(sam_ldb
,str(res2
[0]["schemaNamingContext"])),sam_ldb
).keys())
106 attrs
.extend(get_dnsyntax_attributes(ldb
.Dn(sam_ldb
,str(res2
[0]["schemaNamingContext"])),sam_ldb
)),
107 sam_ldb
.transaction_start()
108 res
= sam_ldb
.search(expression
="(cn=*)", scope
=SCOPE_SUBTREE
, attrs
=attrs
,controls
=["search_options:1:2"]
111 for i
in range (0,len(res
)):
112 #print >>sys.stderr,res[i].dn
115 if ( (att
!= "dn" and att
!= "cn") and not (res
[i
][att
] is None) ):
117 m
.dn
= ldb
.Dn(sam_ldb
, str(dn
))
119 for j
in range (0,len( res
[i
][att
])):
120 mod
= mod
+att
+": "+str(res
[i
][att
][j
])+"\n"
121 saveatt
.append(str(res
[i
][att
][j
]))
122 m
[att
] = ldb
.MessageElement(saveatt
, ldb
.FLAG_MOD_REPLACE
, att
)
124 res3
= sam_ldb
.search(expression
="(&(dn=%s)(%s=*))"%(dn
,att
),scope
=SCOPE_SUBTREE
, attrs
=[att
],controls
=["search_options:1:2"])
125 if( len(res3
) == 0 or (len(res3
[0][att
])!= len(saveatt
))):
126 print >>sys
.stderr
, str(dn
) + " has no attr " +att
+ " or a wrong value"
128 print >>sys
.stderr
,str(att
)+" = "+satt
129 sam_ldb
.transaction_cancel()
130 sam_ldb
.transaction_commit()
135 paths
= get_paths(targetdir
=opts
.targetdir
,smbconf
=smbconf
)
138 rebuild_en_dn(creds
,session
,paths
)