diff --git a/app/backup.py b/app/backup.py index a2758ec..0e4d6d5 100644 --- a/app/backup.py +++ b/app/backup.py @@ -6,6 +6,26 @@ import re from repo import add_file_and_commit +def get_bcp_file_path(name: str) -> [str, str|None]: + if cfg.bcp.in_folder: + match = re.match(cfg.bcp.folder_name_pattern, name) + if match: + result = match.group(1) + bcp_file_path = os.path.join(cfg.bcp.dir, result, name) + if not os.path.exists(os.path.join(cfg.bcp.dir, result)): + os.makedirs(os.path.join(cfg.bcp.dir, result)) + log.info("create folder %r", result) + else: + log.info("folder %r exists", result) + return bcp_file_path, result + else: + return os.path.join(cfg.bcp.dir, name), None + else: + return os.path.join(cfg.bcp.dir, name), None + + + + def read_device_list() -> dict[str, dict[str, str]]: bcp_dev_file = os.path.join( @@ -106,11 +126,11 @@ def save_mikrotik_bcp(host: str, name: str) -> None: log.warning("Timeout read config from %r", name) return result = "\n".join(result.split("\n")[1:]) - with open(os.path.join(cfg.bcp.dir, name), "w") as f: + bcp_file_name, file_folder = get_bcp_file_path(name) + with open(bcp_file_name, "w") as f: f.write(result) log.info("Backup saved") - - add_file_and_commit(file_name=name) + add_file_and_commit(file_name=name, file_folder=file_folder) def save_snr_bcp(host: str, name: str) -> None: @@ -129,11 +149,11 @@ def save_snr_bcp(host: str, name: str) -> None: elif result == "ReadTimeout": log.warning("Timeout read config from %r", name) return - with open(os.path.join(cfg.bcp.dir, name), "w") as f: + bcp_file_name, file_folder = get_bcp_file_path(name) + with open(bcp_file_name, "w") as f: f.write(result) log.info("Backup saved") - - add_file_and_commit(file_name=name) + add_file_and_commit(file_name=name, file_folder=file_folder) def save_cisco_sb_bcp(host: str, name: str) -> None: @@ -152,10 +172,11 @@ def save_cisco_sb_bcp(host: str, name: str) -> None: elif result == "ReadTimeout": log.warning("Timeout read config from %r", name) return - with open(os.path.join(cfg.bcp.dir, name), "w") as f: + bcp_file_name, file_folder = get_bcp_file_path(name) + with open(bcp_file_name, "w") as f: f.write(result) log.info("Backup saved") - add_file_and_commit(file_name=name) + add_file_and_commit(file_name=name, file_folder=file_folder) def save_cisco_bcp(host: str, name: str) -> None: @@ -174,7 +195,8 @@ def save_cisco_bcp(host: str, name: str) -> None: elif result == "ReadTimeout": log.warning("Timeout read config from %r", name) return - with open(os.path.join(cfg.bcp.dir, name), "w") as f: + bcp_file_name, file_folder = get_bcp_file_path(name) + with open(bcp_file_name, "w") as f: f.write(result) log.info("Backup saved") - add_file_and_commit(file_name=name) + add_file_and_commit(file_name=name, file_folder=file_folder) diff --git a/app/config.py b/app/config.py index 0c4ae27..1c4c7b6 100644 --- a/app/config.py +++ b/app/config.py @@ -59,6 +59,9 @@ class ConfigBcp: file: str = config["bcp"].get("file") pattern: str = config["bcp"].get("pattern") start_at: str = config["bcp"].get("start_at") + in_folder: bool = config["bcp"].getboolean("in_folder") + if in_folder: + folder_name_pattern: str = config["bcp"].get("folder_name_pattern") @dataclass diff --git a/app/config/config-template.ini b/app/config/config-template.ini index 78a9498..7f649dd 100644 --- a/app/config/config-template.ini +++ b/app/config/config-template.ini @@ -35,6 +35,11 @@ file: dev_list.txt pattern:(?P\S+) (?P\d+\.\d+\.\d+\.\d+) (?P\S+) (?P\S+) # Во сколько будет делаться бэкап start_at: 18:59 +# True \ False - Создание папок внутри репозитория. Если False, то все файлы будут сохраняться в корень +in_folder: True +# Регулярное выражение по которому будет парситься имя папки из названия девайса +folder_name_pattern: ^(.*?)- + [net_dev] debug: False diff --git a/app/repo.py b/app/repo.py index 1964383..0ae1136 100644 --- a/app/repo.py +++ b/app/repo.py @@ -52,9 +52,11 @@ def check_bcp_repo(path: str = cfg.bcp.dir) -> None: log.warning("Error: %r", e) -def add_file_and_commit(file_name: str) -> None: +def add_file_and_commit(file_name: str, file_folder: str) -> None: current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") repo = Repo(cfg.bcp.dir) + if file_folder is not None: + file_name = file_folder + "/" + file_name if file_name in repo.untracked_files: repo.git.add(file_name) repo.index.commit("add %s %s" % (file_name, current_time)) @@ -68,6 +70,8 @@ def add_file_and_commit(file_name: str) -> None: log.info("no changed in file %r", file_name) + + def push_to_remote(): repo = Repo(cfg.bcp.dir) remote = repo.remote(name=cfg.git.branch)