Alterator/module/backend: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
[[Category:Sisyphus]]
[[Category:Sisyphus]]


=== Бакенд ===
=== Бэкенд ===
Существует два вида бакендов: нативные и внешние. Размещаются эти бакенды в каталогах ''/usr/lib/alterator/backend2'' и ''/usr/lib/alterator/backend3'' соответственно.
Существует два вида бэкендов: нативные и внешние. Размещаются эти бэкенды в каталогах ''/usr/lib/alterator/backend2'' и ''/usr/lib/alterator/backend3'' соответственно.


Нативные бакенды пишутся только на языке scheme и работают внутри процесса alterator. Написание нативных бакендов требует достаточно большого опыта программирования и большой аккуратности.
Нативные бэкенды пишутся только на языке scheme и работают внутри процесса alterator. Написание нативных бэкендов требует достаточно большого опыта программирования и большой аккуратности.


Внешний бакенд может быть написан на произвольном языке програмирования, при этом '''настоятельно рекомендуется''' использовать готовые библиотеки, предоставляющие API для взаимодействия с alterator. Все библиотеки построены по одному и тому же принципу - есть главный цикл взаимодействующий с alterator и есть функция-обработчик пришедших сообщений.  
Внешний бэкенд может быть написан на произвольном языке программирования, при этом '''настоятельно рекомендуется''' использовать готовые библиотеки, предоставляющие API для взаимодействия с alterator. Все библиотеки построены по одному и тому же принципу - есть главный цикл взаимодействующий с alterator и есть функция-обработчик пришедших сообщений.  
В функции обработчике:
В функции обработчике:
* анализируется вид запроса (параметр action)
* анализируется вид запроса (параметр action)
Строка 12: Строка 12:
* вычисляются и выводятся значения выходных параметров.
* вычисляются и выводятся значения выходных параметров.


==== Простейший бакенд на shell ====
==== Простейший бэкенд на shell ====


Пример простейшего бакенда на shell:
Пример простейшего бэкенда на shell:
<pre>#!/bin/sh -f
<pre>#!/bin/sh -f


Строка 44: Строка 44:
message_loop</pre>
message_loop</pre>
В данном примере:  
В данном примере:  
*'''message_loop''' -- запуск цикла обработки событий
*'''message_loop''' запуск цикла обработки событий
*'''on_message''' -- обработчик входящих сообщний. Входные переменные выглядят как переменные ''$in_<имя>''. Выходные печатаются при помощи функций ''write_*'' .
*'''on_message''' обработчик входящих сообщний. Входные переменные выглядят как переменные ''$in_<имя>''. Выходные печатаются при помощи функций ''write_*'' .
*'''alterator_api_version''' - текущая версия API для взаимодействия с alterator.
*'''alterator_api_version''' текущая версия API для взаимодействия с alterator.


Если к к бакенду &lt;name&gt; обращались из интерфейса по адресу ''/&lt;name&gt;/foo/bar'', то переменная ''$in__objects'' будет равна "foo/bar" (то есть "хвост" адреса), если обращались по адресу ''/&lt;name&gt;'', то ''$in__objects'' будет равна "/".
Если к к бэкенду &lt;name&gt; обращались из интерфейса по адресу ''/&lt;name&gt;/foo/bar'', то переменная ''$in__objects'' будет равна "foo/bar" (то есть "хвост" адреса), если обращались по адресу ''/&lt;name&gt;'', то ''$in__objects'' будет равна "/".


Более подробная информация по написанию бакендов на shell находится [[Alterator/shell|здесь]].
Более подробная информация по написанию бэкендов на shell находится [[Alterator/shell|здесь]].


==== Простейший бакенд на perl ====
==== Простейший бэкенд на perl ====


Пример аналогичного бакенда на perl:
Пример аналогичного бэкенда на perl:
<pre>#!/usr/bin/perl -w
<pre>#!/usr/bin/perl -w
use strict;
use strict;
Строка 80: Строка 80:
message_loop(\&on_message);</pre>
message_loop(\&on_message);</pre>


Здесь, как ив shell-бакенде:
Здесь, как ив shell-бэкенде:
*'''message_loop''' -- запуск цикла обработки событий
*'''message_loop''' запуск цикла обработки событий
*'''on_message''' -- обработчик входящих сообщений.
*'''on_message''' обработчик входящих сообщений.


