Для демонстрации конфигурации безопасности на базе семейства политик era потребуются следующие файлы:
security.cfg – конфигурация безопасности на базе семейства era;ping.era – файл конфигурации семейства era;test.c – реализация функции test(), которая будет вызвана сущностью client.security.cfg и ping.era
Конфигурация безопасности в этом примере разрешает запуск всех сущностей и позволяет любой сущности обращаться к сущностям core и server.
При этом вызовы методов сущности server контролируются с помощью политик семейства era (реализация Event-Recording Automata – разновидность временных автоматов):
Ping возможен не чаще раза в секунду.Pong невозможно вызвать ни метод Ping, ни метод Pong.security.cfg
/* Конфигурация безопасности для демонстрации использования семейства "era" в примере "ping". */
/* Определение execute-интерфейса. */
execute = execute.execute;
/* Импорт файла с объявлением базовых политик безопасности. */
#include <kss/server/base.cfg>
/* Импорт файла с объявлением политик семейства "era". */
#include <kss/server/era.cfg>
/* Создание экземпляра семейства "era". Имя нового экземпляра: "request_state". Файл конфигурации семейства "era": ping.era.*/
use family request_state = era "ping.era";
/* Отправка и получение запросов разрешены. */
request { grant; }
/* Отправка и получение ответов разрешены. */
response { grant; }
/* Запуск сущностей разрешен. */
execute { grant; }
/* Объявление сущностей. */
entity services.core;
entity einit;
entity client;
entity server;
/* Ядру разрешены обращения по интерфейсу безопасности. */
security src=services.core { grant; }
/* При запуске сущности "server" перевести request_state в начальное состояние. */
execute dst=server, method=main {
request_state.restart;
}
/* При вызове метода Ping наступит событие ping, если это разрешено конфигурацией экземпляра request_state. */
request dst=server, endpoint=ping_comp.ping_impl, method=Ping {
request_state.event ping;
}
/* При вызове метода Pong наступит событие pong, если это разрешено конфигурацией экземпляра request_state. */
request dst=server, endpoint=ping_comp.ping_impl, method=Pong {
request_state.event pong;
}
Семейство era всегда конфигурируется в отдельном файле.
Экземпляр request_state может находиться в одном из двух состояний: process или stop. С этим экземпляром связаны два события: ping и pong.
Наступление события ping возможно не чаще раза в секунду, а наступление события pong переводит экземпляр в конечное состояние stop, в котором оба события запрещены.
ping.era
/* Список возможных событий. */
events: [ping, pong],
/* Начальное состояние экземпляра: "process". */
initial: process,
/* Размерность таймера (множитель). Используется при вычислении условия "if ping > 10". */
scale: 100 msec,
/* Если экземпляр находится в состоянии "process", то:
- при наступлении события "ping" произойдет переход в состояние "process", если с прошлого события прошло не менее одной секунды;
- при наступлении события "pong" произойдет переход в состояние "stop". */
process: {
ping: process if ping > 10,
pong: stop
}
test.c
В функции test() выполняются вызовы методов Ping и Pong следующим образом:
Ping вызывается 8 раз с интервалом 200 мс.Pong.Ping вызывается 8 раз с интервалом 200 мс.test.c
#include <stdint.h>
#include "ping.idl.h"
void test(struct IPing *proxy)
{
uint32_t value;
int i;
/* Реализация функций ping() и ping() содержится в файле client.c. */
uint32_t ping(struct IPing *proxy, uint32_t value);
uint32_t pong(struct IPing *proxy, uint32_t value);
value = 777;
for (i = 0; i < 7; ++i)
{
value = ping(proxy, value);/* Разрешён только шестой вызов Ping. */
usleep(200*1000);
}
value = pong(proxy, value);/* Вызов Pong разрешен. */
value = pong(proxy, value);/* Вызов Pong запрещен. */
for (i = 0; i < 7; ++i)
{
value = ping(proxy, value);/* Все вызовы Ping запрещены. */
usleep(200*1000);
}
}
В начало