[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Rdiff-backup-commits] rdiff-backup CHANGELOG dist/makedist rdiff_back...,
Andrew Ferguson <=