Skip to content

Commit b355737

Browse files
authored
Fixes 0.3.1 (#27)
* Fix: backups can fail if the backupPath has any symbolic link in the path * Fix S3 creating weird folders * Fix FTP/FTPS/SFTP several failures related to create_folder and list_directory * Fix uploading backup was creating bad folders * Version 0.3.1 * Refactor load_secrets code into a function (cherry picked from commit 4f05319) Signed-off-by: melchor629 <melchor9000@gmail.com> * Fix upload only does not get storages from secret backends (cherry picked from commit a115b22) Signed-off-by: melchor629 <melchor9000@gmail.com>
1 parent 49af3bd commit b355737

File tree

6 files changed

+23
-14
lines changed

6 files changed

+23
-14
lines changed

mdbackup/__main__.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from .storage import create_storage_instance
3737

3838

39-
def main_do_backup(logger: logging.Logger, config: Config) -> Path:
39+
def main_load_secrets(logger: logging.Logger, config: Config):
4040
# Prepare secret backends (if any) and its env getters (aka functions that gets the right value from the backend)
4141
try:
4242
secret_backends = [(get_secret_backend_implementation(secret.type, secret.config), secret)
@@ -71,6 +71,10 @@ def main_do_backup(logger: logging.Logger, config: Config) -> Path:
7171
for secret_backend, _ in secret_backends:
7272
del secret_backend
7373

74+
return secret_env
75+
76+
77+
def main_do_backup(logger: logging.Logger, config: Config, secret_env) -> Path:
7478
# Do backups
7579
try:
7680
cypher_items = config.cypher_params.items() if config.cypher_params is not None else []
@@ -147,7 +151,7 @@ def main_upload_backup(logger: logging.Logger, config: Config, backup: Path):
147151
# Create folder for this backup
148152
try:
149153
logger.info(f'Creating folder {backup_folder_name} in {prov_config.backups_path}')
150-
backup_cloud_folder = storage.create_folder(backup_folder_name, prov_config.backups_path)
154+
backup_cloud_folder = storage.create_folder(backup_folder_name)
151155
except Exception as e:
152156
# If we cannot create it, will continue to the next configured provider
153157
run_hook('upload:error', prov_config.type, str(backup), str(e))
@@ -262,14 +266,17 @@ def main():
262266

263267
try:
264268
if args.backup_only:
265-
backup = main_do_backup(logger, config)
269+
secret_env = main_load_secrets(logger, config)
270+
backup = main_do_backup(logger, config, secret_env)
266271
logger.info(f'Backup done: {backup.absolute()}')
267272
elif args.upload_current_only:
273+
main_load_secrets(logger, config)
268274
main_upload_backup(logger, config, (config.backups_path / 'current').resolve())
269275
elif args.cleanup_only:
270276
main_clean_up(logger, config)
271277
else:
272-
backup = main_do_backup(logger, config)
278+
secret_env = main_load_secrets(logger, config)
279+
backup = main_do_backup(logger, config, secret_env)
273280
main_upload_backup(logger, config, backup)
274281
main_clean_up(logger, config)
275282
except Exception as e:

mdbackup/backup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def generate_backup_path(backups_folder: Path) -> Path:
3535
"""
3636
now = datetime.utcnow()
3737
isostring = now.isoformat(timespec='minutes')
38-
return Path(backups_folder, isostring)
38+
return Path(backups_folder, isostring).resolve()
3939

4040

4141
def get_steps_scripts() -> List[Path]:

mdbackup/storage/ftp.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,19 @@ def _create_connection(self, params: StorageConfig):
4646

4747
def list_directory(self, path: Union[str, Path]) -> List[str]:
4848
self.__log.debug(f'Retrieving contents of directory {path}')
49-
return [str(filename) for (filename, _) in self.__conn.mlsd(self.__dir / path)][2:]
49+
return [str(filename) for (filename, _) in self.__conn.mlsd(str(self.__dir / path))][2:]
5050

51-
def create_folder(self, name: str, parent: Union[Path, str] = None) -> str:
51+
def create_folder(self, name: str, parent: Union[Path, str] = '.') -> str:
5252
path = self.__dir / parent
5353
self.__conn.cwd(str(path))
5454
if name not in self.list_directory(parent):
5555
self.__log.info(f'Creating folder "{path / name}"')
5656
self.__conn.mkd(name)
5757
else:
5858
self.__log.debug(f'Folder "{path / name}"" already exists')
59-
return str(path / name)
59+
return str((path / name).relative_to(self.__dir))
6060

61-
def upload(self, path: Path, parent: Union[Path, str] = None):
61+
def upload(self, path: Path, parent: Union[Path, str] = '.'):
6262
dir_path = self.__dir / parent
6363
self.__conn.cwd(str(dir_path))
6464
with open(str(path), 'rb') as file_to_upload:

mdbackup/storage/s3.py

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def list_directory(self, path: Union[str, Path]) -> List[str]:
6363

6464
def create_folder(self, name: str, parent: Union[Path, str, str] = None) -> str:
6565
parent = parent if parent is not None else ''
66+
parent = parent[:-1] if parent.endswith('/') else parent
6667
key = f'{parent}/{name}/'
6768
if key.startswith('/'):
6869
key = key[1:]

mdbackup/storage/sftp.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,21 @@ def _create_connection(self, params: StorageConfig) -> SFTPClient:
7474
return self.__ssh.open_sftp()
7575

7676
def list_directory(self, path: Union[str, Path]) -> List[str]:
77+
path = self.__dir / path
7778
self.__log.debug(f'Retrieving contents of directory {path}')
78-
return self.__conn.listdir(path)
79+
return self.__conn.listdir(str(path))
7980

80-
def create_folder(self, name: str, parent: Union[Path, str] = None) -> str:
81+
def create_folder(self, name: str, parent: Union[Path, str] = '.') -> str:
8182
path = self.__dir / parent
8283
self.__conn.chdir(str(path))
8384
if name not in self.list_directory(parent):
8485
self.__log.info(f'Creating folder "{path / name}"')
8586
self.__conn.mkdir(name)
8687
else:
8788
self.__log.debug(f'Folder "{path / name}"" already exists')
88-
return str(path / name)
89+
return str((path / name).relative_to(self.__dir))
8990

90-
def upload(self, path: Path, parent: Union[Path, str] = None):
91+
def upload(self, path: Path, parent: Union[Path, str] = '.'):
9192
dir_path = self.__dir / parent
9293
self.__conn.chdir(str(dir_path))
9394
self.__log.info(f'Uploading file {path} to {parent}')

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setuptools.setup(
77
name="mdbackup",
8-
version="0.3.0",
8+
version="0.3.1",
99
author="majorcadevs (melchor9000 & amgxv)",
1010
author_email="melchor9000@gmail.com",
1111
description="Small but customizable utility to create backups and store them in cloud storage providers",

0 commit comments

Comments
 (0)