From 5ca2726a402f061a73ab7b52064d8b1e4028caca Mon Sep 17 00:00:00 2001 From: Tim Beale Date: Thu, 8 Nov 2018 17:07:08 +1300 Subject: [PATCH] netcmd: Small backup refactor to avoid compatiblity problems It will be easy to forget that the backupType marker doesn't exist on v4.9. However, this seems like a dumb reason not to support v4.9 backup-files. Add a wrapper function to avoid potential problems cropping up in future. Signed-off-by: Tim Beale Reviewed-by: Andrew Bartlett --- python/samba/netcmd/domain_backup.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/python/samba/netcmd/domain_backup.py b/python/samba/netcmd/domain_backup.py index 4ba09cc15ec..afa70e3b34e 100644 --- a/python/samba/netcmd/domain_backup.py +++ b/python/samba/netcmd/domain_backup.py @@ -400,6 +400,23 @@ class cmd_domain_backup_restore(cmd_fsmo_seize): samdb.modify(m) + def get_backup_type(self, samdb): + res = samdb.search(base=ldb.Dn(samdb, "@SAMBA_DSDB"), + scope=ldb.SCOPE_BASE, + attrs=['backupRename', 'backupType']) + + # note that the backupType marker won't exist on backups created on + # v4.9. However, we can still infer the type, as only rename and + # online backups are supported on v4.9 + if 'backupType' in res[0]: + backup_type = str(res[0]['backupType']) + elif 'backupRename' in res[0]: + backup_type = "rename" + else: + backup_type = "online" + + return backup_type + def run(self, sambaopts=None, credopts=None, backup_file=None, targetdir=None, newservername=None, host_ip=None, host_ip6=None, site=None): @@ -445,6 +462,7 @@ class cmd_domain_backup_restore(cmd_fsmo_seize): private_dir = os.path.join(targetdir, 'private') samdb_path = os.path.join(private_dir, 'sam.ldb') samdb = SamDB(url=samdb_path, session_info=system_session(), lp=lp) + backup_type = self.get_backup_type(samdb) if site is None: # There's no great way to work out the correct site to add the @@ -480,8 +498,7 @@ class cmd_domain_backup_restore(cmd_fsmo_seize): # Get the SID saved by the backup process and create account res = samdb.search(base=ldb.Dn(samdb, "@SAMBA_DSDB"), scope=ldb.SCOPE_BASE, - attrs=['sidForRestore', 'backupRename']) - is_rename = True if 'backupRename' in res[0] else False + attrs=['sidForRestore']) sid = res[0].get('sidForRestore')[0] logger.info('Creating account with SID: ' + str(sid)) ctx.join_add_objects(specified_sid=dom_sid(str(sid))) @@ -497,7 +514,7 @@ class cmd_domain_backup_restore(cmd_fsmo_seize): # if we renamed the backed-up domain, then we need to add the DNS # objects for the new realm (we do this in the restore, now that we # know the new DC's IP address) - if is_rename: + if backup_type == "rename": self.register_dns_zone(logger, samdb, lp, ctx.ntds_guid, host_ip, host_ip6, site) -- 2.34.1