Краткое руководство по использованию API сервиса amon
В этой главе:
#include <amon/api.h>int main() {OutputDataSummary buf;// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}iov_t riov;SETIOV(&riov, &buf, sizeof(OutputDataSummary));// Отправляем командуint ret = devctlv(fd, DCMD_AMON_GET_SUMMARY, 0, 1, nullptr, &riov, nullptr);close(fd);if (ret != EOK) {std::cout << "Failed to execute command DCMD_AMON_GET_SUMMARY." << std::endl;exit(EXIT_FAILURE);}}
#include <amon/api.h>int main() {ConfigData config;memset(&config, 0, sizeof(ConfigData));// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}iov_t riovc;SETIOV(&riovc, &config, sizeof(ConfigData));// получаем конфигурацию amonint ret = devctlv(fd, DCMD_AMON_GET_CONFIG, 0, 1, nullptr, &riovc, nullptr);if (ret != EOK) {close(fd);std::cout << "Failed to execute command DCMD_AMON_GET_CONFIG." << std::endl;exit(EXIT_FAILURE);}auto buf = new ObjectData[config.olistsize];memset(buf, 0, sizeof(ObjectData)*config.olistsize);iov_t riovo;SETIOV(&riovo, buf, sizeof(ObjectData)*config.olistsize);// выполняем командуret = devctlv(fd, DCMD_AMON_GET_OBJECT_LIST, 0, 1, nullptr, &riovo, nullptr);close(fd);if (ret != EOK) {delete [] buf;std::cout << "Failed to execute command DCMD_AMON_GET_OBJECT_LIST." << std::endl;exit(EXIT_FAILURE);}for (int i = 0; i < Config.olistsize; i++) {if (buf[i].mode == 0xFF) {// Если список заполнен не до конца, после последнего элемента будет расположен ещё один элемент списка с полем mode равным 0xFFbreak;}/* Использование полей структуры buf[i] */}}
Для того, чтобы получить информацию об объекте, используется управляющая структура AmonObjectQuery, структура ObjectData и команда devctl DCMD_AMON_GET_OBJECT_INFO. Информация об объекте включает в себя имя объекта, имя его класса, уровень доверия, уровень девиации, а также список анализируемых параметров. Пример использования этой команды приведён ниже.
#include <amon/api.h>int main() {// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}AmonObjectQuery query;ObjectData object;memset(&object, 0, sizeof(ObjectData));query.oid = /* идентификатор объекта (ObjectID), информацию о котором необходимо получить */;query.cid = /* номер класса объекта (ClassID), информацию о котором необходимо получить */;iov_t siov, riov;SETIOV(&siov, &query, sizeof(AmonObjectQuery));SETIOV(&riov, &object, sizeof(ObjectData));// выполняем командуint ret = devctlv(fd, DCMD_AMON_GET_OBJECT_INFO, 2, 1, &siov, &riov, nullptr);close(fd);if (ret != EOK) {std::cout << "Failed to execute command DCMD_AMON_GET_OBJECT_INFO." << std::endl;exit(EXIT_FAILURE);}}
#include <amon/api.h>int main() {ConfigData config;memset(&config, 0, sizeof(ConfigData));// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}iov_t riov;SETIOV(&riov, &config, sizeof(ConfigData));// получаем конфигурацию amonint ret = devctlv(fd, DCMD_AMON_GET_CONFIG, 0, 1, nullptr, &riov, nullptr);if (ret != EOK) {close(fd);std::cout << "Failed to execute command DCMD_AMON_GET_CONFIG." << std::endl;exit(EXIT_FAILURE);}auto buf = new AlertData[config.alistsize];memset(buf, 0, sizeof(AlertData)*config.alistsize);SETIOV(&riov, buf, sizeof(AlertData)*config.alistsize);// выполняем командуret = devctlv(fd, DCMD_AMON_GET_ALERT_LIST, 0, 1, nullptr, &riov, nullptr);close(fd);if (ret != EOK) {delete [] buf;std::cout << "Failed to execute command DCMD_AMON_GET_ALERT_LIST." << std::endl;exit(EXIT_FAILURE);}for (int i = 0; i < Config.alistsize; i++) {if (buf[i].aid == 0) {// Если список заполнен не до конца, после последнего элемента будет расположен ещё один элемент списка с полем aid равным 0break;}/* Использование полей структуры buf[i] */}}
Для того, чтобы получить информацию об оповещении, используется структура AlertData и команда devctl DCMD_AMON_GET_ALERT_INFO. Информация об оповещении включает в себя дату и время возникновения оповещения, а также полный слепок состояния объекта на момент возникновения оповещения. Пример использования этой команды приведён ниже.
#include <amon/api.h>int main() {uint32_t aid = /* идентификатор оповещения (AlertID) */// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}AlertData alert;memset(&alert, 0, sizeof(AlertData));iov_t siov, riov;SETIOV(&siov, &aid, sizeof(uint32_t));SETIOV(&riov, &alert, sizeof(AlertData));// выполняем командуint ret = devctlv(fd, DCMD_AMON_GET_ALERT_INFO, 1, 1, &siov, &riov, nullptr);close(fd);if (ret != EOK) {std::cout << "Failed to execute command DCMD_AMON_GET_OBJECT_INFO." << std::endl;exit(EXIT_FAILURE);}if (!alert.aid) {std::cout << "Alert with ID " << aid << " not found" << std::endl;exit(EXIT_FAILURE);}}
#include <amon/api.h>int main() {// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}AmonModeControl modectl;modectl.mode = /* режим работы (AMON_MODE_LEARN или AMON_MODE_ANALYZE) */;modectl.oid = /* ObjectID */;modectl.cid = /* ClassID */;iov_t siov;SETIOV(&siov, &modectl, sizeof(AmonModeControl));// выполняем командуint ret = devctlv(fd, DCMD_AMON_SET_MODE, 1, 0, &siov, nullptr, nullptr);if (ret != EOK) {std::cout << "Failed to execute command DCMD_AMON_SET_MODE." << std::endl;exit(EXIT_FAILURE);} else {if (!oid) std::cout << "All objects";else std::cout << "Object width id " << oid << " and class " << cid;if (mode == 0) std::cout << " switched to learning mode" << std::endl << std::endl;else std::cout << " switched to recognition mode" << std::endl << std::endl;}}
#include <amon/api.h>int main() {// Подключаемся к менеджеру ресурсовint fd = open(AMON_DEV_NAME, O_RDWR);if (fd == -1) {std::cout << "Failed to open " << AMON_DEV_NAME << std::endl;exit(EXIT_FAILURE);}AmonLearnAlert alearn;alearn.aid = /* идентификатор оповещения об аномальной активности, которую надо принять как доверенную, выполнив дообучение */;iov_t siov;SETIOV(&siov, &alearn, sizeof(AmonLearnAlert));// выполняем командуint ret = devctlv(fd, DCMD_AMON_LEARN_ALERT, 1, 0, &siov, nullptr, nullptr);if (ret != EOK) {std::cout << "Failed to execute command DCMD_AMON_LEARN_ALERT." << std::endl;exit(EXIT_FAILURE);} else {std::cout << "Amon accepted anomaly with id " << alearn.aid << std::endl;}}
Предыдущий раздел: перейти