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/>.
30 # Find right directory when running from source tree
31 sys
.path
.insert(0, "bin/python")
34 from samba
.credentials
import DONT_USE_KERBEROS
35 from samba
.auth
import system_session
36 from samba
import Ldb
, substitute_var
, valid_netbios_name
, check_all_substituted
37 from ldb
import SCOPE_SUBTREE
, SCOPE_ONELEVEL
, SCOPE_BASE
, LdbError
, \
38 timestring
, CHANGETYPE_MODIFY
, CHANGETYPE_NONE
40 import samba
.getopt
as options
41 from samba
.samdb
import SamDB
42 from samba
import param
43 from samba
.provision
import ProvisionPaths
, ProvisionNames
, provision_paths_from_lp
44 from samba
.schema
import get_dnsyntax_attributes
, get_linked_attributes
46 parser
= optparse
.OptionParser("provision [options]")
47 sambaopts
= options
.SambaOptions(parser
)
48 parser
.add_option_group(sambaopts
)
49 parser
.add_option_group(options
.VersionOptions(parser
))
50 credopts
= options
.CredentialsOptions(parser
)
51 parser
.add_option_group(credopts
)
52 parser
.add_option("--targetdir", type="string", metavar
="DIR",
53 help="Set target directory")
55 opts
= parser
.parse_args()[0]
58 """print a message if quiet is not set."""
62 if len(sys
.argv
) == 1:
63 opts
.interactive
= True
65 lp
= sambaopts
.get_loadparm()
66 smbconf
= lp
.configfile
68 creds
= credopts
.get_credentials(lp
)
70 creds
.set_kerberos_state(DONT_USE_KERBEROS
)
72 session
= system_session()
75 def get_paths(targetdir
=None,smbconf
=None):
76 if targetdir
is not None:
77 if (not os
.path
.exists(os
.path
.join(targetdir
, "etc"))):
78 os
.makedirs(os
.path
.join(targetdir
, "etc"))
79 smbconf
= os
.path
.join(targetdir
, "etc", "smb.conf")
81 smbconf
= param
.default_path()
83 if not os
.path
.exists(smbconf
):
84 print >>sys
.stderr
, "Unable to find smb.conf .. "+smbconf
90 paths
= provision_paths_from_lp(lp
,"foo")
95 def rebuild_en_dn(credentials
,session_info
,paths
):
97 lp
.load(paths
.smbconf
)
98 names
= ProvisionNames()
99 names
.domain
= lp
.get("workgroup")
100 names
.realm
= lp
.get("realm")
101 names
.rootdn
= "DC=" + names
.realm
.replace(".",",DC=")
105 sam_ldb
= Ldb(paths
.samdb
, session_info
=session_info
, credentials
=credentials
,lp
=lp
)
106 attrs2
= ["schemaNamingContext"]
107 res2
= sam_ldb
.search(expression
="(objectClass=*)",base
="", scope
=SCOPE_BASE
, attrs
=attrs2
)
108 attrs
.extend(get_linked_attributes(ldb
.Dn(sam_ldb
,str(res2
[0]["schemaNamingContext"])),sam_ldb
).keys())
109 attrs
.extend(get_dnsyntax_attributes(ldb
.Dn(sam_ldb
,str(res2
[0]["schemaNamingContext"])),sam_ldb
)),
110 sam_ldb
.transaction_start()
111 res
= sam_ldb
.search(expression
="(cn=*)", scope
=SCOPE_SUBTREE
, attrs
=attrs
,controls
=["search_options:1:2"]
114 for i
in range (0,len(res
)):
115 #print >>sys.stderr,res[i].dn
118 if ( (att
!= "dn" and att
!= "cn") and not (res
[i
][att
] is None) ):
120 m
.dn
= ldb
.Dn(sam_ldb
, str(dn
))
122 for j
in range (0,len( res
[i
][att
])):
123 mod
= mod
+att
+": "+str(res
[i
][att
][j
])+"\n"
124 saveatt
.append(str(res
[i
][att
][j
]))
125 m
[att
] = ldb
.MessageElement(saveatt
, ldb
.FLAG_MOD_REPLACE
, att
)
127 res3
= sam_ldb
.search(expression
="(&(dn=%s)(%s=*))"%(dn
,att
),scope
=SCOPE_SUBTREE
, attrs
=[att
],controls
=["search_options:1:2"])
128 if( len(res3
) == 0 or (len(res3
[0][att
])!= len(saveatt
))):
129 print >>sys
.stderr
, str(dn
) + " has no attr " +att
+ " or a wrong value"
131 print >>sys
.stderr
,str(att
)+" = "+satt
132 sam_ldb
.transaction_cancel()
133 sam_ldb
.transaction_commit()
138 paths
= get_paths(targetdir
=opts
.targetdir
,smbconf
=smbconf
)
141 rebuild_en_dn(creds
,session
,paths
)