Alterator/perl
!! В данный момент модуль alterator-perl-functions меняется, и вряд ли его стоит сейчас использовать. Надеюсь, что вскоре он придет к какому-то более стабильному состоянию... !!
alterator-perl-functions
Простейший бакенд выглядит следующим образом:
#!/usr/bin/perl -w use strict; use Alterator::Backend3; $TEXTDOMAIN='alterator-test'; $DEBUG = 1; sub on_message{ my message=shift; if ($message->{action} eq 'read'){ write_string_param('name', 'value'); } } message_loop(\&on_message);
Поддержка переводов
- определена функция _()
- перед запуском message_loop надо записать название основного словаря в переменную $TEXTDOMAIN. Если переменная не выставлена, модуль ругается и выставляет ее в alterator-<имя бакенда>
- если в функции _() хочется использовать словарь, отличный от $TEXTDOMAIN, его можно передать вторым аргументом: _("text", $OTHER_TEXTDOMAIN)
- язык выставляется из параметра language заново для каждой команды. Значение по умолчанию 'en_EN'
Вывод
В процедуре on_message сделано перенаправление STDOUT->STDERR. Все ответы должны выполняться только специальными командами.
Самый низкий уровень абстракции. Возможно, потом получится от этих функций отказаться:
- write_plain($string1, ...) -- запись произвольной строки
- write_begin() -- запись "("
- write_end() -- запись ")"
Запись пары "имя значение" для разных типов значений.
- write_string_param($name, $string1, ...) -- защищаются символы " и \, выводится строка в кавычках
- write_bool_param($name, $string) -- понимаются значения ( "on", "off", "yes", "no", "true", "false", "y", "n", "#t", "#f", 1, 0). В остальных случаях модуль ругается и записывает #f
- write_num_param($name, $num) -- записывается число; если дали не число - ругается и записывает 0
Во всех этих функциях $name должно содержать только символы [0-9A-Za-z_], иначе модуль ругается и записывает bad_symbol
Запись сообщений об ошибках.
- write_error($value1, ...) -- обнуление всего предыдущего ответа + write_string_param('error', $value1, ...)
Автоматическое определение типа значений. Так сложилось, что бакенды в альтератор посылают только два типа параметров: string и bool (исключение - actions constrains, но с ними сейчас ничего не понятно). Числа всегда пишутся в виде строк.
- write_auto_param($name, $value, ...) -- записать пару "имя значение", если значение #t или #f -- оно записывается без кавычек, как bool, иначе - как строка.
- write_named_auto_list($name, @alist) -- запись списка вида "(name n1 v1 n2 v2 n3 v3)"... Пары n1 v1 и т.д. записываются с помощью write_auto_param.
Кажется, что во всех разумных случаях достаточно использовать функции write_error, write_auto_param и write_named_auto_list.
TODO:
* Хочется попробовать сделать еще один уровень абстракции, в котором бакенд предоставляет только функции для заполнения некоторой структуры данных и списки полей, которые следует отдавать по командам read и list... * Доделать проверку вывода бакенда. Проверять хотя бы, что все скобки правильно закрыты, чтоб из бакенда нельзя было повесить альтератор...
DEBUG
- Если переменная $DEBUG выставлена в ненулевое значение, модуль выдает на stderr все полученные и отправленные сообщения.
Использование
В данный момент alterator-perl-functions используется в одном модуле -- alterator-xinetd