375 lines
14 KiB
Python
Executable File
375 lines
14 KiB
Python
Executable File
#!/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. Использование с обработкой ошибок")
|
||
|