1
0
Fork 0
mirror of https://github.com/borgbackup/borg.git synced 2025-03-04 02:28:34 +00:00

BORG_HOSTNAME_IS_UNIQUE=yes by default.

This commit is contained in:
Marian Beermann 2017-04-01 21:28:41 +02:00
parent d79da81d22
commit bb6b4fde93
6 changed files with 22 additions and 17 deletions

View file

@ -128,6 +128,13 @@ The best check that everything is ok is to run a dry-run extraction::
Changelog Changelog
========= =========
Version 1.1.0b5 (not released)
------------------------------
Compatibility notes:
- BORG_HOSTNAME_IS_UNIQUE is now on by default.
Version 1.1.0b4 (2017-03-27) Version 1.1.0b4 (2017-03-27)
---------------------------- ----------------------------

View file

@ -140,9 +140,10 @@ General:
Main usecase for this is to fully automate ``borg change-passphrase``. Main usecase for this is to fully automate ``borg change-passphrase``.
BORG_DISPLAY_PASSPHRASE BORG_DISPLAY_PASSPHRASE
When set, use the value to answer the "display the passphrase for verification" question when defining a new passphrase for encrypted repositories. When set, use the value to answer the "display the passphrase for verification" question when defining a new passphrase for encrypted repositories.
BORG_HOSTNAME_IS_UNIQUE=yes BORG_HOSTNAME_IS_UNIQUE=no
Use this to assert that your hostname is unique. Borg assumes that it can derive a unique hostname / identity (see ``borg debug info``).
Borg will then automatically remove locks that it could determine to be stale. If this is not the case or you do not want Borg to automatically remove stale locks,
set this to *no*.
BORG_LOGGING_CONF BORG_LOGGING_CONF
When set, use the given filename as INI_-style logging configuration. When set, use the given filename as INI_-style logging configuration.
BORG_RSH BORG_RSH

View file

