rdiff-backup-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Rdiff-backup-commits] rdiff-backup CHANGELOG dist/makedist rdiff_back..


From: Andrew Ferguson
Subject: [Rdiff-backup-commits] rdiff-backup CHANGELOG dist/makedist rdiff_back...
Date: Wed, 02 Jul 2008 18:03:23 +0000

CVSROOT:        /sources/rdiff-backup
Module name:    rdiff-backup
Changes by:     Andrew Ferguson <owsla> 08/07/02 18:03:23

Modified files:
        .              : CHANGELOG 
        dist           : makedist 
        rdiff_backup   : Globals.py connection.py fs_abilities.py 
                         metadata.py rpath.py 

Log message:
        Support for Windows ACLs. (Patch from Josh Nisly and Fred Gansevles)

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/CHANGELOG?cvsroot=rdiff-backup&r1=1.281&r2=1.282
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/dist/makedist?cvsroot=rdiff-backup&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/rdiff_backup/Globals.py?cvsroot=rdiff-backup&r1=1.45&r2=1.46
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/rdiff_backup/connection.py?cvsroot=rdiff-backup&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/rdiff_backup/fs_abilities.py?cvsroot=rdiff-backup&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/rdiff_backup/metadata.py?cvsroot=rdiff-backup&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/rdiff-backup/rdiff_backup/rpath.py?cvsroot=rdiff-backup&r1=1.121&r2=1.122

Patches:
Index: CHANGELOG
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/CHANGELOG,v
retrieving revision 1.281
retrieving revision 1.282
diff -u -b -r1.281 -r1.282
--- CHANGELOG   27 Jun 2008 18:04:07 -0000      1.281
+++ CHANGELOG   2 Jul 2008 18:03:22 -0000       1.282
@@ -1,6 +1,8 @@
 New in v1.1.17 (????/??/??)
 ---------------------------
 
+Support for Windows ACLs. (Patch from Josh Nisly and Fred Gansevles)
+
 Fix user_group.py to run on native Windows, which lacks grp and pwd Python
 modules. (Patch from Fred Gansevles)
 

Index: dist/makedist
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/dist/makedist,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- dist/makedist       23 Jun 2008 02:30:21 -0000      1.29
+++ dist/makedist       2 Jul 2008 18:03:23 -0000       1.30
@@ -118,7 +118,7 @@
                                         "Security.py", "selection.py",
                                         "SetConnections.py", "static.py",
                                         "statistics.py", "TempFile.py", 
"Time.py",
-                                        "user_group.py"]:
+                                        "user_group.py", "win_acls.py"]:
                shutil.copyfile(os.path.join(SourceDir, filename),
                                                os.path.join(tardir, 
"rdiff_backup", filename))
 

Index: rdiff_backup/Globals.py
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/rdiff_backup/Globals.py,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -b -r1.45 -r1.46
--- rdiff_backup/Globals.py     13 Apr 2008 11:25:21 -0000      1.45
+++ rdiff_backup/Globals.py     2 Jul 2008 18:03:23 -0000       1.46
@@ -85,6 +85,12 @@
 acls_write = None
 acls_conn = None
 
+# Like the above, but applies to support of Windows
+# access control lists.
+win_acls_active = None
+win_acls_write = None
+win_acls_conn = None
+
 # Like above two setting groups, but applies to support of Mac OS X
 # style resource forks.
 resource_forks_active = None

Index: rdiff_backup/connection.py
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/rdiff_backup/connection.py,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- rdiff_backup/connection.py  9 Jul 2007 03:53:40 -0000       1.29
+++ rdiff_backup/connection.py  2 Jul 2008 18:03:23 -0000       1.30
@@ -27,7 +27,8 @@
 except ImportError: pass
 try: import posix1e
 except ImportError: pass
-
+try: import win32security
+except ImportError: pass
 
 class ConnectionError(Exception): pass
 class ConnectionReadError(ConnectionError): pass
@@ -539,6 +540,9 @@
           TempFile, SetConnections, librsync, log, regress, fs_abilities, \
           eas_acls, user_group, compare
 
+try: import win_acls
+except ImportError: pass
+
 Globals.local_connection = LocalConnection()
 Globals.connections.append(Globals.local_connection)
 # Following changed by server in SetConnections

Index: rdiff_backup/fs_abilities.py
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/rdiff_backup/fs_abilities.py,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- rdiff_backup/fs_abilities.py        14 Jun 2008 18:17:57 -0000      1.46
+++ rdiff_backup/fs_abilities.py        2 Jul 2008 18:03:23 -0000       1.47
@@ -29,7 +29,7 @@
 
 import errno, os
 import Globals, log, TempFile, selection, robust, SetConnections, \