Обработчику передается ссылка на хэш с входными перемеными. Выходные печатаются при помощи функций ''write_*'' .   
Обработчику передается ссылка на хэш с входными переменными. Выходные печатаются при помощи функций ''write_*'' .   


При обращении из интерфейса по адресу ''/&lt;name&gt;/foo/bar'', то в бакенде &lt;name&gt; в этом хэше будет присутствовать //_objects// равный "foo/bar" (то есть "хвост" адреса), если обращались по адресу ''/&lt;name&gt;'', то //_objects// равно "/".
При обращении из интерфейса по адресу ''/&lt;name&gt;/foo/bar'', то в бэкенде &lt;name&gt; в этом хэше будет присутствовать //_objects// равный "foo/bar" (то есть "хвост" адреса), если обращались по адресу ''/&lt;name&gt;'', то //_objects// равно "/".


Более подробная информация по написанию бакендов на perl находится [[Alterator/perl|здесь]].
Более подробная информация по написанию бэкендов на perl находится [[Alterator/perl|здесь]].

Версия от 13:27, 21 октября 2008


Бэкенд

Существует два вида бэкендов: нативные и внешние. Размещаются эти бэкенды в каталогах /usr/lib/alterator/backend2 и /usr/lib/alterator/backend3 соответственно.

Нативные бэкенды пишутся только на языке scheme и работают внутри процесса alterator. Написание нативных бэкендов требует достаточно большого опыта программирования и большой аккуратности.

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

  • анализируется вид запроса (параметр action)
  • анализируется url запроса, а также значения входных параметров
  • вычисляются и выводятся значения выходных параметров.

Простейший бэкенд на shell

Пример простейшего бэкенда на shell:

#!/bin/sh -f

po_domain="alterator-foo"
api_version=1

. alterator-sh-functions

on_message()
{
        case "$in_action" in
               list)
                         write_enum_item "item1" "label1"
                         write_enum_item "item2"  "label2"
                         ;;
               read)
                      case "$in__objects" in
                         url1) write_string_param param1 "value1";;
                         url2) write_bool_param param2  "yes";;
                      esac
                      ;;
                write)
                    [ -n "$in_param1" ] && echo "$in_param1" >/tmp/file1
                    test_bool "$in_param2" && echo "yes">/tmp/file2
                    ;;
        esac
}

message_loop

В данном примере:

  • message_loop — запуск цикла обработки событий
  • on_message — обработчик входящих сообщний. Входные переменные выглядят как переменные $in_<имя>. Выходные печатаются при помощи функций write_* .
  • alterator_api_version — текущая версия API для взаимодействия с alterator.

Если к к бэкенду <name> обращались из интерфейса по адресу /<name>/foo/bar, то переменная $in__objects будет равна "foo/bar" (то есть "хвост" адреса), если обращались по адресу /<name>, то $in__objects будет равна "/".

Более подробная информация по написанию бэкендов на shell находится здесь.

Простейший бэкенд на perl

Пример аналогичного бэкенда на perl:

#!/usr/bin/perl -w
use strict;
use Alterator::Backend3;

$TEXTDOMAIN='alterator-foo';
$DEBUG = 1;

sub on_message{
  my message=shift;
  if ($message->{action} eq 'list'){
    write_named_auto_list('item1', 'label', 'label1');
    write_named_auto_list('item2', 'label', 'label2');
  }
  elsif ($message->{action} eq 'read'){
     write_string_param('param1', 'value1');
     write_bool_param('param2',  'yes');
  }
  elsif ($message->{action} eq 'write'){
    print F1 $message->{param1} if (exists($message->{param1}));
    print F2 ($message->{param2} eq '#t')? 'yes':'no' if (exists($message->{param2}));
  }
}

message_loop(\&on_message);

Здесь, как ив shell-бэкенде:

  • message_loop — запуск цикла обработки событий
  • on_message — обработчик входящих сообщений.

Обработчику передается ссылка на хэш с входными переменными. Выходные печатаются при помощи функций write_* .

При обращении из интерфейса по адресу /<name>/foo/bar, то в бэкенде <name> в этом хэше будет присутствовать //_objects// равный "foo/bar" (то есть "хвост" адреса), если обращались по адресу /<name>, то //_objects// равно "/".

Более подробная информация по написанию бэкендов на perl находится здесь.