[SCM] Samba Shared Repository - branch master updated
Andrew Bartlett
abartlet at samba.org
Mon Feb 18 23:49:02 MST 2013
The branch, master has been updated
via 2cf83f7 samba_upgradeprovision: Use tdb_util.tdb_copy not shutil.copy2
via 3c51e18 samba_upgradeprovision: Do not update privileges.ldb any more (unchanged since 2009)
via 396df64 scripting: Make tdb_copy a common util function in samba.tdb_util
via 2c2759e scripting: Make tdb_copy use the python subprocess module
from 06780ae samba_upgradeprovision: Remove options to fix FS ACLs
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 2cf83f7c645e4b216cf6f23857fd72ec0e6ca7a6
Author: Andrew Bartlett <abartlet at samba.org>
Date: Sun Feb 17 18:15:52 2013 +1100
samba_upgradeprovision: Use tdb_util.tdb_copy not shutil.copy2
This is really important, because copying a file will both ignore
locks held by another process and break any locks we hold (due to
POSIX brain-damage regarding multiple fds on one file in a process).
By leaving this to tdbbackup in a child, both of these issues are avoided.
Andrew Bartlett
Reviewed-by: Matthieu Patou <mat at samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
Autobuild-Date(master): Tue Feb 19 07:48:18 CET 2013 on sn-devel-104
commit 3c51e18a0cd1cb4b54cd29e312abd7cc2c0fbc98
Author: Andrew Bartlett <abartlet at samba.org>
Date: Sun Feb 17 18:41:00 2013 +1100
samba_upgradeprovision: Do not update privileges.ldb any more (unchanged since 2009)
This update was only a total oblitoration of the existing database
and not a merge, and the shutil.copy would both disregard and break
locks on the database that are held at this point.
Andrew Bartlett
Reviewed-by: Matthieu Patou <mat at samba.org>
commit 396df64ef6f2c66c35989ecda3e564d5578fe9f3
Author: Andrew Bartlett <abartlet at samba.org>
Date: Sun Feb 17 18:14:06 2013 +1100
scripting: Make tdb_copy a common util function in samba.tdb_util
This will allow samba_upgradeprovision to also call it.
Andrew Bartlett
Reviewed-by: Matthieu Patou <mat at samba.org>
commit 2c2759e408d9c45c2aee0c2578f45edd246afec3
Author: Andrew Bartlett <abartlet at samba.org>
Date: Sun Feb 17 17:57:42 2013 +1100
scripting: Make tdb_copy use the python subprocess module
This makes the code more robust to spaces in the file names (etc).
Andrew Bartlett
Reviewed-by: Matthieu Patou <mat at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source4/scripting/bin/samba_upgradeprovision | 51 ++++++++-----------
.../scripting/python/samba/provision/sambadns.py | 23 +--------
source4/scripting/python/samba/tdb_util.py | 41 ++++++++++++++++
3 files changed, 66 insertions(+), 49 deletions(-)
create mode 100644 source4/scripting/python/samba/tdb_util.py
Changeset truncated at 500 lines:
diff --git a/source4/scripting/bin/samba_upgradeprovision b/source4/scripting/bin/samba_upgradeprovision
index 570f783..25c3ac2 100755
--- a/source4/scripting/bin/samba_upgradeprovision
+++ b/source4/scripting/bin/samba_upgradeprovision
@@ -40,6 +40,7 @@ import samba.getopt as options
from base64 import b64encode
from samba.credentials import DONT_USE_KERBEROS
from samba.auth import system_session, admin_session
+from samba import tdb_util
from ldb import (SCOPE_SUBTREE, SCOPE_BASE,
FLAG_MOD_REPLACE, FLAG_MOD_ADD, FLAG_MOD_DELETE,
MessageElement, Message, Dn, LdbError)
@@ -1470,7 +1471,7 @@ def simple_update_basesamdb(newpaths, paths, names):
:param names: List of key provision parameters"""
message(SIMPLE, "Copy samdb")
- shutil.copy(newpaths.samdb, paths.samdb)
+ tdb_util.tdb_copy(newpaths.samdb, paths.samdb)
message(SIMPLE, "Update partitions filename if needed")
schemaldb = os.path.join(paths.private_dir, "schema.ldb")
@@ -1482,31 +1483,19 @@ def simple_update_basesamdb(newpaths, paths, names):
os.mkdir(samldbdir)
os.chmod(samldbdir, 0700)
if os.path.isfile(schemaldb):
- shutil.copy(schemaldb, os.path.join(samldbdir,
+ tdb_util.tdb_copy(schemaldb, os.path.join(samldbdir,
"%s.ldb"%str(names.schemadn).upper()))
os.remove(schemaldb)
if os.path.isfile(usersldb):
- shutil.copy(usersldb, os.path.join(samldbdir,
+ tdb_util.tdb_copy(usersldb, os.path.join(samldbdir,
"%s.ldb"%str(names.rootdn).upper()))
os.remove(usersldb)
if os.path.isfile(configldb):
- shutil.copy(configldb, os.path.join(samldbdir,
+ tdb_util.tdb_copy(configldb, os.path.join(samldbdir,
"%s.ldb"%str(names.configdn).upper()))
os.remove(configldb)
-def update_privilege(ref_private_path, cur_private_path):
- """Update the privilege database
-
- :param ref_private_path: Path to the private directory of the reference
- provision.
- :param cur_private_path: Path to the private directory of the current
- (and to be updated) provision."""
- message(SIMPLE, "Copy privilege")
- shutil.copy(os.path.join(ref_private_path, "privilege.ldb"),
- os.path.join(cur_private_path, "privilege.ldb"))
-
-
def update_samdb(ref_samdb, samdb, names, provisionUSNs, schema, prereloadfunc):
"""Upgrade the SAM DB contents for all the provision partitions
@@ -1543,12 +1532,12 @@ def backup_provision(paths, dir, only_db):
"""
if paths.sysvol and not only_db:
copytree_with_xattrs(paths.sysvol, os.path.join(dir, "sysvol"))
- shutil.copy2(paths.samdb, dir)
- shutil.copy2(paths.secrets, dir)
- shutil.copy2(paths.idmapdb, dir)
- shutil.copy2(paths.privilege, dir)
+ tdb_util.tdb_copy(paths.samdb, os.path.join(dir, os.path.basename(paths.samdb)))
+ tdb_util.tdb_copy(paths.secrets, os.path.join(dir, os.path.basename(paths.secrets)))
+ tdb_util.tdb_copy(paths.idmapdb, os.path.join(dir, os.path.basename(paths.idmapdb)))
+ tdb_util.tdb_copy(paths.privilege, os.path.join(dir, os.path.basename(paths.privilege)))
if os.path.isfile(os.path.join(paths.private_dir,"eadb.tdb")):
- shutil.copy2(os.path.join(paths.private_dir,"eadb.tdb"), dir)
+ tdb_util.tdb_copy(os.path.join(paths.private_dir,"eadb.tdb"), os.path.join(dir, "eadb.tdb"))
shutil.copy2(paths.smbconf, dir)
shutil.copy2(os.path.join(paths.private_dir,"secrets.keytab"), dir)
@@ -1558,11 +1547,15 @@ def backup_provision(paths, dir, only_db):
schemaldb = os.path.join(paths.private_dir, "schema.ldb")
configldb = os.path.join(paths.private_dir, "configuration.ldb")
usersldb = os.path.join(paths.private_dir, "users.ldb")
- shutil.copy2(schemaldb, dir)
- shutil.copy2(usersldb, dir)
- shutil.copy2(configldb, dir)
+ tdb_util.tdb_copy(schemaldb, os.path.join(dir, "schema.ldb"))
+ tdb_util.tdb_copy(usersldb, os.path.join(dir, "configuration.ldb"))
+ tdb_util.tdb_copy(configldb, os.path.join(dir, "users.ldb"))
else:
- shutil.copytree(samldbdir, os.path.join(dir, "sam.ldb.d"))
+ os.mkdir(os.path.join(dir, "sam.ldb.d"), 0700)
+
+ for ldb in os.listdir(samldbdir):
+ tdb_util.tdb_copy(os.path.join(samldbdir, ldb),
+ os.path.join(dir, "sam.ldb.d", ldb))
def sync_calculated_attributes(samdb, names):
@@ -1593,8 +1586,9 @@ def sync_calculated_attributes(samdb, names):
# 6) get reference provision paths
# 7) open reference provision ldbs
# 8) setup helpers data that will help the update process
-# 9) update the privilege ldb by copying the one of referecence provision to
-# the current provision
+# 9) (SKIPPED) we no longer update the privilege ldb by copying the one of referecence provision to
+# the current provision, because a shutil.copy would break the transaction locks both databases are under
+# and this database has not changed between 2009 and Samba 4.0.3 in Feb 2013 (at least)
# 10)get the oemInfo field, this field contains information about the different
# provision that have been done
# 11)Depending on whether oemInfo has the string "alpha9" or alphaxx (x as an
@@ -1816,8 +1810,7 @@ if __name__ == '__main__':
populate_links(new_ldbs.sam, names.schemadn)
# List of attribute with ASN DN synthax)
populate_dnsyntax(new_ldbs.sam, names.schemadn)
- # 9)
- update_privilege(newpaths.private_dir, paths.private_dir)
+ # 9) (now skipped, was copy of privileges.ldb)
# 10)
oem = getOEMInfo(ldbs.sam, str(names.rootdn))
# Do some modification on sam.ldb
diff --git a/source4/scripting/python/samba/provision/sambadns.py b/source4/scripting/python/samba/provision/sambadns.py
index 740dd38..4522683 100644
--- a/source4/scripting/python/samba/provision/sambadns.py
+++ b/source4/scripting/python/samba/provision/sambadns.py
@@ -27,6 +27,7 @@ import time
import ldb
from base64 import b64encode
import samba
+from samba.tdb_util import tdb_copy
from samba.ndr import ndr_pack, ndr_unpack
from samba import setup_file
from samba.dcerpc import dnsp, misc, security
@@ -738,22 +739,6 @@ def create_zone_file(lp, logger, paths, targetdir, dnsdomain,
os.system(rndc + " unfreeze " + lp.get("realm"))
-def tdb_copy(logger, file1, file2):
- """Copy tdb file using tdbbackup utility and rename it
- """
- # Find the location of tdbbackup tool
- dirs = ["bin", samba.param.bin_dir()] + os.getenv('PATH').split(os.pathsep)
- for d in dirs:
- toolpath = os.path.join(d, "tdbbackup")
- if os.path.exists(toolpath):
- break
- status = os.system("%s -s '.dns' %s" % (toolpath, file1))
- if status == 0:
- os.rename("%s.dns" % file1, file2)
- else:
- raise Exception("Error copying %s" % file1)
-
-
def create_samdb_copy(samdb, logger, paths, names, domainsid, domainguid):
"""Create a copy of samdb and give write permissions to named for dns partitions
"""
@@ -816,13 +801,11 @@ def create_samdb_copy(samdb, logger, paths, names, domainsid, domainguid):
# Copy root, config, schema partitions (and any other if any)
# Since samdb is open in the current process, copy them in a child process
try:
- tdb_copy(logger,
- os.path.join(private_dir, "sam.ldb"),
+ tdb_copy(os.path.join(private_dir, "sam.ldb"),
os.path.join(dns_dir, "sam.ldb"))
for nc in partfile:
pfile = partfile[nc]
- tdb_copy(logger,
- os.path.join(private_dir, pfile),
+ tdb_copy(os.path.join(private_dir, pfile),
os.path.join(dns_dir, pfile))
except:
logger.error(
diff --git a/source4/scripting/python/samba/tdb_util.py b/source4/scripting/python/samba/tdb_util.py
new file mode 100644
index 0000000..d967434
--- /dev/null
+++ b/source4/scripting/python/samba/tdb_util.py
@@ -0,0 +1,41 @@
+# Unix SMB/CIFS implementation.
+# tdb util helpers
+#
+# Copyright (C) Kai Blin <kai at samba.org> 2011
+# Copyright (C) Amitay Isaacs <amitay at gmail.com> 2011
+# Copyright (C) Andrew Bartlett <abartlet at samba.org> 2013
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import samba
+import subprocess
+import os
+
+def tdb_copy(file1, file2):
+ """Copy tdb file using tdbbackup utility and rename it
+ """
+ # Find the location of tdbbackup tool
+ dirs = ["bin", samba.param.bin_dir()] + os.getenv('PATH').split(os.pathsep)
+ for d in dirs:
+ toolpath = os.path.join(d, "tdbbackup")
+ if os.path.exists(toolpath):
+ break
+
+ tdbbackup_cmd = [toolpath, "-s", ".copy.tdb", file1]
+ status = subprocess.call(tdbbackup_cmd, close_fds=True, shell=False)
+
+ if status == 0:
+ os.rename("%s.copy.tdb" % file1, file2)
+ else:
+ raise Exception("Error copying %s" % file1)
--
Samba Shared Repository
More information about the samba-cvs
mailing list