Внешние бакенды
Внешние бакенды могут быть написаны на произвольном языке,
отвечают через стандартный вывод, выводя туда те же самые
s-выражения, которые выводил бы
нативный бакенд.
По большоему счёту отличие состоит только в приёме сообщений
и местом жительства – располагаются они в каталоге
/usr/lib/alterator/backend3.
Внешний бакенд находится в вечном цикле приёма сообщений.
Каждое сообщение приходит на стандартный ввод как серия строк.
Начинается сообщение со строки “_message:begin”. Завершается –
“_message:end”. Стоит дождаться окончания сообщения и не
обрабатывать его сходу – может так случиться,
что alterator на половине подачи сообщения скончается
по необъяснимым причинам.
Между “_message” идёт тело сообщение. На каждой строке передаётся
аттрибут и его значение в формате: "аттрибут:значение".
Соответственно аттрибут
не может содержать символа “:". И кроме того
аттрибуты _message и _objects считаются зарезервированными.
Note: Кроме того ознакомьтесь с общими ограничениями на имена объектов и передаваемых параметров
Символы перевода строки в передаваемом значении атрибута
заменяются на \n, Символы \ заменяются на \\, символы
возврата каретки удаляются.
Обрабатываемые объекты передаются вместе со специальным
атттрибутом _objects. Объекты перечислены через символ «/» точно также
как они были бы в woo-команде за небольшим исключением,
что откушен корневой объект. Если предметом вызова является
сам корневой объект, то передаётся один символ «/».
Например команде «/users» соответствует значение аттрибута _objects
«/». А команде «/users/test/aaa» – «test/aaa». Обратите внимание
на отсутствие «/» в начале сообщения.
Таким образом внешний бакенд также как и нативный:
- не имеет никаких ограничений на варианты поля action
- может возвращать ошибки с подробным описанием причины
- может иметь состояние, поскольку он постоянно запущен.
Бакенд на shell
Если внешний бакенд пишется на shell, то для удобства
их написания предлагается небольшая библиотечка готовых функций.
С её использованием, написание бакенда превращается
в интересную игру:
Функция on_message вызывается при каждом входящем сообщении.
Переданные параметры превращаются в переменные shell, едиственное
отличие к их имени добавляется префикс
in_. Например action соответствует переменная $in_action.