1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2024-12-26 01:37:20 +00:00

Manifest: Make sure manifest timestamp is strictly monotonically increasing.

Computer clocks are often not set very accurately set, but borg
assumes manifest timestamps are never going back in time.

Ensure that this is actually the case.
This commit is contained in:
Martin Hostettler 2017-01-30 00:12:28 +01:00
parent d23dbb47ba
commit 6b8cf0aa8c

View file

@ -110,6 +110,7 @@ def __init__(self, key, repository, item_keys=None):
self.repository = repository
self.item_keys = frozenset(item_keys) if item_keys is not None else ITEM_KEYS
self.tam_verified = False
self.timestamp = None
@classmethod
def load(cls, repository, key=None, force_tam_not_required=False):
@ -151,7 +152,13 @@ def load(cls, repository, key=None, force_tam_not_required=False):
def write(self):
if self.key.tam_required:
self.config[b'tam_required'] = True
self.timestamp = datetime.utcnow().isoformat()
# self.timestamp needs to be strictly monotonically increasing. Clocks often are not set correctly
if self.timestamp is None:
self.timestamp = datetime.utcnow().isoformat()
else:
prev_ts = datetime.strptime(self.timestamp, "%Y-%m-%dT%H:%M:%S.%f")
incremented = (prev_ts + timedelta(microseconds=1)).isoformat()
self.timestamp = max(incremented, datetime.utcnow().isoformat())
m = {
'version': 1,
'archives': StableDict((name, StableDict(archive)) for name, archive in self.archives.items()),