-          static, FilenameMapping
+          static, FilenameMapping, win_acls
 
 class FSAbilities:
        """Store capabilities of given file system"""
@@ -39,6 +39,7 @@
        ownership = None # True if chown works on this filesystem
        acls = None # True if access control lists supported
        eas = None # True if extended attributes supported
+       win_acls = None # True if windows access control lists supported
        hardlinks = None # True if hard linking supported
        fsync_dirs = None # True if directories can be fsync'd
        dir_inc_perms = None # True if regular files can have full permissions
@@ -97,6 +98,7 @@
                                                           
self.win_reserved_filenames)])
                add_boolean_list([('Access control lists', self.acls),
                                                  ('Extended attributes', 
self.eas),
+                                                 ('Windows access control 
lists', self.win_acls),
                                                  ('Case sensitivity', 
self.case_sensitive),
                                                  ('Escape DOS devices', 
self.escape_dos_devices),
                                                  ('Mac OS X style resource 
forks',
@@ -120,6 +122,7 @@
                self.read_only = 1
                self.set_eas(rp, 0)
                self.set_acls(rp)
+               self.set_win_acls(rp)
                self.set_resource_fork_readonly(rp)
                self.set_carbonfile()
                self.set_case_sensitive_readonly(rp)
@@ -151,6 +154,7 @@
                self.set_fsync_dirs(subdir)
                self.set_eas(subdir, 1)
                self.set_acls(subdir)
+               self.set_win_acls(subdir)
                self.set_dir_inc_perms(subdir)
                self.set_resource_fork_readwrite(subdir)
                self.set_carbonfile()
@@ -364,6 +368,24 @@
                        self.eas = 0
                else: self.eas = 1
 
+       def set_win_acls(self, dir_rp):
+               """Test if windows access control lists are supported"""
+               try:
+                       import win32security
+               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:
+                       win_acls.init_acls()
+               except OSError:
+                       log.Log("Windows ACLs not supported by filesystem\n"
+                                       "at %s" % dir_rp.path, 4)
+                       self.win_acls = 0
+                       return
+               self.win_acls = 1
+
        def set_dir_inc_perms(self, rp):
                """See if increments can have full permissions like a 
directory"""
                test_rp = rp.append('dir_inc_check')
@@ -521,6 +543,10 @@
                        log.Log.FatalError("--never-drop-acls specified, but 
ACL support\n"
                                                           "missing from 
destination filesystem")
 
+       def set_win_acls(self):
+               self.update_triple(self.src_fsa.win_acls, 
self.dest_fsa.win_acls,
+                         ('win_acls_active', 'win_acls_write', 
'win_acls_conn'))
+
        def set_resource_forks(self):
                self.update_triple(self.src_fsa.resource_forks,
                                                   self.dest_fsa.resource_forks,
@@ -729,6 +755,10 @@
        def set_acls(self):
                self.update_triple(self.dest_fsa.acls,
                                                  ('acls_active', 'acls_write', 
'acls_conn'))
+       def set_win_acls(self):
+               self.update_triple(self.src_fsa.win_acls, 
self.dest_fsa.win_acls,
+                         ('win_acls_active', 'win_acls_write', 
'win_acls_conn'))
+
        def set_resource_forks(self):
                self.update_triple(self.dest_fsa.resource_forks,
                                                   ('resource_forks_active',
@@ -754,6 +784,7 @@
        bsg = BackupSetGlobals(rpin.conn, Globals.rbdir.conn, src_fsa, dest_fsa)
        bsg.set_eas()
        bsg.set_acls()
+       bsg.set_win_acls()
        bsg.set_resource_forks()
        bsg.set_carbonfile()
        bsg.set_hardlinks()
@@ -781,6 +812,7 @@
        rsg = RestoreSetGlobals(Globals.rbdir.conn, rpout.conn, src_fsa, 
dest_fsa)
        rsg.set_eas()
        rsg.set_acls()
+       rsg.set_win_acls()
        rsg.set_resource_forks()
        rsg.set_carbonfile()
        rsg.set_hardlinks()

Index: rdiff_backup/metadata.py
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/rdiff_backup/metadata.py,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- rdiff_backup/metadata.py    14 Jun 2008 18:17:57 -0000      1.29
+++ rdiff_backup/metadata.py    2 Jul 2008 18:03:23 -0000       1.30
@@ -433,9 +433,10 @@
 
 class CombinedWriter:
        """Used for simultaneously writting metadata, eas, and acls"""
-       def __init__(self, metawriter, eawriter, aclwriter):
+       def __init__(self, metawriter, eawriter, aclwriter, winaclwriter):
                self.metawriter = metawriter
-               self.eawriter, self.aclwriter = eawriter, aclwriter # these can 
be None
+               self.eawriter, self.aclwriter, self.winaclwriter = \
+                               eawriter, aclwriter, winaclwriter # these can 
be None
 
        def write_object(self, rorp):
                """Write information in rorp to all the writers"""
@@ -444,11 +445,14 @@
                        self.eawriter.write_object(rorp.get_ea())
                if self.aclwriter and not rorp.get_acl().is_basic():
                        self.aclwriter.write_object(rorp.get_acl())
+               if self.winaclwriter:
+                       self.winaclwriter.write_object(rorp.get_win_acl())
 
        def close(self):
                self.metawriter.close()
                if self.eawriter: self.eawriter.close()
                if self.aclwriter: self.aclwriter.close()
+               if self.winaclwriter: self.winaclwriter.close()
 
 
 class Manager:
@@ -456,6 +460,7 @@
        meta_prefix = 'mirror_metadata'
        acl_prefix = 'access_control_lists'
        ea_prefix = 'extended_attributes'
+       wacl_prefix = 'win_access_control_lists'
 
        def __init__(self):
                """Set listing of rdiff-backup-data dir"""
@@ -501,6 +506,11 @@
                return self._iter_helper(self.acl_prefix,
                                          eas_acls.AccessControlListFile, time, 
restrict_index)
 
+       def get_win_acls_at_time(self, time, restrict_index):
+               """Return WACLs iter at given time from recordfile (or None)"""
+               return self._iter_helper(self.wacl_prefix,
+                                         win_acls.WinAccessControlListFile, 
time, restrict_index)
+
        def GetAtTime(self, time, restrict_index = None):
                """Return combined metadata iter with ea/acl info if 
necessary"""
                cur_iter = self.get_meta_at_time(time, restrict_index)
@@ -521,6 +531,14 @@
                                log.Log("Warning: Extended Attributes file not 
found", 2)
                                ea_iter = iter([])
                        cur_iter = eas_acls.join_ea_iter(cur_iter, ea_iter)
+               if Globals.win_acls_active:
+                       wacl_iter = self.get_win_acls_at_time(time, 
restrict_index)
+                       if not wacl_iter:
+                               log.Log("Warning: Windows Access Control List 
file not"
+                                               " found.", 2)
+                               wacl_iter = iter([])
+                       cur_iter = win_acls.join_wacl_iter(cur_iter, wacl_iter)
+
                return cur_iter
 
        def _writer_helper(self, prefix, flatfileclass, typestr, time):
@@ -548,17 +566,26 @@
                return self._writer_helper(self.acl_prefix,
                                                 
eas_acls.AccessControlListFile, typestr, time)
 
+       def get_win_acl_writer(self, typestr, time):
+               """Return WinAccessControlListFile opened for writing"""
+               return self._writer_helper(self.wacl_prefix,
+                                                
win_acls.WinAccessControlListFile, typestr, time)
+
        def GetWriter(self, typestr = 'snapshot', time = None):
                """Get a writer object that can write meta and possibly 
acls/eas"""
                metawriter = self.get_meta_writer(typestr, time)
-               if not Globals.eas_active and not Globals.acls_active:
+               if not Globals.eas_active and not Globals.acls_active and \
+                               not Globals.win_acls_active:
                        return metawriter # no need for a CombinedWriter
 
                if Globals.eas_active: ea_writer = self.get_ea_writer(typestr, 
time)
                else: ea_writer = None
                if Globals.acls_active: acl_writer = 
self.get_acl_writer(typestr, time)
                else: acl_writer = None
-               return CombinedWriter(metawriter, ea_writer, acl_writer)
+               if Globals.win_acls_active: win_acl_writer = \
+                               self.get_win_acl_writer(typestr, time)
+               else: win_acl_writer = None
+               return CombinedWriter(metawriter, ea_writer, acl_writer, 
win_acl_writer)
 
 class PatchDiffMan(Manager):
        """Contains functions for patching and diffing metadata
@@ -663,4 +690,4 @@
        return ManagerObj
 
 
-import eas_acls # put at bottom to avoid python circularity bug
+import eas_acls, win_acls # put at bottom to avoid python circularity bug

Index: rdiff_backup/rpath.py
===================================================================
RCS file: /sources/rdiff-backup/rdiff-backup/rdiff_backup/rpath.py,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -b -r1.121 -r1.122
--- rdiff_backup/rpath.py       26 Jun 2008 03:19:14 -0000      1.121
+++ rdiff_backup/rpath.py       2 Jul 2008 18:03:23 -0000       1.122
@@ -185,6 +185,7 @@
        rpout.chmod(rpin.getperms())
        if Globals.acls_write: rpout.write_acl(rpin.get_acl())
        if not rpin.isdev(): rpout.setmtime(rpin.getmtime())
+       if Globals.win_acls_write: rpout.write_win_acl(rpin.get_win_acl())
 
 def copy_attribs_inc(rpin, rpout):
        """Change file attributes of rpout to match rpin
@@ -358,6 +359,7 @@
                        elif key == 'size' and not self.isreg(): pass
                        elif key == 'ea' and not Globals.eas_active: pass
                        elif key == 'acl' and not Globals.acls_active: pass
+                       elif key == 'win_acl' and not Globals.win_acls_active: 
pass
                        elif key == 'carbonfile' and not 
Globals.carbonfile_active: pass
                        elif key == 'resourcefork' and not 
Globals.resource_forks_active:
                                pass
@@ -398,6 +400,7 @@
                        elif key == 'inode': pass
                        elif key == 'ea' and not Globals.eas_write: pass
                        elif key == 'acl' and not Globals.acls_write: pass
+                       elif key == 'win_acl' and not Globals.win_acls_write: 
pass
                        elif key == 'carbonfile' and not 
Globals.carbonfile_write: pass
                        elif key == 'resourcefork' and not 
Globals.resource_forks_write:
                                pass
@@ -415,8 +418,8 @@
 
        def equal_verbose(self, other, check_index = 1,
                                          compare_inodes = 0, compare_ownership 
= 0,
-                                         compare_acls = 0, compare_eas = 0, 
compare_size = 1,
-                                         compare_type = 1, verbosity = 2):
+                                         compare_acls = 0, compare_eas = 0, 
compare_win_acls = 0,
+                                         compare_size = 1, compare_type = 1, 
verbosity = 2):
                """Like __eq__, but log more information.  Useful when 
testing"""
                if check_index and self.index != other.index:
                        log.Log("Index %s != index %s" % (self.index, 
other.index),
@@ -437,6 +440,7 @@
                                pass
                        elif key == 'ea' and not compare_eas: pass
                        elif key == 'acl' and not compare_acls: pass
+                       elif key == 'win_acl' and not compare_win_acls: pass
                        elif (not other.data.has_key(key) or
                                  self.data[key] != other.data[key]):
                                if not other.data.has_key(key):
@@ -454,7 +458,8 @@
                return self.equal_verbose(other,
                                                                  
compare_inodes = compare_inodes,
                                                                  compare_eas = 
Globals.eas_active,
-                                                                 compare_acls 
= Globals.acls_active)
+                                                                 compare_acls 
= Globals.acls_active,
+                                                                 
compare_win_acls = Globals.win_acls_active)
                                                         
        def __ne__(self, other): return not self.__eq__(other)
 
@@ -702,6 +707,17 @@
                """Record resource fork in dictionary.  Does not write"""
                self.data['resourcefork'] = rfork
 
+       def set_win_acl(self, acl):
+               """Record Windows access control list in dictionary. Does not 
write"""
+               self.data['win_acl'] = acl
+
+       def get_win_acl(self):
+               """Return access control list object from dictionary"""
+               try: return self.data['win_acl']
+               except KeyError:
+                       acl = self.data['win_acl'] = 
get_blank_win_acl(self.index)
+                       return acl
+
        def has_alt_mirror_name(self):
                """True if rorp has an alternate mirror name specified"""
                return self.data.has_key('mirrorname')
@@ -1316,6 +1332,16 @@
                assert not fp.close()
                self.set_resource_fork(rfork_data)
 
+       def get_win_acl(self):
+               """Return Windows access control list, setting if necessary"""
+               try: acl = self.data['win_acl']
+               except KeyError: acl = self.data['win_acl'] = win_acl_get(self)
+               return acl
+
+       def write_win_acl(self, acl):
+               """Change access control list of rp"""
+               write_win_acl(self, acl)
+               self.data['win_acl'] = acl
 
 class RPathFileHook:
        """Look like a file, but add closing hook"""
@@ -1406,6 +1432,8 @@
        rpath.data['gname'] = user_group.gid2gname(rpath.data['gid'])
        if Globals.eas_conn: rpath.data['ea'] = ea_get(rpath)
        if Globals.acls_conn: rpath.data['acl'] = acl_get(rpath)
+       if Globals.win_acls_conn:
+               rpath.data['win_acl'] = win_acl_get(rpath)
        if Globals.resource_forks_conn and rpath.isreg():
                rpath.get_resource_fork()
        if Globals.carbonfile_conn and rpath.isreg():
@@ -1439,3 +1467,7 @@
 def get_blank_acl(index): assert 0
 def ea_get(rp): assert 0
 def get_blank_ea(index): assert 0
+
+def win_acl_get(rp): assert 0
+def write_win_acl(rp): assert 0
+def get_blank_win_acl(): assert 0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]