diff options
author | owsla <owsla@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109> | 2008-10-02 03:46:02 +0000 |
---|---|---|
committer | owsla <owsla@2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109> | 2008-10-02 03:46:02 +0000 |
commit | d041352936e900a2d88df8916d6e7497ce56251b (patch) | |
tree | 2f39c81c3d9bdcd5f6a505139ff48d936604cdad /rdiff-backup/rdiff_backup/fs_abilities.py | |
parent | fb7e092ce9685b917e35625aaebde3c514dfad24 (diff) | |
download | rdiff-backup-d041352936e900a2d88df8916d6e7497ce56251b.tar.gz |
Add error handling and logging to Windows ACL support; fixes Windows backup to
SMB share. Improve test in fs_abilities to determine if Windows ACLs are
supported.
git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup/trunk@944 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
Diffstat (limited to 'rdiff-backup/rdiff_backup/fs_abilities.py')
-rw-r--r-- | rdiff-backup/rdiff_backup/fs_abilities.py | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/rdiff-backup/rdiff_backup/fs_abilities.py b/rdiff-backup/rdiff_backup/fs_abilities.py index a012a04..3a3f32b 100644 --- a/rdiff-backup/rdiff_backup/fs_abilities.py +++ b/rdiff-backup/rdiff_backup/fs_abilities.py @@ -122,7 +122,7 @@ class FSAbilities: self.read_only = 1 self.set_eas(rp, 0) self.set_acls(rp) - self.set_win_acls(rp) + self.set_win_acls(rp, 0) self.set_resource_fork_readonly(rp) self.set_carbonfile() self.set_case_sensitive_readonly(rp) @@ -154,7 +154,7 @@ class FSAbilities: self.set_fsync_dirs(subdir) self.set_eas(subdir, 1) self.set_acls(subdir) - self.set_win_acls(subdir) + self.set_win_acls(subdir, 1) self.set_dir_inc_perms(subdir) self.set_resource_fork_readwrite(subdir) self.set_carbonfile() @@ -368,27 +368,53 @@ class FSAbilities: self.eas = 0 except AssertionError: log.Log("Extended attributes support is broken on filesystem at " - "%s. Please upgrade the filesystem driver, contact the " - "developers, or use the --no-eas option to disable " - "extended attributes support and suppress this message." + "%s.\nPlease upgrade the filesystem driver, contact the " + "developers,\nor use the --no-eas option to disable " + "extended attributes\nsupport and suppress this message." % (rp.path,), 1) self.eas = 0 else: self.eas = 1 - def set_win_acls(self, dir_rp): + def set_win_acls(self, dir_rp, write): """Test if windows access control lists are supported""" + assert Globals.local_connection is dir_rp.conn + assert dir_rp.lstat() try: - import win32security + import win32security, pywintypes except ImportError: log.Log("Unable to import win32security module. Windows ACLs\n" "not supported by filesystem at %s" % dir_rp.path, 4) self.win_acls = 0 return try: + sd = win32security.GetNamedSecurityInfo(dir_rp.path, + win32security.SE_FILE_OBJECT, + win32security.OWNER_SECURITY_INFORMATION | + win32security.GROUP_SECURITY_INFORMATION | + win32security.DACL_SECURITY_INFORMATION) + acl = sd.GetSecurityDescriptorDacl() + n = acl.GetAceCount() + if write: + win32security.SetNamedSecurityInfo(dir_rp.path, + win32security.SE_FILE_OBJECT, + win32security.OWNER_SECURITY_INFORMATION | + win32security.GROUP_SECURITY_INFORMATION | + win32security.DACL_SECURITY_INFORMATION, + sd.GetSecurityDescriptorOwner(), + sd.GetSecurityDescriptorGroup(), + sd.GetSecurityDescriptorDacl(), + None) + except (OSError, AttributeError, pywintypes.error): + log.Log("Unable to load a Windows ACL.\nWindows ACLs not supported " + "by filesystem at %s" % dir_rp.path, 4) + self.win_acls = 0 + return + + try: win_acls.init_acls() - except OSError: - log.Log("Windows ACLs not supported by filesystem\n" - "at %s" % dir_rp.path, 4) + except (OSError, AttributeError, pywintypes.error): + log.Log("Unable to init win_acls.\nWindows ACLs not supported by " + "filesystem at %s" % dir_rp.path, 4) self.win_acls = 0 return self.win_acls = 1 @@ -414,7 +440,7 @@ class FSAbilities: try: import Carbon.File import MacOS - except: + except (ImportError, AttributeError): self.carbonfile = 0 return |