Заметки из Зазеркалья

20.01.2017

Режим агента конфигуратора

Реализовано в версии 8.3.10.2168.

При разработке и сопровождении прикладных решений конфигуратор используется не только интерактивно (для изменения конфигурации, описания алгоритмов на встроенном языке), но и программно (для обновления конфигурации, загрузки/выгрузки и др.). Например, новая среда разработки EDT часть своих функций перепоручает конфигуратору.

Наша исходная потребность заключалась в том, чтобы ускорить взаимодействие EDT и конфигуратора. Но в процессе разработки мы решили расширить решаемую задачу. В результате мы реализовали универсальную возможность работы с конфигуратором программно – режим агента. В этом режиме конфигуратор может выполнять произвольное количество «внешних» команд, не завершая своей работы.

Преимущества

Главным преимуществом этого режима для EDT является то, что время выполнения последовательности таких операций как загрузка/выгрузка в файлы и обновление конфигурации базы данных сократилось. Ведь в пакетном режиме, который EDT использовала до этого, конфигуратор запускается, выполняет одну команду, и завершает свою работу. И если необходимо последовательно выполнить несколько команд, накладные расходы на запуск / завершение работы конфигуратора могут быть значительными.

Другим преимуществом, которого не было в наших изначальных планах, явилось то, что в новом режиме вы можете работать с конфигуратором через стандартные ssh-клиенты. А это значит, что вы можете автоматизировать свою работу с конфигуратором. И вот об этой возможности хочется рассказать подробнее.

Принцип работы

Для запуска конфигуратора в новом режиме используется ключ /AgentMode, а также ряд других вспомогательных ключей, определяющих настройки подключения. Сразу же, при запуске, указывается информационная база, с которой будет работать конфигуратор.

После запуска агента можно поочерёдно работать с этой информационной базой как запущенным агентом (с помощью ssh-команд), так и конфигуратором, запущенным в обычном режиме. Что значит поочерёдно?

Чтобы управлять конфигуратором из ssh-клиента, нужно сначала подключиться к информационной базе. Выглядит это очень просто:

designer>common connect-ib
Операция завершена успешно

После этого можно выполнять любые другие ssh-команды.

Если выполнить ssh-команду отключения, то можно будет (не завершая работу этого агента) запустить ещё один конфигуратор в обычном режиме и работать с информационной базой как обычно, например, редактировать модули. После завершения работы обычного конфигуратора можно снова, в работающем агенте, с помощью ssh-команд подключиться к информационной базе (ИБ) и выполнить другие операции. Коротко эту последовательность действий можно представить следующим образом:

  • запуск конфигуратора в режиме агента (начало ssh-сессии)
  • подключение к ИБ (ssh-команда)
    • … другие ssh команды
  • отключение от ИБ (ssh-команда)
  • запуск конфигуратора в обычном режиме
    • … модификация той же ИБ, к которой подключен агент конфигуратора
  • завершение работы конфигуратора в обычном режиме
  • подключение к ИБ (ssh-команда)
    • … другие ssh команды
  • отключение от ИБ (ssh-команда)
  • завершение работы конфигуратора в режиме агента (ssh-команда, завершение ssh-сессии)

ssh-команды

К конфигуратору, запущенному в режиме агента, можно подключаться стандартными ssh-клиентами PuTTY, WinSCP, MobaXterm и другими. Пока мы реализовали только самые необходимые команды:

  • подключение/отключение от информационной базы;
  • загрузка/выгрузка конфигурации в файлы (в том числе частичная загрузка и выгрузка);
  • загрузка/выгрузка внешних обработок или отчетов в файлы;
  • обновление конфигурации базы данных;
  • ряд служебных команд.

В дальнейшем мы будем рассматривать возможность расширения списка команд.

Пример

Как мы уже говорили в начале, использование протокола ssh позволяет вам не только работать из командной строки в стандартных ssh-клиентах, но и автоматизировать свою работу с конфигуратором, используя возможности других, кроме встроенного, языков программирования. Например, на языке Python подключение к информационной базе и отключение от неё реализуется буквально в несколько строк (с помощью библиотеки Paramiko):

import paramiko

host = '192.168.1.1'
user = 'login'
secret = 'password'
port = 1543

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=secret, port=port)

stdin, stdout, stderr = client.exec_command('common connect-ib')
data = stdout.read() + stderr.read() 
  
	...

stdin, stdout, stderr = client.exec_command('common disconnect-ib')
data = stdout.read() + stderr.read()

client.close()  

Особенности

Конфигуратор сам по себе определяет ряд ограничений, накладываемых на взаимодействие по протоколу ssh.

Во-первых, из-за специфики работы конфигуратора все ssh-команды выполняются синхронно, одновременно к информационной базе может быть подключён только один shell ssh-клиент и несколько sftp-клиентов.

Во-вторых, существует жёсткое ограничение «один агент – одна база». Так как аутентификация выполняется по имени пользователя информационной базы и паролю, то агент сразу (при запуске) должен знать, с какой базой он будет работать.

И, в-третьих, одна из «хотелок», существовавших в процессе разработки этого механизма, заключалась в том, чтобы знать процент выполнения команды, исполняемой конфигуратором. Но после пристального анализа оказалось, что такая возможность есть далеко не у всех операций конфигуратора, а её внедрение это довольно трудоёмкая задача. Поэтому пока эта возможность осталась у нас в статусе пожелания.


Рассказать друзьям: