import logging
import datetime
import binascii
+import operator
import os
+import copy
import shutil
import re
import stat
u'type': ptype,
u'path': unicode(path),
u'mode': mode,
- u'mtime': stinfo.st_mtime,
- u'ctime': stinfo.st_ctime,
+ u'mtime': int(stinfo.st_mtime),
+ u'ctime': int(stinfo.st_ctime),
u'uid': stinfo.st_uid,
u'gid': stinfo.st_gid,
u'inode': stinfo.st_ino,
'''
Return if the dicts are equal in the stat keys
'''
- keys = [u'gid', u'type', u'mode',u'size', u'uid',
+ keys = [u'gid', u'type', u'mode',u'size', u'uid', u'mtime', u'ctime',
# TODO: check how to restore this correctly if possible
- #u'mtime', u'ctime', u'inode'
+ # u'inode'
]
if (not d1 and d2 != None) or (d1 != None and not d2):
helper.delete(upath)
helper.restore(ipath, l_no)
+ helper.restore_directories_permissions()
os.chdir(cwd)
helper.cleanup()
_cwd = None
+ # list of directories to be restored. This is done as a last step, see
+ # tarfile.extractall for details.
+ _directories = []
+
def __init__(self, deltatar, cwd, index_list):
'''
Constructor opens the tars and init the data structures.
Index list must be provided in reverse order (newer first)
'''
self._data = []
+ self._directories = []
self._deltatar = deltatar
self._cwd = cwd
# we go from index to index, finding the path in the index, then finding
# the index with the most recent snapshot of the file being restored
cur_index = 1
-
while cur_index < len(self._data):
data = self._data[cur_index]
it = data['iterator']
self._deltatar.logger.warn(('Error restoring file %s from index, '
'snapshot not found in any index') % path)
+ def restore_directories_permissions(self):
+ '''
+ Restore directory permissions when everything have been restored
+ '''
+ self._directories.sort(key=operator.attrgetter('name'))
+ self._directories.reverse()
+ tarobj = self._data[0]['tarobj']
+
+ # Set correct owner, mtime and filemode on directories.
+ for member in self._directories:
+ dirpath = member.name
+ try:
+ tarobj.chmod(member, dirpath)
+ tarobj.utime(member, dirpath)
+ tarobj.chown(member, dirpath)
+ except tarfile.ExtractError, e:
+ self._deltatar.logger.warn('tarfile: %s' % e)
+
@classmethod
def new_volume_handler(deltarobj, cwd, backup_path, tarobj, base_name, volume_number):
'''
member.path = unprefixed
member.name = unprefixed
+
+ if op_type == 'directory':
+ self._directories.append(member)
+ member = copy.copy(member)
+ member.mode = 0700
+
# finally, restore the file
- index_data['tarobj'].extract(member)
\ No newline at end of file
+ index_data['tarobj'].extract(member)