def backup_mount(self, service_name, container, mount): mount_path = path.join( self.mounts_path, encode_service.str_encode(mount['Source'] + ':' + mount['Destination'])) backup_path = path.join( self.repo, service_name, encode_service.str_encode(mount['Destination'])) borg = None if path.exists(backup_path): borg = Borg(backup_path, passphrase=self.passphrase, verbose=self.verbose) else: borg = Borg.init(backup_path, passphrase=self.passphrase, verbose=self.verbose) data_type = self.get_data_type(container) if data_type != 'raw' and trim_path( self.handlers[data_type]['data']) == trim_path( mount['Destination']): return handler_service.backup_mount(borg, self.mounts_path, container, mount, data_type, handlers=self.handlers, verbose=self.verbose) return raw_service.backup_mount(borg, self.mounts_path, container, mount)
def restore_mount(self, service_name, container, mount, restore_time=None): mount_path = path.join( self.mounts_path, encode_service.str_encode(mount['Source'] + ':' + mount['Destination'])) backup_path = path.join( self.repo, service_name, encode_service.str_encode(mount['Destination'])) if not path.exists(backup_path): print('Backup does not exist for mount \'' + mount['Destination'] + '\' in service \'' + service_name + '\'') return borg = Borg(backup_path, passphrase=self.passphrase, verbose=self.verbose) data_type = self.get_data_type(container) if data_type != 'raw' and trim_path( self.handlers[data_type]['data']) == trim_path( mount['Destination']): return handler_service.restore_mount(borg, self.mounts_path, container, mount, data_type, handlers=self.handlers, restore_time=restore_time, verbose=self.verbose) return raw_service.restore_mount(borg, self.mounts_path, container, mount, restore_time)
def restore_mount(borg, mounts_path, container, mount, data_type, handlers=None, restore_time=None, verbose=None): image = container['Config']['Image'].encode('utf8') mount_path = path.join(mounts_path, encode_service.str_encode(mount['Source'] + ':' + mount['Destination'])) if not handlers: handlers = get_handlers() dump_path = path.join(mount_path, handlers[data_type]['dump']) timestamp = find_timestamp(restore_time, mount['Destination'], image, borg=borg) backup_name = encode_service.encode_backup_name(timestamp, mount['Destination'], image) extract_path = get_unique_path(mount_path) extract_from = borg.list(backup_name)[0] contents_path = path.join(extract_path, extract_from) os.makedirs(extract_path) os.makedirs(dump_path) borg.extract(backup_name, extract_path, extract_from) os.remove(path.join(contents_path, config.CONFIG_FILENAME)) copy_tree(contents_path, dump_path) shutil.rmtree(extract_path) if verbose: response = docker_service.execute(container['Id'], handlers[data_type]['restore']) print('\n*****************') print(handlers[data_type]['restore']) print(response) print('*****************\n') sys.stdout.flush() shutil.rmtree(dump_path)
def backup_mount(borg, mounts_path, container, mount, data_type, handlers=None, verbose=None): image = container['Config']['Image'].encode('utf8') mount_path = path.join(mounts_path, encode_service.str_encode(mount['Source'] + ':' + mount['Destination'])) if not handlers: handlers = get_handlers() dump_path = path.join(mount_path, handlers[data_type]['dump']) sys.stdout.flush() timestamp = time.time() backup_name = encode_service.encode_backup_name(timestamp, mount['Destination'], image) if not path.isdir(mount_path): raise MountPathNotFound(mount_path) os.makedirs(dump_path) response = docker_service.execute(container['Id'], handlers[data_type]['backup']) if verbose: print('\n*****************') print(handlers[data_type]['backup']) print(response) print('*****************\n') sys.stdout.flush() with open(path.join(dump_path, config.CONFIG_FILENAME), 'w') as f: yaml.dump({ 'source': mount['Source'].encode('utf8'), 'destination': mount['Destination'].encode('utf8'), 'timestamp': timestamp, 'data_type': 'raw', 'image': image }, f, default_flow_style=False) borg.create(backup_name, dump_path) shutil.rmtree(dump_path)
def get_handlers(): handlers = {} for handler_path in glob(path.abspath(path.join(path.dirname(path.realpath(__file__)), '../', 'handlers', '*.yml'))): loader_path = re.sub(r'[^\/]+$', '', handler_path) matches = re.findall(r'[^\/]+$', handler_path) if len(matches) <= 0: exit('Houston, we have a problem') filename = matches[0] variables = {} dump = 'volback-unique-' + encode_service.str_encode(str(time.time())) with open(handler_path, 'r') as f: data = yaml.load(f) for key in _.keys(data): variables[key] = data[key]['variables'] if 'variables' in data[key] else {} variables[key]['dump_path'] = path.join(data[key]['data'], dump) variables['env'] = os.environ env = Environment(loader=FileSystemLoader(loader_path), trim_blocks=True) template = env.get_template(filename) data = yaml.load(template.render(**variables)) for key in _.keys(data): handlers[key] = { 'data': data[key]['data'], 'backup': data[key]['backup'], 'restore': data[key]['restore'], 'dump': dump } return handlers
def restore_mount(borg, mounts_path, container, mount, restore_time=None): image = container['Config']['Image'].encode('utf8') mount_path = path.join(mounts_path, encode_service.str_encode(mount['Source'] + ':' + mount['Destination'])) timestamp = find_timestamp(restore_time, mount['Destination'], image, borg=borg) backup_name = encode_service.encode_backup_name(timestamp, mount['Destination'], image) extract_path = get_unique_path(mount_path) extract_from = borg.list(backup_name)[0] contents_path = path.join(extract_path, extract_from) if not path.exists(extract_path): os.makedirs(extract_path) borg.extract(backup_name, extract_path, extract_from) os.remove(path.join(contents_path, config.CONFIG_FILENAME)) copy_tree(contents_path, mount_path) shutil.rmtree(extract_path)
def backup_mount(borg, mounts_path, container, mount): image = container['Config']['Image'].encode('utf8') mount_path = path.join(mounts_path, encode_service.str_encode(mount['Source'] + ':' + mount['Destination'])) timestamp = time.time() backup_name = encode_service.encode_backup_name(timestamp, mount['Destination'], image) if not path.isdir(mount_path): raise MountPathNotFound(mount_path) with open(path.join(mount_path, config.CONFIG_FILENAME), 'w') as f: yaml.dump({ 'source': mount['Source'].encode('utf8'), 'destination': mount['Destination'].encode('utf8'), 'timestamp': timestamp, 'data_type': 'raw', 'image': image }, f, default_flow_style=False) sys.stdout.flush() borg.create(backup_name, mount_path) os.remove(path.join(mount_path, config.CONFIG_FILENAME))
def get_unique_path(parent_path): unique_path = path.join(parent_path, 'volback-unique-' + encode_service.str_encode(str(time.time()))) if path.exists(unique_path): unique_path = get_unique_path(unique_path) return unique_path