diff --git a/python/samba/netcmd/domain/__init__.py b/python/samba/netcmd/domain/__init__.py index 19ef1b05c42..d29291cc762 100644 --- a/python/samba/netcmd/domain/__init__.py +++ b/python/samba/netcmd/domain/__init__.py @@ -25,7 +25,6 @@ import samba.getopt as options import ldb import ctypes -import time from samba import ntstatus from samba import NTSTATUSError from samba import werror @@ -66,6 +65,7 @@ from .passwordsettings import cmd_domain_passwordsettings from .provision import cmd_domain_provision from .samba3upgrade import cmd_domain_samba3upgrade from .schemaupgrade import cmd_domain_schema_upgrade +from .tombstones import cmd_domain_tombstones class LocalDCCredentialsOptions(options.CredentialsOptions): @@ -2355,84 +2355,6 @@ class cmd_domain_trust_namespaces(DomainTrustCommand): return -class cmd_domain_tombstones_expunge(Command): - """Expunge tombstones from the database. - -This command expunges tombstones from the database.""" - synopsis = "%prog NC [NC [...]] [options]" - - takes_options = [ - Option("-H", "--URL", help="LDB URL for database or target server", type=str, - metavar="URL", dest="H"), - Option("--current-time", - help="The current time to evaluate the tombstone lifetime from, expressed as YYYY-MM-DD", - type=str), - Option("--tombstone-lifetime", help="Number of days a tombstone should be preserved for", type=int), - ] - - takes_args = ["nc*"] - - takes_optiongroups = { - "sambaopts": options.SambaOptions, - "credopts": options.CredentialsOptions, - "versionopts": options.VersionOptions, - } - - def run(self, *ncs, **kwargs): - sambaopts = kwargs.get("sambaopts") - credopts = kwargs.get("credopts") - H = kwargs.get("H") - current_time_string = kwargs.get("current_time") - tombstone_lifetime = kwargs.get("tombstone_lifetime") - lp = sambaopts.get_loadparm() - creds = credopts.get_credentials(lp) - samdb = SamDB(url=H, session_info=system_session(), - credentials=creds, lp=lp) - - if current_time_string is None and tombstone_lifetime is None: - print("Note: without --current-time or --tombstone-lifetime " - "only tombstones already scheduled for deletion will " - "be deleted.", file=self.outf) - print("To remove all tombstones, use --tombstone-lifetime=0.", - file=self.outf) - - if current_time_string is not None: - current_time_obj = time.strptime(current_time_string, "%Y-%m-%d") - current_time = int(time.mktime(current_time_obj)) - - else: - current_time = int(time.time()) - - if len(ncs) == 0: - res = samdb.search(expression="", base="", scope=ldb.SCOPE_BASE, - attrs=["namingContexts"]) - - ncs = [] - for nc in res[0]["namingContexts"]: - ncs.append(str(nc)) - else: - ncs = list(ncs) - - started_transaction = False - try: - samdb.transaction_start() - started_transaction = True - (removed_objects, - removed_links) = samdb.garbage_collect_tombstones(ncs, - current_time=current_time, - tombstone_lifetime=tombstone_lifetime) - - except Exception as err: - if started_transaction: - samdb.transaction_cancel() - raise CommandError("Failed to expunge / garbage collect tombstones", err) - - samdb.transaction_commit() - - self.outf.write("Removed %d objects and %d links successfully\n" - % (removed_objects, removed_links)) - - class cmd_domain_trust(SuperCommand): """Domain and forest trust management.""" @@ -2446,13 +2368,6 @@ class cmd_domain_trust(SuperCommand): subcommands["namespaces"] = cmd_domain_trust_namespaces() -class cmd_domain_tombstones(SuperCommand): - """Domain tombstone and recycled object management.""" - - subcommands = {} - subcommands["expunge"] = cmd_domain_tombstones_expunge() - - class cmd_domain(SuperCommand): """Domain management.""" diff --git a/python/samba/netcmd/domain/tombstones.py b/python/samba/netcmd/domain/tombstones.py new file mode 100644 index 00000000000..673bb9a1660 --- /dev/null +++ b/python/samba/netcmd/domain/tombstones.py @@ -0,0 +1,116 @@ +# domain management - domain tombstones +# +# Copyright Matthias Dieter Wallnoefer 2009 +# Copyright Andrew Kroeger 2009 +# Copyright Jelmer Vernooij 2007-2012 +# Copyright Giampaolo Lauria 2011 +# Copyright Matthieu Patou 2011 +# Copyright Andrew Bartlett 2008-2015 +# Copyright Stefan Metzmacher 2012 +# +# 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 . +# + +import time + +import ldb +import samba.getopt as options +from samba.auth import system_session +from samba.netcmd import Command, CommandError, Option, SuperCommand +from samba.samdb import SamDB + + +class cmd_domain_tombstones_expunge(Command): + """Expunge tombstones from the database. + +This command expunges tombstones from the database.""" + synopsis = "%prog NC [NC [...]] [options]" + + takes_options = [ + Option("-H", "--URL", help="LDB URL for database or target server", type=str, + metavar="URL", dest="H"), + Option("--current-time", + help="The current time to evaluate the tombstone lifetime from, expressed as YYYY-MM-DD", + type=str), + Option("--tombstone-lifetime", help="Number of days a tombstone should be preserved for", type=int), + ] + + takes_args = ["nc*"] + + takes_optiongroups = { + "sambaopts": options.SambaOptions, + "credopts": options.CredentialsOptions, + "versionopts": options.VersionOptions, + } + + def run(self, *ncs, **kwargs): + sambaopts = kwargs.get("sambaopts") + credopts = kwargs.get("credopts") + H = kwargs.get("H") + current_time_string = kwargs.get("current_time") + tombstone_lifetime = kwargs.get("tombstone_lifetime") + lp = sambaopts.get_loadparm() + creds = credopts.get_credentials(lp) + samdb = SamDB(url=H, session_info=system_session(), + credentials=creds, lp=lp) + + if current_time_string is None and tombstone_lifetime is None: + print("Note: without --current-time or --tombstone-lifetime " + "only tombstones already scheduled for deletion will " + "be deleted.", file=self.outf) + print("To remove all tombstones, use --tombstone-lifetime=0.", + file=self.outf) + + if current_time_string is not None: + current_time_obj = time.strptime(current_time_string, "%Y-%m-%d") + current_time = int(time.mktime(current_time_obj)) + + else: + current_time = int(time.time()) + + if len(ncs) == 0: + res = samdb.search(expression="", base="", scope=ldb.SCOPE_BASE, + attrs=["namingContexts"]) + + ncs = [] + for nc in res[0]["namingContexts"]: + ncs.append(str(nc)) + else: + ncs = list(ncs) + + started_transaction = False + try: + samdb.transaction_start() + started_transaction = True + (removed_objects, + removed_links) = samdb.garbage_collect_tombstones(ncs, + current_time=current_time, + tombstone_lifetime=tombstone_lifetime) + + except Exception as err: + if started_transaction: + samdb.transaction_cancel() + raise CommandError("Failed to expunge / garbage collect tombstones", err) + + samdb.transaction_commit() + + self.outf.write("Removed %d objects and %d links successfully\n" + % (removed_objects, removed_links)) + + +class cmd_domain_tombstones(SuperCommand): + """Domain tombstone and recycled object management.""" + + subcommands = {} + subcommands["expunge"] = cmd_domain_tombstones_expunge()