Files
cursor_ai/example_c1_cluster.py

386 lines
15 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Примеры использования модуля c1_cluster.py новым способом
Демонстрирует прямое использование C1ClusterOperations без основного класса ssh
"""
import config
from ssh_base import SSHBase
from c1_cluster import C1ClusterOperations
def example_basic_usage():
"""
Пример базового использования модуля c1_cluster
"""
print("=" * 60)
print("Пример 1: Базовое использование модуля c1_cluster")
print("=" * 60)
# Загружаем конфигурацию
cfg = config.get_config()
# Создаем SSH подключение
ssh_client = SSHBase(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file'],
host_keys=cfg['ssh']['host_keys']
)
# Подключаемся
ssh_client.connect()
# Создаем экземпляр модуля 1С кластера с параметрами из конфига
lxc_container = cfg['c1']['lxc_container_name']
cluster_user = cfg['c1']['cluster_user']
cluster_password = cfg['c1']['cluster_password']
c1_cluster = C1ClusterOperations(ssh_client, lxc_container, cluster_user, cluster_password)
# Получаем версию кластера
version = c1_cluster.cluster_version()
print(f"Версия кластера 1С: {version}")
# Получаем ID кластера
cluster_id = c1_cluster.cluster_id()
print(f"ID кластера 1С: {cluster_id}")
# Закрываем соединение
ssh_client.close()
print("\n")
def example_get_base_list():
"""
Пример получения списка баз данных 1С
"""
print("=" * 60)
print("Пример 2: Получение списка баз данных 1С")
print("=" * 60)
cfg = config.get_config()
ssh_client = SSHBase(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file']
)
ssh_client.connect()
# Создаем экземпляр модуля 1С кластера с параметрами из конфига
lxc_container = cfg['c1']['lxc_container_name']
cluster_user = cfg['c1']['cluster_user']
cluster_password = cfg['c1']['cluster_password']
c1_cluster = C1ClusterOperations(ssh_client, lxc_container, cluster_user, cluster_password)
# Получаем список баз данных
bases = c1_cluster.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})")
ssh_client.close()
print("\n")
def example_get_base_info():
"""
Пример получения информации о конкретных базах данных из списка в конфиге
"""
print("=" * 60)
print("Пример 3: Получение информации о базах данных 1С")
print("=" * 60)
cfg = config.get_config()
ssh_client = SSHBase(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file']
)
ssh_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']
c1_cluster = C1ClusterOperations(ssh_client, lxc_container, cluster_user, cluster_password)
# Получаем список баз из конфигурации
bases_to_process = cfg['migration'].get('bases', [])
if not bases_to_process:
print("Список баз для обработки не указан в конфигурации (migration.bases)")
ssh_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 = c1_cluster.base_id(base_name)
if base_id:
print(f"ID базы данных '{base_name}': {base_id}")
# Получаем полную информацию о базе
base_info = c1_cluster.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()
ssh_client.close()
print("\n")
def example_update_base_info():
"""
Пример обновления информации о базах данных 1С из списка в конфиге
"""
print("=" * 60)
print("Пример 4: Обновление информации о базах данных 1С")
print("=" * 60)
cfg = config.get_config()
ssh_client = SSHBase(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file']
)
ssh_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']
c1_cluster = C1ClusterOperations(ssh_client, 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)")
ssh_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 = c1_cluster.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()
ssh_client.close()
print("\n")
def example_workflow():
"""
Пример полного рабочего процесса: получение версии, запуск демона, получение списка баз
"""
print("=" * 60)
print("Пример 5: Полный рабочий процесс")
print("=" * 60)
cfg = config.get_config()
ssh_client = SSHBase(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file']
)
ssh_client.connect()
# Создаем экземпляр модуля 1С кластера с параметрами из конфига
lxc_container = cfg['c1']['lxc_container_name']
cluster_user = cfg['c1']['cluster_user']
cluster_password = cfg['c1']['cluster_password']
c1_cluster = C1ClusterOperations(ssh_client, lxc_container, cluster_user, cluster_password)
try:
# Шаг 1: Получаем версию кластера
print("Шаг 1: Получение версии кластера...")
version = c1_cluster.cluster_version()
print(f" Версия: {version}")
# Шаг 2: Запускаем демон кластера
print("\nШаг 2: Запуск демона кластера...")
err = c1_cluster.cluster_daemon_start()
if err:
print(f" Предупреждение: {err}")
else:
print(" Демон запущен успешно")
# Шаг 3: Получаем ID кластера
print("\nШаг 3: Получение ID кластера...")
cluster_id = c1_cluster.cluster_id()
print(f" ID кластера: {cluster_id}")
# Шаг 4: Получаем список баз данных
print("\nШаг 4: Получение списка баз данных...")
bases = c1_cluster.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 = c1_cluster.base_id(base_name)
print(f" {base_name}: {base_id}")
except Exception as e:
print(f"Ошибка: {e}")
finally:
ssh_client.close()
print("\n")
def example_context_manager_style():
"""
Пример использования в стиле context manager (с try/finally)
"""
print("=" * 60)
print("Пример 6: Использование с обработкой ошибок")
print("=" * 60)
cfg = config.get_config()
ssh_client = None
try:
ssh_client = SSHBase(
hostname=cfg['ssh']['hostname'],
port=cfg['ssh']['port'],
username=cfg['ssh']['username'],
pkey_file=cfg['ssh']['pkey_file']
)
ssh_client.connect()
# Создаем экземпляр модуля 1С кластера с параметрами из конфига
lxc_container = cfg['c1']['lxc_container_name']
cluster_user = cfg['c1']['cluster_user']
cluster_password = cfg['c1']['cluster_password']
c1_cluster = C1ClusterOperations(ssh_client, lxc_container, cluster_user, cluster_password)
# Получаем версию и список баз
version = c1_cluster.cluster_version()
print(f"Версия кластера: {version}")
bases = c1_cluster.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 ssh_client:
ssh_client.close()
print("Соединение закрыто")
print("\n")
if __name__ == "__main__":
print("\n" + "=" * 60)
print("Примеры использования модуля c1_cluster.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. Использование с обработкой ошибок")