Добавил модуль для работы с ZFS снапшотами

This commit is contained in:
2026-02-10 01:17:06 +03:00
parent cf1cce3822
commit 40bf9f9887
4 changed files with 410 additions and 2 deletions

View File

@@ -21,6 +21,12 @@ if not logger.handlers:
logger.addHandler(handler)
logger.setLevel(logging.INFO)
# Ожидаемые «ошибки» ZFS при бэкапе — не логируем WARNING при suppress_warnings=True
KNOWN_ZFS_ERRORS = (
"dataset already exists",
"not an earlier snapshot from the same fs",
)
class SSHBase:
"""
@@ -115,7 +121,7 @@ class SSHBase:
logger.error(f"Неожиданная ошибка при подключении к {self.hostname}:{self.port}: {e}")
raise Exception(f"Неожиданная ошибка при подключении: {e}")
def cmd(self, command: str, sleep: float = 0.1, out_to_print: bool = False) -> List[str]:
def cmd(self, command: str, sleep: float = 0.1, out_to_print: bool = False, suppress_warnings: bool = False) -> List[str]:
"""
Выполнение команды на удаленном сервере
@@ -123,6 +129,8 @@ class SSHBase:
command: Команда для выполнения
sleep: Задержка после выполнения команды (секунды)
out_to_print: Не используется (оставлено для обратной совместимости)
suppress_warnings: Если True и stderr содержит ожидаемые ZFS-сообщения (KNOWN_ZFS_ERRORS),
не логировать WARNING (для чистых логов бэкапа).
Returns:
list: [stdout, stderr] - вывод команды и ошибки
@@ -156,7 +164,11 @@ class SSHBase:
# Если команда завершилась с ошибкой, добавляем информацию в stderr
if exit_status != 0:
logger.warning(f"Команда завершилась с кодом возврата {exit_status}: {command}")
skip_warning = suppress_warnings and any(
err in stderr_data.lower() for err in KNOWN_ZFS_ERRORS
)
if not skip_warning:
logger.warning(f"Команда завершилась с кодом возврата {exit_status}: {command}")
if not stderr_data.strip():
stderr_data = f"Команда завершилась с кодом возврата {exit_status}"
else: