Пример включения в решение системной программы KlogStorage, направляющей данные аудита в стандартный вывод ошибок

Исходный код программы

klog_storage/src/klog_storage_entity.c

#include <klog_storage/server.h>

#include <ping/KlogStorageEntity.edl.h>

#include <stdio.h>

/* Определение типа данных для фиктивного контекста.

* Требуется для определения функций, реализующих

* интерфейсные методы, и настройки диспетчера. */

struct Context

{

int some_data;

};

/* Определение функции, направляющей данные аудита в стандартный

* вывод ошибок. (Параметр ctx не требуется использовать, но параметр

* типа void* должен быть первым параметром в сигнатуре функции, чтобы

* соответствовать типу указателя, который используется диспетчером

* для вызова этой функции.) */

static int _write(struct Context *ctx, const struct kl_KlogStorage_Entry *entry)

{

fprintf(stderr, "%s\n", entry->msg);

return 0;

}

/* Определение фиктивной функции чтения данных аудита.

* (Требуется для настройки диспетчера, чтобы избежать ошибки,

* если будет вызван интерфейсный метод чтения данных аудита.) */

static int _read_range(struct Context *ctx, nk_uint64_t first_id,

nk_uint64_t last_id, struct kl_KlogStorage_Entry *entries)

{

return 0;

}

/* Определение фиктивной функции чтения данных аудита.

* (Требуется для настройки диспетчера, чтобы избежать ошибки,

* если будет вызван интерфейсный метод чтения данных аудита.) */

static int _read(struct Context *ctx, nk_uint32_t num_entries,

struct kl_KlogStorage_Entry *entries)

{

return 0;

}

int main(int argc, char *argv[])

{

/* Объявление фиктивного контекста */

static struct Context ctx;

/* Настройка диспетчера, чтобы при получении от программы Klog

* IPC-запросов с данными аудита была вызвана функция, направляющая

* эти данные в стандартный вывод ошибок. (Функции чтения данных аудита

* и контекст являются фиктивными. Однако можно создать собственные

* реализации функций _write(), _read() и _read_range() для работы с

* хранилищем данных аудита. В этом случае контекст может быть

* использован для хранения состояния хранилища.) */

struct kl_KlogStorage *iface =

klog_storage_IKlog_storage_dispatcher(&ctx,

(kl_KlogStorage_write_func)_write,

(kl_KlogStorage_read_func)_read,

(kl_KlogStorage_read_range_func)_read_range);

struct kl_KlogStorage_component *comp =klog_storage_storage_component(iface);

/* В результате вызова этой функции будет запущен цикл обработки IPC-запросов.

* (Константы ping_KlogStorageEntity_klogStorage_iidOffset и

* ping_KlogStorageEntity_klogStorage_storage_iid определены в заголовочном файле

* KlogStorageEntity.edl.h, который содержит автоматически сгенерированный

* транспортный код.) */

return klog_storage_run(KLOG_STORAGE_SERVER_CONNECTION_ID,

ping_KlogStorageEntity_klogStorage_iidOffset,

ping_KlogStorageEntity_klogStorage_storage_iid,

comp);

}

Сборка программы

klog_storage/CMakeLists.txt

# Импорт библиотек KlogStorage из состава

# KasperskyOS SDK

find_package (klog_storage REQUIRED)

include_directories (${klog_storage_INCLUDE})

# Генерация транспортного кода на основе формальной спецификации

# программы KlogStorage

nk_build_edl_files (klog_storage_edl_files

NK_MODULE "ping"

# Файл KlogStorageEntity.edl и другие файлы

# формальной спецификации программы KlogStorage

# поставляются в составе KasperskyOS SDK.

EDL "${RESOURCES}/edl/KlogStorageEntity.edl")

# Создание исполняемого файла программы KlogStorage

add_executable (KlogStorageEntity "src/klog_storage_entity.c")

target_link_libraries (KlogStorageEntity ${klog_storage_SERVER_LIB})

add_dependencies (KlogStorageEntity klog_edl_files klog_storage_edl_files)

Словарь процесса программы в шаблоне init-описания

einit/src/init.yaml.in

...

- name: ping.KlogStorageEntity

...

Описание политики для программы

einit/src/security.psl.in

...

use nk.base._

...

use EDL kl.core.Core

...

use EDL ping.KlogEntity

use EDL ping.KlogStorageEntity

...

use audit_profile._

use core._

...

/* Взаимодействие с программой Klog */

request dst=ping.KlogStorageEntity {

match endpoint=klogStorage.storage {

match method=write {

match src=ping.KlogEntity { grant () }

}

}

}

response src=ping.KlogStorageEntity {

match endpoint=klogStorage.storage {

match method=write {

match dst=ping.KlogEntity { grant () }

}

}

}

error src=ping.KlogStorageEntity {

match endpoint=klogStorage.storage {

match method=write {

match dst=ping.KlogEntity { grant () }

}

}

}

...

einit/src/core.psl

...

/* Взаимодействие с ядром */

request dst=kl.core.Core {

match endpoint=sync.Sync {

match method=Wake {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Wait {

...

match src=ping.KlogStorageEntity { grant () }

...

}

}

match endpoint=task.Task {

match method=FreeSelfEnv {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=GetPath {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=GetName {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Exit {

...

match src=ping.KlogStorageEntity { grant () }

...

}

}

match endpoint=vmm.VMM {

match method=Allocate {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Commit {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Protect {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Free {

...

match src=ping.KlogStorageEntity { grant () }

...

}

}

match endpoint=thread.Thread {

match method=SetTls {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Create {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=Resume {

...

match src=ping.KlogStorageEntity { grant () }

...

}

}

match endpoint=hal.HAL {

match method=GetEntropy {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=DebugWrite {

...

match src=ping.KlogStorageEntity { grant () }

...

}

match method=GetEnv {

...

match src=ping.KlogStorageEntity { grant () }

...

}

}

match endpoint=handle.Handle {

match method=Close {

...

match src=ping.KlogStorageEntity { grant () }

...

}

}

}

response src=kl.core.Core {

...

match dst=ping.KlogStorageEntity { grant () }

...

}

error src=kl.core.Core {

...

match dst=ping.KlogStorageEntity { grant () }

...

}

...

В начало