@ -18,7 +18,7 @@ from .helpers import get_cache_dir, get_security_dir
from .helpers import int_to_bigint, bigint_to_int, bin_to_hex from .helpers import int_to_bigint, bigint_to_int, bin_to_hex
from .helpers import format_file_size from .helpers import format_file_size
from .helpers import safe_ns from .helpers import safe_ns
from .helpers import yes from .helpers import yes, hostname_is_unique
from .helpers import remove_surrogates from .helpers import remove_surrogates
from .helpers import ProgressIndicatorPercent, ProgressIndicatorMessage from .helpers import ProgressIndicatorPercent, ProgressIndicatorMessage
from .item import Item, ArchiveItem, ChunkListEntry from .item import Item, ArchiveItem, ChunkListEntry
@ -187,9 +187,6 @@ class Cache:
self.progress = progress self.progress = progress
self.path = path or os.path.join(get_cache_dir(), repository.id_str) self.path = path or os.path.join(get_cache_dir(), repository.id_str)
self.security_manager = SecurityManager(repository) self.security_manager = SecurityManager(repository)
self.hostname_is_unique = yes(env_var_override='BORG_HOSTNAME_IS_UNIQUE', prompt=False, env_msg=None)
if self.hostname_is_unique:
logger.info('Enabled removal of stale cache locks')
self.do_files = do_files self.do_files = do_files
# Warn user before sending data to a never seen before unencrypted repository # Warn user before sending data to a never seen before unencrypted repository
if not os.path.exists(self.path): if not os.path.exists(self.path):
@ -295,7 +292,7 @@ Chunk index: {0.total_unique_chunks:20d} {0.total_chunks:20d}"""
def open(self, lock_wait=None): def open(self, lock_wait=None):
if not os.path.isdir(self.path): if not os.path.isdir(self.path):
raise Exception('%s Does not look like a Borg cache' % self.path) raise Exception('%s Does not look like a Borg cache' % self.path)
self.lock = Lock(os.path.join(self.path, 'lock'), exclusive=True, timeout=lock_wait, kill_stale_locks=self.hostname_is_unique).acquire() self.lock = Lock(os.path.join(self.path, 'lock'), exclusive=True, timeout=lock_wait, kill_stale_locks=hostname_is_unique()).acquire()
self.rollback() self.rollback()
def close(self): def close(self):

View file

@ -1478,6 +1478,10 @@ def yes(msg=None, false_msg=None, true_msg=None, default_msg=None,
env_var_override = None env_var_override = None
def hostname_is_unique():
return yes(env_var_override='BORG_HOSTNAME_IS_UNIQUE', prompt=False, env_msg=None, default=True)
def ellipsis_truncate(msg, space): def ellipsis_truncate(msg, space):
""" """
shorten a long string by adding ellipsis between it and return it, example: shorten a long string by adding ellipsis between it and return it, example:

View file

@ -8,7 +8,6 @@ import select
import shlex import shlex
import sys import sys
import tempfile import tempfile
import time
import traceback import traceback
import textwrap import textwrap
import time import time
@ -22,7 +21,7 @@ from .helpers import get_home_dir
from .helpers import sysinfo from .helpers import sysinfo
from .helpers import bin_to_hex from .helpers import bin_to_hex
from .helpers import replace_placeholders from .helpers import replace_placeholders
from .helpers import yes from .helpers import hostname_is_unique
from .repository import Repository, MAX_OBJECT_SIZE, LIST_SCAN_LIMIT from .repository import Repository, MAX_OBJECT_SIZE, LIST_SCAN_LIMIT
from .version import parse_version, format_version from .version import parse_version, format_version
from .logger import create_logger from .logger import create_logger
@ -646,8 +645,8 @@ This problem will go away as soon as the server has been upgraded to 1.0.7+.
except AttributeError: except AttributeError:
pass pass
env_vars = [] env_vars = []
if yes(env_var_override='BORG_HOSTNAME_IS_UNIQUE', env_msg=None, prompt=False): if not hostname_is_unique():
env_vars.append('BORG_HOSTNAME_IS_UNIQUE=yes') env_vars.append('BORG_HOSTNAME_IS_UNIQUE=no')
if testing: if testing:
return env_vars + [sys.executable, '-m', 'borg.archiver', 'serve'] + opts + self.extra_test_args return env_vars + [sys.executable, '-m', 'borg.archiver', 'serve'] + opts + self.extra_test_args
else: # pragma: no cover else: # pragma: no cover

View file

@ -17,7 +17,7 @@ from .helpers import Error, ErrorWithTraceback, IntegrityError, format_file_size
from .helpers import Location from .helpers import Location
from .helpers import ProgressIndicatorPercent from .helpers import ProgressIndicatorPercent
from .helpers import bin_to_hex from .helpers import bin_to_hex
from .helpers import yes from .helpers import hostname_is_unique
from .helpers import secure_erase from .helpers import secure_erase
from .locking import Lock, LockError, LockErrorT from .locking import Lock, LockError, LockErrorT
from .logger import create_logger from .logger import create_logger
@ -124,9 +124,6 @@ class Repository:
self.created = False self.created = False
self.exclusive = exclusive self.exclusive = exclusive
self.append_only = append_only self.append_only = append_only
self.hostname_is_unique = yes(env_var_override='BORG_HOSTNAME_IS_UNIQUE', env_msg=None, prompt=False)
if self.hostname_is_unique:
logger.info('Enabled removal of stale repository locks')
def __del__(self): def __del__(self):
if self.lock: if self.lock:
@ -279,7 +276,7 @@ class Repository:
if not os.path.isdir(path): if not os.path.isdir(path):
raise self.DoesNotExist(path) raise self.DoesNotExist(path)
if lock: if lock:
self.lock = Lock(os.path.join(path, 'lock'), exclusive, timeout=lock_wait, kill_stale_locks=self.hostname_is_unique).acquire() self.lock = Lock(os.path.join(path, 'lock'), exclusive, timeout=lock_wait, kill_stale_locks=hostname_is_unique()).acquire()
else: else:
self.lock = None self.lock = None
self.config = ConfigParser(interpolation=None) self.config = ConfigParser(interpolation=None)