#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Примеры использования модуля c1_cluster через единый SSHClient. Паттерн: SSHClient + connect() + set_c1_config() + операции + close() """ import config from modules import SSHClient def example_basic_usage(): """ Пример базового использования модуля c1_cluster """ print("=" * 60) print("Пример 1: Базовое использование модуля c1_cluster") print("=" * 60) cfg = config.get_config() client = SSHClient( hostname=cfg['ssh']['hostname'], port=cfg['ssh']['port'], username=cfg['ssh']['username'], pkey_file=cfg['ssh']['pkey_file'], host_keys=cfg['ssh']['host_keys'], ) client.connect() client.set_c1_config( cfg['c1']['lxc_container_name'], cfg['c1']['cluster_user'], cfg['c1']['cluster_password'], ) version = client.cluster_version() print(f"Версия кластера 1С: {version}") cluster_id = client.cluster_id() print(f"ID кластера 1С: {cluster_id}") client.close() print("\n") def example_get_base_list(): """ Пример получения списка баз данных 1С """ print("=" * 60) print("Пример 2: Получение списка баз данных 1С") print("=" * 60) cfg = config.get_config() client = SSHClient( hostname=cfg['ssh']['hostname'], port=cfg['ssh']['port'], username=cfg['ssh']['username'], pkey_file=cfg['ssh']['pkey_file'], host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'), ) client.connect() client.set_c1_config( cfg['c1']['lxc_container_name'], cfg['c1']['cluster_user'], cfg['c1']['cluster_password'], ) bases = client.base_list() print(f"Найдено баз данных: {len(bases)}") for base in bases: if base.get('name') and len(base['name']) > 0: base_name = base['name'][0] base_id = base['id'][0] if base.get('id') and len(base['id']) > 0 else 'N/A' print(f" - {base_name} (ID: {base_id})") client.close() print("\n") def example_get_base_info(): """ Пример получения информации о конкретных базах данных из списка в конфиге """ print("=" * 60) print("Пример 3: Получение информации о базах данных 1С") print("=" * 60) cfg = config.get_config() client = SSHClient( hostname=cfg['ssh']['hostname'], port=cfg['ssh']['port'], username=cfg['ssh']['username'], pkey_file=cfg['ssh']['pkey_file'], host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'), ) client.connect() client.set_c1_config( cfg['c1']['lxc_container_name'], cfg['c1']['cluster_user'], cfg['c1']['cluster_password'], ) infobase_user = cfg['c1']['infobase_user'] infobase_password = cfg['c1']['infobase_password'] bases_to_process = cfg['migration'].get('bases', []) if not bases_to_process: print("Список баз для обработки не указан в конфигурации (migration.bases)") client.close() return print(f"Обработка {len(bases_to_process)} баз данных из конфигурации:") print(f" Список баз: {', '.join(bases_to_process)}\n") # Обрабатываем каждую базу из списка for base_name in bases_to_process: print(f"{'=' * 60}") print(f"База данных: {base_name}") print(f"{'=' * 60}") try: # Получаем ID базы base_id = client.base_id(base_name) if base_id: print(f"ID базы данных '{base_name}': {base_id}") # Получаем полную информацию о базе base_info = client.base_info(base_name, infobase_user, infobase_password) if base_info: print(f"\nИнформация о базе данных '{base_name}':") for key, value in base_info.items(): print(f" {key}: {value}") else: print(f"Не удалось получить информацию о базе '{base_name}'") else: print(f"База данных '{base_name}' не найдена в кластере") except Exception as e: print(f"Ошибка при обработке базы '{base_name}': {e}") print() client.close() print("\n") def example_update_base_info(): """ Пример обновления информации о базах данных 1С из списка в конфиге """ print("=" * 60) print("Пример 4: Обновление информации о базах данных 1С") print("=" * 60) cfg = config.get_config() client = SSHClient( hostname=cfg['ssh']['hostname'], port=cfg['ssh']['port'], username=cfg['ssh']['username'], pkey_file=cfg['ssh']['pkey_file'], host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'), ) client.connect() # Создаем экземпляр модуля 1С кластера с параметрами из конфига lxc_container = cfg['c1']['lxc_container_name'] cluster_user = cfg['c1']['cluster_user'] cluster_password = cfg['c1']['cluster_password'] infobase_user = cfg['c1']['infobase_user'] infobase_password = cfg['c1']['infobase_password'] client.set_c1_config(lxc_container, cluster_user, cluster_password) # Параметры базы данных PostgreSQL db_server = cfg['c1']['db_server'] db_name = cfg['c1'].get('db_name', '') db_user = cfg['c1']['db_user'] db_password = cfg['c1']['db_password'] # Параметры управления доступом из конфигурации миграции scheduled_jobs_deny = cfg['migration'].get('scheduled_jobs_deny', 'off') sessions_deny = cfg['migration'].get('sessions_deny', 'off') # Получаем список баз из конфигурации bases_to_process = cfg['migration'].get('bases', []) if not bases_to_process: print("Список баз для обработки не указан в конфигурации (migration.bases)") client.close() return print(f"Обработка {len(bases_to_process)} баз данных из конфигурации:") print(f" Список баз: {', '.join(bases_to_process)}") print(f" Параметры подключения:") print(f" Сервер БД: {db_server}") print(f" Пользователь БД: {db_user}") print(f" db_name из конфига: {db_name if db_name else '(будет использовано имя базы 1С)'}") print(f" Параметры управления доступом:") print(f" Запрет запланированных заданий (scheduled_jobs_deny): {scheduled_jobs_deny}") print(f" Запрет сеансов (sessions_deny): {sessions_deny}") print() # Обрабатываем каждую базу из списка for base_name in bases_to_process: print(f"{'=' * 60}") print(f"База данных: {base_name}") print(f"{'=' * 60}") try: # Если db_name не указан, используем имя базы 1С actual_db_name = db_name if db_name else base_name print(f" Обновление параметров:") print(f" Сервер БД: {db_server}") print(f" Имя БД: {actual_db_name}") print(f" Пользователь БД: {db_user}") print(f" Запрет запланированных заданий: {scheduled_jobs_deny}") print(f" Запрет сеансов: {sessions_deny}") # Обновляем информацию о базе updated_base_id = client.base_info_update( base_name, db_server, actual_db_name, db_user, db_password, infobase_user, infobase_password, scheduled_jobs_deny, sessions_deny ) if updated_base_id: print(f" ✓ База данных успешно обновлена. ID: {updated_base_id}") else: print(f" ✗ Не удалось обновить базу данных '{base_name}'") except Exception as e: print(f" ✗ Ошибка при обновлении базы '{base_name}': {e}") print() client.close() print("\n") def example_workflow(): """ Пример полного рабочего процесса: получение версии, запуск демона, получение списка баз """ print("=" * 60) print("Пример 5: Полный рабочий процесс") print("=" * 60) cfg = config.get_config() client = SSHClient( hostname=cfg['ssh']['hostname'], port=cfg['ssh']['port'], username=cfg['ssh']['username'], pkey_file=cfg['ssh']['pkey_file'], host_keys=cfg['ssh'].get('host_keys', '~/.ssh/known_hosts'), ) client.connect() # Создаем экземпляр модуля 1С кластера с параметрами из конфига lxc_container = cfg['c1']['lxc_container_name'] cluster_user = cfg['c1']['cluster_user'] cluster_password = cfg['c1']['cluster_password'] client.set_c1_config(lxc_container, cluster_user, cluster_password) try: # Шаг 1: Получаем версию кластера print("Шаг 1: Получение версии кластера...") version = client.cluster_version() print(f" Версия: {version}") # Шаг 2: Запускаем демон кластера print("\nШаг 2: Запуск демона кластера...") err = client.cluster_daemon_start() if err: print(f" Предупреждение: {err}") else: print(" Демон запущен успешно") # Шаг 3: Получаем ID кластера print("\nШаг 3: Получение ID кластера...") cluster_id = client.cluster_id() print(f" ID кластера: {cluster_id}") # Шаг 4: Получаем список баз данных print("\nШаг 4: Получение списка баз данных...") bases = client.base_list() print(f" Найдено баз: {len(bases)}") # Шаг 5: Для каждой базы получаем ID print("\nШаг 5: Получение ID для каждой базы...") for base in bases: if base.get('name') and len(base['name']) > 0: base_name = base['name'][0] base_id = client.base_id(base_name) print(f" {base_name}: {base_id}") except Exception as e: print(f"Ошибка: {e}") finally: client.close() print("\n") def example_context_manager_style(): """ Пример использования в стиле context manager (с try/finally) """ print("=" * 60) print("Пример 6: Использование с обработкой ошибок") print("=" * 60) cfg = config.get_config() client = None try: client = SSHClient( hostname=cfg['ssh']['hostname'], port=cfg['ssh']['port'], username=cfg['ssh']['username'], pkey_file=cfg['ssh']['pkey_file'] ) client.connect() # Создаем экземпляр модуля 1С кластера с параметрами из конфига lxc_container = cfg['c1']['lxc_container_name'] cluster_user = cfg['c1']['cluster_user'] cluster_password = cfg['c1']['cluster_password'] client.set_c1_config(lxc_container, cluster_user, cluster_password) # Получаем версию и список баз version = client.cluster_version() print(f"Версия кластера: {version}") bases = client.base_list() print(f"Список баз данных ({len(bases)} шт.):") for base in bases[:3]: # Показываем только первые 3 if base.get('name') and len(base['name']) > 0: print(f" - {base['name'][0]}") except Exception as e: print(f"Произошла ошибка: {e}") finally: if client: client.close() print("Соединение закрыто") print("\n") if __name__ == "__main__": print("\n" + "=" * 60) print("Примеры использования модуля client.py") print("=" * 60 + "\n") # Раскомментируйте нужные примеры для запуска # example_basic_usage() # example_get_base_list() # example_get_base_info() example_update_base_info() # example_workflow() # example_context_manager_style() print("Для запуска примеров раскомментируйте соответствующие функции в конце файла") print("\nПримеры демонстрируют:") print(" 1. Базовое использование модуля") print(" 2. Получение списка баз данных") print(" 3. Получение информации о базе данных") print(" 4. Обновление информации о базе данных") print(" 5. Полный рабочий процесс") print(" 6. Использование с обработкой ошибок")