IPA_MOD(3) IPA_MOD(3) НАИМЕНОВАНИЕ ipa_mod -- API модулей IPA СИНТАКСИС #include <ipa_mod.h> ОПИСАНИЕ Эта страница документации описывает API всех типов IPA модулей. Будем называть любой IPA модуль просто ``модулем''. Информация, представлен- ная в этом фале, в основном для разработчиков, но она может быть инте- ресна любому, кто желает понять как утилиты IPA работают с IPA моду- лями. Эта страница документации содержит описания следующих API: ipa_memfunc API версия 1 (IPA_MEMFUNC_API_VERSION); ipa_ac_mod API версия 2 (IPA_AC_MOD_API_VERSION); ipa_db_mod API версия 2 (IPA_DB_MOD_API_VERSION); ipa_st_mod API версия 2 (IPA_ST_MOD_API_VERSION). Именование символов в модулях Любой модуль это файл с именем подобным foobar-x.y.z.so. После загрузки модуля при помощи функции dlopen(3) или аналогичной, IPA ути- лита убирает номер версии и суффикс из имени файла модуля и пытается найти символ foobar_ac_mod, foobar_db_mod или foobar_st_mod в модуле если модуль является модулем учёта, базы данных или статистики. Если модуль содержит искомый символ, то он принимается за IPA модуль. Затем найдены указатель (void *) преобразуется в один из трёх указате- лей (struct ipa_XX_mod *). Структуры struct ipa_XX_mod определяют API между IPA утилитами и модулями. Такой метод именования символов в модулях позволяет хранить несколько модулей различных типов в одном файле. Также возможно создать линки с различными именами на файл модуля, чтобы следовать заданной схеме име- нования. Однопотоковые и многопотоковые модули Любой модуль может быть однопотоковым или многопотоковым. Если модуль не может быть заблокирован в какой-то из своих функций, то он может быть спроектирован как однопотоковый. Если ожидается, что модуль может быть заблокирован в какой-то из своих функций или если модуль должен постоянно осуществлять мониторинг некоторого события, то этот модуль должен быть спроектирован как многопотоковый. В качестве альтернативы модуль может вызвать fork(2) и использовать некоторую форму IPC, чтобы взаимодействовать с новым процессом из какой-либо своей функции и используемая функция для организации IPC должна быть неблокируемая. Если модуль однопотоковый, то он может использовать сигналы в личных целях (например SIGALRM, чтобы реализовать таймаут), за исключением сигналов, используемых IPA утилитой, которая загрузила этот модуль. Если модель многопотоковый, то ему не разрешается использовать сигналы. Очень важно вернуться из функции модуля как можно быстрее, так как IPA утилиты ожидают, что функции модуля не будут блокироваться. Если модуль проводит слишком много времени в своих функциях, то временные отметки статистики и реакция на запланированные события не будут очень точными в IPA утилитах. Даже если модуль не спроектирован как многопотоковый, то другие модули могут быть многопотоковыми. Все загружаемые модуль должны быть либо однопотоковыми, либо многопотоковыми. Таким образом любой однопотоко- вый модуль должен быть готовым для сборки как многопотоковый. Модуль всегда должен устанавливать правильный флаг в своей структуре API, для того, чтобы сообщить является он однопотоковым или многопотоковым. Утилиты IPA созданы как однопотоковые, но если используется хотя бы один многопотоковый модуль, то они должны быть собраны как многопотоко- вые. В многопотоковом режиме функции из ipa_memfunc, которая экспорти- руется IPA утилитами, становятся готовыми к многопотоковой работе. Модулям разрешается создавать потоки только после фазы конфигурации. Экспортируемые модулю функции работы с памятью API модулей требуют определённой организации данных в модулях. Функции ipa_memfunc экспортируются модуля и пытаются помочь модулю в работе с памятью. Модуль свободен в выборе использовать или нет эти функции. В некоторых функциях требуется использования функций из ipa_memfunc. Существуют четыре типа функций в ipa_memfunc: функции инициализации и деинициализации, функции работы с памятью общего назначения, функции работы с mzone и функции работы с marray. Функции mem_* для работы с памятью общего назначения это обёртки (wrap- pers) для стандартных функций работы с памятью из библиотеки (mal- loc(3), calloc(3), realloc(3), free(3), strdup(3) и для функции vasprintf(3), присутствующей на некоторых системах). Все эти функции выполняют дополнительные проверки. Любая память выделенная с помощью функции mem_* должна быть освобождена с помощью функции mem_free. Эти функции принимают дополнительный аргумент, называемый mem_type (тип памяти), который используется для сбора статистики об использовании памяти. Этот mem_type должен быть создан функцией mem_type_new. Marrays используются для создания массивов некоторых элементов. Mzones используются для создание элементов одного размера. Все функции mar- ray_* и mzone_* сами используют функции mem_*. Функции из ipa_memfunc обнаруживают неправильные указатели и некоррект- ные аргументы в функциях mem_*, marray_* и mzone_*. Если будет обнару- жена критическая ошибка в любой из этих функций, то эта функция завер- шит выполнение программы с генерацией дампа памяти. Если IPA утилиты были собраны с определённой макропеременной WITH_MEM- FUNC_DEBUG, то выделяемая и освобождаемая память заполняется случайными байтами, таким образом, если некоторая часть кода продолжает использо- вать уже освобождённую память, то вероятно, что эта ошибка будет обна- ружена. Также mem_realloc в этом случае является эквивалентом такой последовательности: malloc(3) для новой области памяти, memcpy(3) дан- ных в новую область памяти, free(3) для старой области памяти. Любая IPA утилита во время завершения работы и во время реконфигурации проверяет размер выделенной и не освобождённой памяти, если этот размер не равен нулю, то посылается отладочное сообщение. Если какая-то mzone или marray не был деинициализирован, то также посылается отладочное сообщение с соответствующим именем. Структура ipa_memfunc имеет следующий формат: typedef struct ipa_mem_type_struct ipa_mem_type; typedef struct ipa_marray_struct ipa_marray; typedef struct ipa_mzone_struct ipa_mzone; typedef struct { unsigned int api_ver; int (*memfunc_init)(void); void (*memfunc_deinit)(int foreign); ipa_mem_type *m_parser; ipa_mem_type *(*mem_type_new)(const char *name, const char *desc, unsigned int flags); void *(*mem_malloc)(size_t size, ipa_mem_type *mem_type); void *(*mem_calloc)(size_t number, size_t size, ipa_mem_type *mem_type); void *(*mem_realloc)(void *ptr, size_t size, ipa_mem_type *mem_type); char *(*mem_strdup)(const char *str, ipa_mem_type *mem_type); int (*mem_vasprintf)(ipa_mem_type *mem_type, char **buf_ptr, const char *format, va_list ap); void (*mem_free)(void *ptr, ipa_mem_type *mem_type); ipa_marray *(*marray_init)(const char *name, const char *desc, unsigned int flags, void **arr, size_t isize, unsigned int nitems, unsigned int nalloc); void (*marray_deinit)(ipa_marray *marray); int (*marray_alloc)(ipa_marray *marray, unsigned int *idxp, int fixed); void (*marray_free)(ipa_marray *marray, unsigned int idx); void (*marray_minimize)(ipa_marray *marray); int (*marray_check_index)(ipa_marray *marray, unsigned int idx); unsigned int (*marray_nused)(ipa_marray *marray); ipa_mzone *(*mzone_init)(const char *name, const char *desc, unsigned int flags, size_t isize, unsigned int nitems, unsigned int nalloc); void (*mzone_deinit)(ipa_mzone *mzone); void *(*mzone_alloc)(ipa_mzone *mzone); void (*mzone_free)(ipa_mzone *mzone, void *ptr); unsigned int (*mzone_nused)(ipa_mzone *mzone); } ipa_memfunc; api_ver Версия API ipa_memfunc, модуль должен проверить версии поддержи- ваемых API с IPA_MEMFUNC_API_VERSION во время компиляции. memfunc_init Потомок модуля может вызвать эту функцию чтобы инициализировать другие ipa_memfunc функции. memfunc_deinit Потомок модуля может вызвать эту функцию чтобы освободить всю память в mzone и marray, и деинициализировать собственные струк- туры ipa_memfunc. Если флаг foreign не равен нулю, то все сооб- щения об утечке памяти не будут выводится и статистика об использовании памяти будет обнулена. Заметьте, что эта и преды- дущая функция могут быть вызваны только в потомке модуля. m_parser Это указатель на mem_type используемый в парсере во время раз- бора конфигурационного файла. mem_type_new Создать новый mem_type, name это короткое имя для нового mem_type, desc это его описание (обычно несколько слов) и flags это флажки для нового mem_type. На данный момент определён только один флаг IPA_MEMFUNC_FLAG_PTHREAD, который должен быть установлен если память с этим mem_type будет выделяться или освобождаться в нескольких потоках асинхронно. Эта функция воз- вращает указатель на новый mem_type или NULL в случае ошибки. mem_malloc Аналог malloc(3). mem_calloc Аналог calloc(3). mem_realloc Аналог realloc(3). mem_strdup Аналог strdup(3). mem_vasprintf Аналог vasprintf(3) присутствующей на некоторых системах. Эта функция устанавливает в *buf_ptr указатель на буфер достаточного объёма для хранения форматированной строки и возвращает число символов в буфере (не включая последний символ `\0'). Если не удалось выделить достаточного объёма памяти, то эта функция воз- вращает -1 и устанавливает в *buf_ptr NULL. Аргументы format и ap аналогичны аргументам в функции vprintf(3). mem_free Аналог free(3). marray_init Создать marray, name это имя marray, desc это его описание (обычно несколько слов) name и desc должны существовать, пока marray не будет деинициализирован. flags определяет флажки для нового marray, на данный момент определён только один флаг IPA_MEMFUNC_FLAG_PTHREAD, этот флаг должен быть определён, если элементы из этого marray будет выделяться и освобождаться несколькими потоками асинхронно. arr это указатель памяти где необходимо сохранять указатель на действительный массив элемен- тов. isize это размер одного элемента в массиве. nitems обо- значает количество элементов, под которое необходимо изначально выделить память. nalloc обозначает количество элементов, кото- рое необходимо выделять, если в marray не осталось ни одного свободного элемента. Если вы не уверены в значениях этих аргу- ментов, то установите их в 1. Эта функция возвращает указатель на только что созданный marray или NULL, если возникла какая-то ошибка. Заметьте, что указатель сохранённый в памяти указывае- мой arr может быть изменён последующими вызовами функций mar- ray_alloc и marray_free. marray_deinit Освободить память занимаемую marray. Если модуль не вызовет эту функцию, то IPA утилита сообщит об утечке памяти и деинициализи- рует marray модуля, но эта деинициализация не означает, что утечка памяти не возможна, так как деинициализация marray не освобождает память, на которую, возможно, указывают элементы массива. Если marray равен NULL, то эта функция ничего не делает. marray_alloc Выделить память для нового элемента в marray. Если fixed не равен нулю, то *idxp должен указывать быть желаемым индексом нового элемента в marray, иначе эта функция должна выделить память для элемента с наименьшим возможным индексом и сохранить этот индекс в *idxp. Эта функция возвращает 0, если память под новый элемент была выделена и -1, в случае ошибки. Обычно модуль вызывает эту функцию с ненулевым значением fixed. marray_free Вернуть прежде выделенный элемент с индексом idx в marray. marray_minimize Попробовать минимизировать память, занимаемую marray. Такая минимизация возможна, так как marray_alloc и marray_free пыта- ются держать дополнительную память для новых элементов. marray_check_index Эта функция проверяет был ли выделен элемент с индексом idx в marray и если он не был выделен, то возвращается 0, иначе воз- вращается ненулевое значение. marray_nused Функция возвращает количество выделенных элементов в marray. mzone_init Создать mzone, name это имя mzone, desc это её описание (обычно несколько слов). name и desc должны существовать, пока mzone не будет деинициализирована. flags означает тоже самое, что и в функции marray_init, mzone также воспринимает ещё флаг IPA_MEM- FUNC_FLAG_OPTIMIZE, этот флаг должен быть установлен, если в mzone будет много элементов. isize это размер одного элемента в mzone. nitems обозначает количество элементов, под которое необходимо изначально выделить память. nalloc обозначает коли- чество элементов, которое необходимо выделять, если в mzone не осталось ни одного свободного элемента. Если вы не уверены в значениях этих аргументов, то установите их в 1. Эта функция возвращает указатель на только что созданную mzone или NULL, ес- ли возникла какая-то ошибка. mzone_deinit Освободить память занимаемую mzone. Если модуль не вызовет эту функцию, то IPA утилита сообщит об утечке памяти и деинициализи- рует mzone модуля, но эта деинициализация не означает, что утечка памяти не возможна, так как деинициализация mzone не освобождает память, на которую, возможно, указывают элементы массива. Если mzone равен NULL, то эта функция ничего не делает. mzone_alloc Выделить новый элемент в mzone. Эта функция возвращает указа- тель на новый элемент или NULL, если возникла ошибка. mzone_free Вернуть прежде выделенный элемент указываемый ptr в mzone. mzone_nused Функция возвращает количество выделенных элементов в mzone. Экспортируемые модулю функции поддержки Иногда модулю необходимо добавить макропеременную в некоторую секцию конфигурационного файла, или необходимо вывести собственные параметры, когда IPA утилита выводит разобранный конфигурационный файл, или необ- ходимо послать лог-сообщение. Так как модулю не известно каким образом это сделать, IPA утилита, использующая этот модуль, экспортирует модулю функции ipa_memfunc: typedef struct { void (*print_string)(const char *string); void (*print_bytes)(const uint64_t *value); void (*print_time)(const uint64_t *value); void (*print_value)(const uint64_t *value, unsigned int value_type); void (*print_boolean)(int value); void (*print_space)(void); void (*print_param_name)(const char *prefix, const char *param); void (*print_param_args)(const char *format, va_list ap); void (*print_param_end)(void); void (*print_sect_name)(const char *prefix, const char *sect); void (*print_sect_args)(const char *format, va_list ap); void (*print_sect_begin)(void); void (*print_sect_end)(void); void (*open_log)(void); void (*close_log)(void); void (*logmsg)(const char *mod_name, int priority, int code, const char *format, va_list ap); void (*logconferr)(const char *mod_name, int code, const char *format, va_list ap); int (*local_sym_add)(char *sym, char *val, int copy_flag); int (*local_sym_del)(const char *sym); int (*global_sym_add)(char *sym, char *val, int copy_flag); int (*global_sym_del)(const char *sym); } ipa_suppfunc; print_string Эта функция выводит строку в кавычках. print_bytes Эта функция выводит байты. print_time Эта функция выводит время. print_value Эта функция выводит байты, время или 64-битовое беззнаковое целое, если value_type равно IPA_CONF_TYPE_BYTES, IPA_CONF_TYPE_TIME или IPA_CONF_TYPE_UINT64 соответственно. print_boolean Эта функция выводит логическое значение. print_space Эта функция выводит один пробельный символ, если он не был выве- ден прежде. print_param_name Эта функция выводит имя параметра param, с конфигурационным пре- фиксом prefix. Если параметр не имеет конфигурационного пре- фикса, то prefix должен быть равен NULL. print_param_args Эта vprintf(3) подобная функция выводит аргументы параметра, может вызываться несколько раз для одного и того же параметра. print_param_end Эта функция должна быть вызвана после вывода всех аргументов параметра. print_sect_name Эта функция выводит имя секции sect с конфигурационным префиксом prefix. Если секция не имеет конфигурационного префикса, то prefix должен быть равен NULL. print_sect_args Эта vprintf(3) подобная функция выводит аргументы секции, может вызываться несколько раз для одной и той же секции. print_sect_begin Эта функция должна быть вызвана после вывода всех аргументов секции. print_sect_end Эта функция должна быть вызвана в конце секции модуля. open_log, close_log Если необходимо запустить другой процесс (посредством fork(2)), то порождённый процесс может использовать функцию logmsg (опи- сана ниже), но если ему необходимо закрыть какие-то дескрипторы, а затем использовать систему лог-сообщений, то этот процесс дол- жен вызвать сначала функцию close_log, а затем open_log. Созда- ние дескриптора для отправки лог-сообщений задерживается до тех пор пока не будет послано первое сообщение. logmsg Модуль должен использовать эту функцию для вывода лог-сообщений в любой части своего кода, но только не в функциях по обработке конфигурации. mod_name это имя модуля. priority это приоритет сообщения: IPA_LOG_INFO, IPA_LOG_WARNING или IPA_LOG_ERR. code это значение errno(2) или 0 если нет состояния ошибки. format и ap это vprintf(3) подобные аргументы. logconferr Модуль должен использовать эту функцию для вывода сообщений об ошибках во время разбора конфигурационного файла. Аргументы аналогичны аргументам функции logmsg. local_sym_add Создать локальную макропеременную с именем sym и значением val, если copy_flag не равен нулю, то будет выделена память и sym и val будут скопированы в эту память, иначе будут использоваться оригинальные указатели. Эта функция возвращает 0, если макропе- ременная была создана и -1, если произошла ошибка выделения памяти. local_sym_del Удалить локальную макропеременную с именем sym. Если не суще- ствует локальной макропеременной с именем sym, то возвращается -1, иначе 0. У модуля есть выбор не вызывать эту функцию, так как IPA утилита вызовет её автоматически. global_sym_add Аналогично local_sym_add, но для глобальных макропеременных. global_sym_del Аналогично local_sym_del, но для глобальных макропеременных. Описание конфигурационной секции Структура ipa_conf_sect определена следующим образом: typedef struct { const char *sect_name; unsigned int sect_id; int arg_nargs; const char *arg_pattern; regex_t *arg_regexp; unsigned int arg_type; const unsigned int *sect_where; int (*arg_parse)(void *arg); } ipa_conf_sect; sect_name Имя секции. sect_id Идентификатор секции, значение которого локально для модуля. Это значение должно быть больше чем IPA_CONF_SECT_CUSTOM_OFFSET. arg_nargs Число аргументов секции. Установите это поле в 0, если секция не должна иметь ни одного аргумента. Если секция может иметь переменное число аргументов, то необходимо установить в этом поле отрицательное число, абсолютное значение которого равно минимально допустимому числу аргументов секции. arg_pattern Аргумент секции должен соответствовать данному регулярному выра- жению POSIX (расширенный формат). Если такого регулярного выра- жения нет, то это поле следует установить в NULL. arg_regexp Указатель на переменную типа regex_t. Если arg_pattern не NULL, то это значение тоже должно быть не NULL. Возможно разделять регулярные выражения между секциями и параметрами и не тратить лишней памяти для дополнительных переменных. В этом случае только одна секция или параметр должна иметь указатель в arg_pattern, все другие секции и параметры должны установить arg_pattern в NULL. arg_type Тип аргумента. Определены следующие типы: IPA_CONF_TYPE_INT32 - int32_t; IPA_CONF_TYPE_UINT32 - uint32_t; IPA_CONF_TYPE_INT64 - int64_t; IPA_CONF_TYPE_UINT64 - uint64_t; IPA_CONF_TYPE_STRING - строка; IPA_CONF_TYPE_BYTES - байты; IPA_CONF_TYPE_TIME - время; IPA_CONF_TYPE_VALUE - значение; IPA_CONF_TYPE_PER_CENT - процент; IPA_CONF_TYPE_BOOLEAN - логическое значение; IPA_CONF_TYPE_MISC - без формата. Обычно модуль использует регулярное выражение (поле arg_regexp) с типом аргумента IPA_CONF_TYPE_MISC и не использует регулярного выражения с другими типами аргумента. IPA_CONF_TYPE_VALUE обо- значает байты, время или uint64_t значение. См. ниже детали. sect_where Это поле определяет где секция должна быть расположена, это ука- затель на массив 'unsigned int' значений, каждое значение это идентификатор секции, последний элемент в этом массиве должен быть равен нулю. Предопределены следующие идентификаторы сек- ций: IPA_CONF_SECT_ROOT - нет секции; IPA_CONF_SECT_GLOBAL - секция global; IPA_CONF_SECT_RULE - секция rule; IPA_CONF_SECT_LIMIT - секция limit; IPA_CONF_SECT_THRESHOLD - секция threshold; IPA_CONF_SECT_AUTORULE - секция autorule; IPA_CONF_SECT_RULEPAT - секция rulepat; IPA_CONF_SECT_RESTART - секция restart; IPA_CONF_SECT_REACH - секция reach; IPA_CONF_SECT_EXPIRE - секция expire; IPA_CONF_SECT_STARTUP - секция startup; IPA_CONF_SECT_SHUTDOWN - секция shutdown; IPA_CONF_SECT_IF_REACHED - секция if_reached; IPA_CONF_SECT_IF_NOT_REACHED - секция if_not_reached; IPA_CONF_SECT_IF_ALL_REACHED - секция if_all_reached; IPA_CONF_SECT_IF_ANY_REACHED - секция if_any_reached; IPA_CONF_SECT_IF_ALL_NOT_REACHED - секция if_all_not_reached; IPA_CONF_SECT_IF_ANY_NOT_REACHED - секция if_any_not_reached; IPA_CONF_SECT_BELOW_THRESHOLD - секция below_threshold; IPA_CONF_SECT_EQUAL_THRESHOLD - секция equal_threshold; IPA_CONF_SECT_ABOVE_THRESHOLD - секция above_threshold. arg_parse Эта функция вызывается для обработки аргументов. Модуль может установить это поле в NULL, если для секции нет такой функции. arg это указатель на данные, которые зависят от значения arg_type и функция arg_parse должна выполнить следующие преобра- зования типов: IPA_CONF_TYPE_INT32 - *(int32_t *)arg; IPA_CONF_TYPE_UINT32 - *(uint32_t *)arg; IPA_CONF_TYPE_INT64 - *(int64_t *)arg; IPA_CONF_TYPE_UINT64 - *(uint64_t *)arg; IPA_CONF_TYPE_STRING - *(char **)arg; IPA_CONF_TYPE_BYTES - *(uint64_t *)arg; IPA_CONF_TYPE_TIME - *(uint64_t *)arg; IPA_CONF_TYPE_VALUE - *(uint64_t *)arg, *((uint64_t *)arg + 1); IPA_CONF_TYPE_BOOLEAN - *(int *)arg; IPA_CONF_TYPE_MISC - *(char **)arg. Если значение arg_type равно IPA_CONF_TYPE_STRING, то arg явля- ется указателем на память, в которую скопировано значение строки (без кавычек), эта память выделяется при помощи mem_malloc с mem_type m_parser и модуль должен освободить эту память если он в ней не нуждается при помощи mem_free. В других случаях функ- ция arg_parse должна копировать необходимые данные и не исполь- зовать данные по указателям, также разрешено модифицировать дан- ные на которые указывает arg. Если значение arg_type равно IPA_CONF_TYPE_MISC, то arg не будет начинаться с пробельных сим- волов и не будет заканчиваться пробельными символами, также между любыми двумя аргументами в arg будет всего один символ ` '. Если значение arg_type равно IPA_CONF_TYPE_VALUE, то arg указывает на массив, первый элемент которого имеет значение IPA_CONF_TYPE_BYTES, IPA_CONF_TYPE_TIME или IPA_CONF_TYPE_UINT64, второй элемент это само значение. Описание конфигурационного параметра Структура ipa_conf_param определена следующим образом: typedef struct { const char *param_name; int arg_nargs; const char *arg_pattern; regex_t *arg_regexp; unsigned int arg_type; const unsigned int *param_where; int (*arg_parse)(void *arg); } ipa_conf_param; param_name Имя параметра. arg_nargs Объяснено выше. arg_pattern Объяснено выше. arg_regexp Объяснено выше. arg_type Объяснено выше. param_where Объяснено выше для sect_where. arg_parse Объяснено выше. Структура для представления дат Структура ipa_tm определена следующим образом: typedef struct tm ipa_tm; Только следующие поля в структуре ipa_tm могут быть использованы: tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec и tm_wday. Эти поля определяют локальную дату. tm_year равно реальному значению года и tm_mon равно реальному значению месяца. Состояние лимита Состояние лимита описывается структурой ipa_limit_state: struct ipa_limit_state { uint64_t lim; uint64_t cnt; unsigned int event_date_set; ipa_tm event_date[IPA_LIMIT_EVENT_NUM]; }; lim Значение параметра limit. cnt Значение счётчика лимита. event_date_set Это битовое поле, которое определяет действительные элементы в массиве event_date, каждый IPA_LIMIT_EVENT_xxx элемент в массиве event_date имеет соответствующий бит IPA_LIMIT_EVENT_xxx_SET в event_date_set. event_date Это массив дат событий лимита. В этом массиве определены следу- ющие элементы: IPA_LIMIT_EVENT_START - дата, когда лимит был запущен; IPA_LIMIT_EVENT_RESTART - дата, когда лимит будет перезапущен или был перезапущен; IPA_LIMIT_EVENT_RESTART_EXEC - дата, когда были запущены команды для перезапущенного лимита; IPA_LIMIT_EVENT_REACH - дата, когда лимит был достигнут; IPA_LIMIT_EVENT_REACH_EXEC - дата, когда были запущены команды для достигнутого лимита; IPA_LIMIT_EVENT_EXPIRE - дата, когда истечёт срок достигнутого лимита и лимит будет перезапущен или дата, когда истёк срок достигнутого лимита и он был перезапущен; IPA_LIMIT_EVENT_EXPIRE_EXEC - дата, когда были запущены команды для лимита, у которого истёк срок с момента достижения. IPA_LIMIT_EVENT_UPDATED - дата, когда лимита был обновлён в последний раз. Состояние порога Состояние порога описывается структурой ipa_threshold_state: struct ipa_threshold_state { uint64_t thr; uint64_t cnt; ipa_tm tm_from; ipa_tm tm_updated; }; thr Значение параметра threshold. cnt Значение счётчика порога. tm_from, tm_updated Две временные отметки порога. API модуля учёта API модуля учёта экспортируется модулем IPA утилите в структуре ipa_ac_mod: struct ipa_ac_mod { unsigned int api_ver; unsigned int mod_flags; const char *ac_name; const ipa_suppfunc *suppfunc; const ipa_memfunc *memfunc; const char *conf_prefix; ipa_conf_sect *conf_sect_tbl; ipa_conf_param *conf_param_tbl; int (*conf_init)(void); int (*conf_deinit)(void); int (*conf_event)(unsigned int event, unsigned int no, const void *arg); int (*conf_mimic_real)(void); int (*conf_inherit)(unsigned int rulepatno, unsigned int ruleno, const char *rule_name); void (*conf_show)(unsigned int sect_id, unsigned int no); int (*ac_pre_init)(void) int (*ac_init_autorule)(unsigned int autoruleno, const char *autorule_name); int (*ac_init_dynrule)(unsigned int autoruleno, unsigned int ruleno, const char *rule_name); int (*ac_init_statrule)(unsigned int ruleno, const char *rule_name); int (*ac_init)(void); int (*ac_deinit_rule)(unsigned int ruleno); int (*ac_deinit_autorule)(unsigned int autoruleno); int (*ac_deinit)(void); int (*ac_get_stat)(const struct ipa_tm *); int (*ac_get_rule_stat)(unsigned int stat_generation, int newstat, unsigned int ruleno, int *addition, uint64_t *chunk); int (*ac_set_autorule_active)(unsigned int autoruleno, int active); int (*ac_set_rule_active)(unsigned int ruleno, int active); int (*ac_set_limit_active)(unsigned int ruleno, unsigned int limitno, int active); int (*ac_set_threshold_active)(unsigned int ruleno, unsigned int thresholdno, int active); int (*ac_limit_event)(unsigned int ruleno, unsigned int limitno, unsigned int event); int (*ac_threshold_event)(unsigned int ruleno, unsigned int thresholdno, unsigned int event); int (*ac_create_rule)(const char *mod_name, unsigned int autoruleno, unsigned int *ruleno, const char *rule_name, const char *rule_info); void (*ac_delete_rule)(const char *mod_name, unsigned int ruleno); }; api_ver Версия API модуля учёта, модуль должен проверять версии поддер- живаемых API с IPA_AC_MOD_API_VERSION во время компиляции. После загрузки модуля этот номер версии сравнивается с версией используемого API. mod_flags Флажки определяющие режимы работы модуля. Определён только один флаг IPA_MOD_FLAG_PTHREAD_SAFE и он должен быть установлен если модуль может работать в многопотоковой версии IPA утилиты. ac_name Имя системы учёта модуля. suppfunc Указатель на структуру ipa_suppfunc, которая экспортируется модулю. memfunc Указатель на структуру ipa_memfunc, которая экспортируется модулю. conf_prefix Конфигурационный префикс для секций и параметров модуля. Если у модуля нет конфигурационного префикса, то установите это поле в NULL. conf_sect_tbl Указатель на массив ipa_conf_sect структур, которые определяют секции модуля. Последний элемент в этом массиве должен иметь sect_name равное NULL. Если у модуля нет секций, то установите это поле в NULL. conf_param_tbl Указатель на массив ipa_conf_param структур, которые определяют параметры модуля. Последний элемент в этом массиве должен иметь param_name равное NULL. Если у модуля нет параметров, то уста- новите это поле в NULL. conf_init Эта функция вызывается после того, как модуль загружен. conf_deinit Эта функция вызывается после того, как обработан весь конфигура- ционный файл. conf_event Эта функция вызывается каждый раз, когда происходит некоторое событие во время конфигурации. conf_event описывает событие конфигурации. Конфигурационные события позволяют модулю узнать для какой секции принадлежит его параметр или секция. Опреде- лены следующие события конфигурации: IPA_CONF_EVENT_GLOBAL_BEGIN - начало секции global; IPA_CONF_EVENT_GLOBAL_END - конец секции global; IPA_CONF_EVENT_RULE_BEGIN - начало секции rule, arg это указа- тель на строку с именем правила и должен быть преобразован в (const char *), no это порядковый номер этой секции в конфигура- ционном файле, начиная с 0; IPA_CONF_EVENT_RULE_END - конец секции rule; IPA_CONF_EVENT_LIMIT_BEGIN - начало секции limit, arg указывает на строку с именем лимита и должен быть преобразован в (const char *), no это порядковый номер этой секции в текущей секции, начиная с 0; IPA_CONF_EVENT_LIMIT_END - конец секции limit; IPA_CONF_EVENT_THRESHOLD_BEGIN - начало секции threshold, arg указывает на строку с именем порога и должен быть преобразован в (const char *), no это порядковый номер этой секции в текущей секции, начиная с 0; IPA_CONF_EVENT_THRESHOLD_END - конец секции threshold; IPA_CONF_EVENT_AUTORULE_BEGIN - начало секции autorule, arg ука- зывает на строку с именем автоправила и должен быть преобразован в (const char *), no это порядковый номер этой секции в конфигу- рационном файле, начиная с 0; IPA_CONF_EVENT_AUTORULE_END - конец секции autorule; IPA_CONF_EVENT_RULEPAT_BEGIN - начала секции rulepat, arg указы- вает на регулярное выражение POSIX и должен быть преобразован в (const char *), no это порядковый номер этой секции в конфигура- ционном файле, начиная с 0; IPA_CONF_EVENT_RULEPAT_END - конец секции rulepat; IPA_CONF_EVENT_CUSTOM_SECT_BEGIN - начало собственной секции модуля, no это идентификатор секции модуля; IPA_CONF_EVENT_CUSTOM_SECT_END - конец собственной секции модуля. Существуют события конфигурации IPA_CONF_EVENT_xxx_BEGIN для остальных секций IPA_CONF_SECT_xxx, но для этих событий модуль должен игнорировать аргументы no и arg. Для каждого перечисленного события конфигурации есть соответ- ствующее событие IPA_CONF_EVENT_xxx_END, которое получает анало- гичные аргументы. conf_mimic_real Если эта функция вызвана, то модуль должен сымитировать реальную конфигурацию. conf_inherit В этой функции модуль должен унаследовать все установки из сек- ции rulepat номер rulepatno для правила номер ruleno с именем rule_name. Если эта функция вызывается до ac_pre_init, то модуль должен использовать функцию logconferr для сообщений о возникших ошибках, иначе должна быть использована функция logmsg. conf_show Эта функция вызывается, когда IPA утилита выводит обработанный конфигурационный файл. sect_id это идентификатор секции. no это порядковый номер секции с данным идентификатором. Если модуль имеет конфигурацию в секции с данным идентификатором, то он должен вывести эту конфигурацию. Модуль не должен напрямую выводить свою конфигурацию, вместо этого следует использовать функции из структуры suppfunc. ac_pre_init Эта функция вызывается после обработки конфигурационного файла. Модуль должен выполнить предварительную инициализацию своей системы учёта. Эта функция всегда вызывается перед остальными функциями ac_init*. ac_init_autorule Эта функция вызывается, если некоторое автоправило использует модуль. autoruleno это номер автоправила, autorule_name это его имя. ac_init_dynrule Эта функция вызывается, если некоторое динамическое правило использует модуль. autoruleno это номер автоправила из которого было сгенерировано динамическое правило, ruleno это номер дина- мического правила, rule_name это его имя. Данные на которые указывает rule_name будут существовать до тех пор пока не будет вызвана ac_deinit_rule для этого правила. Эта функция вызыва- ется тогда, когда модуль вызывает ac_create_rule из ac_get_stat. ac_init_statrule Тоже самое что и ac_init_dynrule, только для статических правил и эта функция вызывается после фазы конфигурации. ac_init Эта функция вызывается после все остальных функций ac_init* (за исключением ac_init_dynrule, которая вызывается из ac_cre- ate_rule). ac_deinit_rule Эта функция вызывается при деинициализации правила, использую- щего модуль. Модуль не должен ожидать, что функция ac_init_*rule была вызвана прежде для этого правила. Эта функ- ция вызывается для статических и динамических правил. ac_deinit_autorule Эта функция вызывается при деинициализации автоправила, исполь- зующего модуль. Модуль не должен ожидать, что функция ac_init_autorule была вызвана прежде для этого автоправила. ac_deinit Эта функция вызывается при деинициализации модуля. Модуль не должен ожидать, что функции ac_*init были вызваны прежде. Эта функция всегда вызывается после всех остальных функций ac_deinit_*. ac_get_stat Эта функция вызывается перед вызовом функции ac_get_rule_stat. ctm это текущая локальная дата. Существует внутренний номер генерации статистики, который изменяется всякий раз когда вызы- вается функция ac_get_stat любого из модулей и его значение все- гда больше нуля. ac_get_rule_stat Эта функция должна возвращать статистику для правила номер ruleno. Значение stat_generation это номер генерации статистики (см. описание выше). Флаг newstat обозначает, что модуль должен рассматривать, что это первый вызов этой функции (например, этот флаг не равен нулю когда правило становится активным). chunk указывает на статистику возвращаемую модулем и *addition опреде- ляет действие со статистикой, если его значение не равно нулю, то возвращаемая статистика добавляется, иначе вычитается. Здесь под статистикой понимается статистика за период между двумя вызовами функции ac_get_rule_stat. Эта функция не вызывается если правило, которое использует этот модуль, неактивно. ac_set_autorule_active Эта функция должна отметить автоправило как активное или неак- тивное. Если флаг active равен нулю, то автоправило должно быть отмечено как неактивное в модуле, иначе как активное. ac_set_rule_active Аналогично предыдущему, только для правила. ac_set_limit_active Аналогично предыдущему, только для лимита. ac_set_threshold_active Аналогично предыдущему, только для порога. ac_limit_event Эта функция вызывается когда происходит некоторое событие с лимитом. Событие event может быть: IPA_LIMIT_EVENT_RESTART - лимит перезапущен; IPA_LIMIT_EVENT_REACH - лимит достигнут; IPA_LIMIT_EVENT_EXPIRE - достигнутый лимит перезапущен; IPA_LIMIT_EVENT_STARTUP_IF_REACHED - достигнутый при старте; IPA_LIMIT_EVENT_STARTUP_IF_NOT_REACHED - не достигнутый при старте; IPA_LIMIT_EVENT_SHUTDOWN_IF_REACHED - достигнутый во время останова; IPA_LIMIT_EVENT_SHUTDOWN_IF_NOT_REACHED - не достигнутый во время останова. ac_threshold_event Эта функция вызывается когда происходит некоторое событие с порогом. Событие event означает, что значение счётчика порога: IPA_THRESHOLD_EVENT_BELOW - ниже значения threshold; IPA_THRESHOLD_EVENT_EQUAL - равно значению threshold; IPA_THRESHOLD_EVENT_ABOVE - выше значения threshold. ac_create_rule Эта функция экспортируется модулю. Модуль должен вызывать эту функцию только из функции ac_get_stat чтобы создать динамическое правило. mod_name это имя модуля (используется только для отладки и только в этой функции). autoruleno это номер автоправила из которого необходимо сгенери- ровать динамическое правило. rule_name это имя правила, rule_info это его описание, эти строки не используются по указа- телям, поэтому если модуль выделил память для них, то он должен сам освободить эту память. Если не произошла какая-нибудь ошибка, то вызывается ac_init_dynrule. Эта функция возвращает 0, если динамическое правило было создано, -2 если правило с данным именем уже существует и -1 ес- ли произошла какая-то критическая ошибка, в этом случае модуль обязан вернуть -1 из ac_get_stat. ac_delete_rule Эта функция экспортируется модулю. Модуль должен вызывать эту функцию только из функции ac_get_stat чтобы деинициализировать динамическое правило номер ruleno созданное прежде функцией ac_create_rule. mod_name это имя модуля (используется только для отладки и только в этой функ- ции). Для данного правила в какой-то момент будет вызвана функ- ция ac_deinit_rule. Если не произошла какая-нибудь ошибка, то эта функция возвращает 0. Если возникли проблемы с деинициализацией, то возвращается -1, в этом случае модуль обязан вернуть -1 из ac_get_stat. Если какая-то функция, кроме ac_create_rule, возвращает числовое значе- ние, то в случае успешного выполнения эта функция должна вернуть значе- ние 0, иначе должно быть возвращено значение -1. Если модуль не поддерживает какую-то функцию для статического или дина- мического правила, для автоправила, для лимита или порога, то он должен установить соответствующее поле в NULL. Если какая-то функция экспортируется модулю, то соответствующее поле может быть установлено в любое значение (обычно NULL). API модуля базы данных API модуля базы данных экспортируется модулем IPA утилите в структуре ipa_db_mod: struct ipa_db_mod { unsigned int api_ver; unsigned int mod_flags; const char *db_name; const ipa_suppfunc *suppfunc; const ipa_memfunc *memfunc; const char *conf_prefix; ipa_conf_sect *conf_sect_tbl; ipa_conf_param *conf_param_tbl; int (*conf_init)(void); int (*conf_deinit)(void); int (*conf_event)(unsigned int event, unsigned int no, const void *arg); int (*conf_mimic_real)(void); int (*conf_inherit)(unsigned int rulepatno, unsigned int ruleno, const char *rule_name); void (*conf_show)(unsigned int sect_id, unsigned int no); int (*db_pre_init)(void); int (*db_init_dynrule)(unsigned int autoruleno, unsigned int ruleno, const char *rule_name, const char *rule_info); int (*db_init_statrule)(unsigned int ruleno, const char *rule_name, const char *rule_info); int (*db_init_dynlimit)(unsigned int autoruleno, unsigned int ruleno, const char *rule_name, const char *rule_info, unsigned int limitno, const char *limit_name, const char *limit_info); int (*db_init_statlimit)(unsigned int ruleno, const char *rule_name, const char *rule_info, unsigned int limitno, const char *limit_name, const char *limit_info); int (*db_init_dynthreshold)(unsigned int autoruleno, unsigned int ruleno, const char *rule_name, const char *rule_info, unsigned int thresholdno, const char *threshold_name, const char *threshold_info); int (*db_init_statthreshold)(unsigned int ruleno, const char *rule_name, const char *rule_info, unsigned int thresholdno, const char *threshold_name, const char *threshold_info); int (*db_init)(void); int (*db_get_limit_state)(unsigned int ruleno, unsigned int limitno, struct ipa_limit_state *state); int (*db_set_limit_state)(unsigned int ruleno, unsigned int limitno, const struct ipa_limit_state *state, int new_state); int (*db_get_threshold_state)(unsigned int ruleno, unsigned int thresholdno, struct ipa_threshold_state *state); int (*db_set_threshold_state)(unsigned int ruleno, unsigned int thresholdno, const struct ipa_threshold_state *state); int (*db_deinit_threshold)(unsigned int ruleno, unsigned int thresholdno); int (*db_deinit_limit)(unsigned int ruleno, unsigned int limitno); int (*db_deinit_rule)(unsigned int ruleno); int (*db_deinit)(void); int (*db_append_rule)(unsigned int ruleno, const uint64_t *cnt, const ipa_tm *ctm); int (*db_update_rule)(unsigned int ruleno, const uint64_t *cnt, const ipa_tm *ctm); int (*db_update_limit)(unsigned int ruleno, unsigned int limitno, const uint64_t *value, const ipa_tm *ctm); int (*db_limit_event)(unsigned int ruleno, unsigned int limitno, unsigned int event, const ipa_tm *etm, const ipa_tm *ctm); int (*db_update_threshold)(unsigned int ruleno, unsigned int thresholdno, const uint64_t *cnt, const ipa_tm *tm_from, const ipa_tm *tm_updated); int (*db_set_rule_active)(unsigned int ruleno, int active); int (*db_set_limit_active)(unsigned int ruleno, unsigned int limitno, int active); int (*db_set_threshold_active)(unsigned int ruleno, unsigned int thresholdno, int active); } api_ver Версия API модуля базы данных, модуль должен проверять версии поддерживаемых API с IPA_DB_MOD_API_VERSION во время компиляции. После загрузки модуля этот номер версии сравнивается с версией используемого API. mod_flags Объяснено выше. db_name Имя базы данных модуля. suppfunc Объяснено выше. memfunc Объяснено выше. conf_prefix Объяснено выше. conf_sect_tbl Объяснено выше. conf_param_tbl Объяснено выше. conf_init Объяснено выше. conf_deinit Объяснено выше. conf_event Объяснено выше. conf_mimic_real Объяснено выше. conf_inherit Объяснено выше. conf_show Объяснено выше. db_pre_init Эта функция вызывается после обработки конфигурационного файла. Модуль должен выполнить общую инициализацию своей базы данных. Эта функция всегда вызывается перед остальными функциями db_init*. db_init_dynrule Эта функция вызывается, если некоторое динамическое правило использует модуль. autoruleno это номер автоправила из которого было сгенерировано динамическое правило, ruleno это номер дина- мического правила, rule_name это имя правила, rule_info это опи- сание правила. Только данные на которые указывает rule_name будут существовать до тех пор пока не будет вызвана db_deinit_rule для этого правила. db_init_statrule Тоже самое что и db_init_dynrule, только для статических правил. db_init_dynlimit Эта функция вызывается, если некоторый лимит из динамического правила использует модуль. limitno это порядковый номер лимита в правиле, limit_name это его имя и limit_info это его описание. Остальные аргументы означают тоже самое что и в db_init_dynrule. Только данные на которые указывают rule_name и limit_name будут существовать до тех пор пока не будет вызвана db_deinit_limit для этого лимита. Так как правило может использовать другую базу данных, то модуль не должен ожидать, что функция db_init_dynrule была вызвана прежде для правила лимита. Если правило лимита также использует этот модуль, то db_init_dynrule для правила вызывается первой. db_init_statlimit Тоже самое что и db_init_dynlimit, только для лимитов статиче- ских правил. db_init_dynthreshold Эта функция вызывается, если некоторый порог из динамического правила использует модуль. thresholdno это порядковый номер порога в правиле, threshold_name это его имя и threshold_info это его описание. Остальные аргументы означают тоже самое что и в db_init_dynrule. Только данные на которые указывают rule_name и threshold_name будут существовать до тех пор пока не будет вызвана db_deinit_threshold для этого порога. Так как правило может использовать другую базу данных, то модуль не должен ожи- дать, что функция db_init_dynrule была вызвана прежде для пра- вила порога. Если правило порога также использует этот модуль, то db_init_dynrule для правила вызывается первой. db_init_threshold Тоже самое что и db_init_dynthreshold, только для порогов стати- ческих правил. db_init Эта функция вызывается после все остальных функций db_init_stat*. db_get_limit_state Эта функция должна возвращать текущее состояние лимита. Если модуль не имеет текущего состояния лимита, то функция должна вернуть нуль. Если модуль имеет текущее состояние лимита, то функция должна вернуть 1. db_set_limit_state Эта функция должна установить новое состояние лимита. Если new_state равно нуль, то текущее состояние лимита в базе данных должно быть обновлено, иначе должно быть зарегистрировано новое состояние лимита. db_get_threshold_state Эта функция должна возвращать текущее состояние порога. Если модуль не имеет текущего состояния порога, то функция должна вернуть нуль. Если модуль имеет текущее состояние порога, то функция должна вернуть 1. db_set_threshold_state Эта функция должна обновить текущее состояние порога. db_deinit_threshold Эта функция вызывается при деинициализации порога, использующего модуль. Модуль не должен ожидать, что функция db_init_*thresh- old была вызвана прежде для этого порога. db_deinit_limit Эта функция вызывается при деинициализации лимита, использующего модуль. Модуль не должен ожидать, что функция db_init_*limit была вызвана прежде для этого лимита. db_deinit_rule Эта функция вызывается при деинициализации правила, использую- щего модуль. Если какой-то лимит или порог правила также использует этот модуль, то функция db_deinit_limit или db_deinit_threshold вызывается первой. Модуль не должен ожи- дать, что функция db_init_*rule была вызвана прежде для этого правила. db_deinit Эта функция вызывается при деинициализации модуля. Модуль не должен ожидать, что функции db_*init были вызваны прежде. Эта функция всегда вызывается после всех остальных функций db_deinit_*. db_append_rule Эта функция должна добавлять новую запись в базу данных для заданного правила. cnt это указатель на новое значение счётчика правила. ctm это текущая локальная дата. Эта функция вызыва- ется перед первым вызовом функции db_update_rule. db_update_rule Эта функция должна обновлять запись в базе данных для данного правила. cnt это указатель на новое значение счётчика, ctm это текущая локальная дата. db_update_limit Эта функция должна обновлять состояние лимита в базе данных. cnt это указатель на новое значение счётчика, ctm это текущая локальная дата. Модуль также должен обновить дату IPA_LIMIT_EVENT_UPDATED. db_limit_event Эта функция должна регистрировать событие event для лимита в базе данных. Данное событие может происходить прямо сейчас или в будущем. etm равно локальной дате данного события, а ctm равно текущей локальной дате. Модуль также должен обновить дату IPA_LIMIT_EVENT_UPDATED. Эта функция вызывается только для сле- дующих событий лимита IPA_LIMIT_EVENT_: RESTART_EXEC, REACH, REACH_EXEC, EXPIRE и EXPIRE_EXEC. db_update_threshold Эта функция должна обновлять состояние порога в базе данных. cnt это указатель на новое значение счётчика, tm_from и tm_updated это две временные отметки порога. db_set_rule_active Объяснено выше в ac_set_rule_active. Если правило помечается как активное, то db_append_rule будет вызвана перед db_update_rule. db_set_limit_active Объяснено выше в ac_set_limit_active. db_set_threshold_active Объяснено выше в ac_set_threshold_active. Если какая-то функция возвращает числовое значение, то в случае ошибки необходимо вернуть значение -1, иначе функция должна вернуть значение 0 (если соответствующее описание не определяет другого значения). Если модуль базы данных не поддерживает динамических правил, лимитов или порогов, то он должен установить соответствующее поле db_init_dyn* в NULL. Если модуль базы данных не поддерживает статических правил, лимитов или порогов, то необходимо установить соответствующее поле db_init_stat* в NULL. Если модуль базы данных не поддерживает функцию db_get_limit_state, db_get_threshold_state, db_set_*active, то необходимо установить соот- ветствующее поле в NULL. Если какая-то функция экспортируется модулю, то соответствующее поле может быть установлено в любое значение (обычно NULL). API модуля статистики API модуля статистики экспортируется модулем IPA утилите в структуре ipa_st_mod: struct ipa_entity_desc { char *name; char *info; }; struct ipa_rule_stat { unsigned int year; unsigned char mon; unsigned char mday; unsigned char h1, m1, s1; unsigned char h2, m2, s2; uint64_t cnt; }; struct ipa_st_mod { unsigned int api_ver; unsigned int mod_flags; const char *st_name; const ipa_suppfunc *suppfunc; const ipa_memfunc *memfunc; const char *conf_prefix; ipa_conf_sect *conf_sect_tbl; ipa_conf_param *conf_param_tbl; int (*conf_init)(void); int (*conf_deinit)(void); int (*conf_event)(unsigned int event, unsigned int no, const void *arg); int (*conf_mimic_real)(void); int (*conf_inherit)(unsigned int rulepatno, unsigned int ruleno, const char *rule_name); void (*conf_show)(unsigned int sect_id, unsigned int no); int (*st_pre_init)(void); int (*st_init_rule)(unsigned int ruleno, const char *rule_name); int (*st_init_limit)(unsigned int ruleno, const char *rule_name, unsigned int limitno, const char *limit_name); int (*st_init_threshold)(unsigned int ruleno, const char *rule_name, unsigned int thresholdno, const char *threshold_name); int (*st_init)(void); int (*st_deinit_threshold)(unsigned int ruleno, unsigned int thresholdno); int (*st_deinit_limit)(unsigned int ruleno, unsigned int limitno); int (*st_deinit_rule)(unsigned int ruleno); int (*st_deinit)(void); int (*st_get_rule_info)(unsigned int ruleno, ipa_mem_type *mem_type, char **info_ptr); int (*st_get_limit_info)(unsigned int ruleno, unsigned int limitno, ipa_mem_type *mem_type, char **info_ptr); int (*st_get_threshold_info)(unsigned int ruleno, unsigned int thresholdno, ipa_mem_type *mem_type, char **info_ptr); int (*st_get_rules_list)(const char *pat, const regex_t *pat_reg, ipa_mem_type *mem_type, unsigned int *n, struct ipa_entity_desc **buf_ptr); int (*st_get_limits_list)(unsigned int ruleno, const char *pat, const regex_t *pat_reg, ipa_mem_type *mem_type, unsigned int *n, struct ipa_entity_desc **buf_ptr); int (*st_get_thresholds_list)(unsigned int ruleno, const char *pat, const regex_t *pat_reg, ipa_mem_type *mem_type, unsigned int *n, struct ipa_entity_desc **buf_ptr); int (*st_get_rule_stat)(unsigned int ruleno, const ipa_tm *tm1, const ipa_tm *tm2, int exact, ipa_mem_type *mem_type, unsigned int *n, struct ipa_rule_stat **buf_ptr); int (*st_get_limit_stat)(unsigned int ruleno, unsigned int limitno, const ipa_tm *tm1, const ipa_tm *tm2, ipa_mem_type *mem_type, unsigned int *n, struct ipa_limit_state **buf_ptr); int (*st_get_threshold_stat)(unsigned int ruleno, unsigned int thresholdno, struct ipa_threshold_state *buf); }; api_ver Версия API модуля статистики модуль должен проверять версии под- держиваемых API с IPA_ST_MOD_API_VERSION во время компиляции. После загрузки модуля этот номер версии сравнивается с версией используемого API. mod_flags Объяснено выше. st_name Имя системы статистики модуля. suppfunc Объяснено выше. memfunc Объяснено выше. conf_prefix Объяснено выше. conf_sect_tbl Объяснено выше. conf_param_tbl Объяснено выше. conf_init Объяснено выше. conf_deinit Объяснено выше. conf_event Объяснено выше. conf_mimic_real Объяснено выше. conf_inherit Объяснено выше. conf_show Объяснено выше. st_pre_init Эта функция вызывается после обработки конфигурационного файла. Модуль должен выполнить общую инициализацию своей системы стати- стики. Эта функция всегда вызывается перед остальными функциями st_init*. st_init_rule Эта функция вызывается, если некоторое правило использует модуль. ruleno это номер правила, rule_name это его имя. Дан- ные на которые указывает rule_name будут существовать пока не будет вызвана функция st_deinit_rule для этого правила. Эта функция может быть вызвана для правила, которое имеет соответ- ствующую секцию в конфигурационном файле и для правила, которое было сгенерировано на лету (можно рассматривать как динамическое правило). st_init_limit Эта функция вызывается, если некоторый лимит использует модуль. limitno это порядковый номер лимита в правиле, limit_name это его имя. Только данные на которые указывает rule_name и limit_name будут существовать пока не будет вызвана функция st_deinit_limit для этого лимита. Так как правило может исполь- зовать другую систему статистики, то модуль не должен ожидать, что функция st_init_rule была вызвана прежде для правила лимита. Если правило лимита также использует этот модуль, то st_init_rule для правила вызывается первой. Подобно st_init_rule эта функция может быть вызвана для правила и/или лимита, которое имеет соответствующую секцию в конфигурационном файле и для правила и/или лимита, которое было сгенерировано на лету (могут рассматриваться как динамическое правило и/или лимит). st_init_threshold Эта функция вызывается, если некоторый порог использует модуль. thresholdno это порядковый номер порога в правиле, thresh- old_name это его имя. Только данные на которые указывает rule_name и threshold_name будут существовать пока не будет вызвана функция st_deinit_threshold для этого порога. Так как правило может использовать другую систему статистики, то модуль не должен ожидать, что функция st_init_rule была вызвана прежде для правила порога. Если правило порога также использует этот модуль, то st_init_rule для правила вызывается первой. Подобно st_init_rule эта функция может быть вызвана для правила и/или порога, которое имеет соответствующую секцию в конфигурационном файле и для правила и/или порога, которое было сгенерировано на лету (могут рассматриваться как динамическое правило и/или порог). st_init Эта функция вызывается после все остальных функций st_init*. st_deinit_threshold Эта функция вызывается при деинициализации порога, использующего модуль. Модуль не должен ожидать, что функция st_init_threshold была вызвана прежде для этого порога. st_deinit_limit Эта функция вызывается при деинициализации лимита, использующего модуль. Модуль не должен ожидать, что функция st_init_limit была вызвана прежде для этого лимита. st_deinit_rule Эта функция вызывается при деинициализации правила, использую- щего модуль. Если какой-то лимит или порог правила также использует этот модуль, то функция st_deinit_limit или st_deinit_threshold вызывается первой. Модуль не должен ожи- дать, что функция st_init_rule была вызвана прежде для этого правила. st_deinit Эта функция вызывается при деинициализации модуля. Модуль не должен ожидать, что функции st_*init были вызваны прежде. Эта функция всегда вызывается после всех остальных функций st_deinit_*. st_get_rule_info Эта функция должна вернуть описание для правила номер ruleno, указатель на описание правила должен быть сохранён в *info_ptr. Если правило не имеет описания, то *info_ptr должно быть уста- новлено в NULL. st_get_limit_info Тоже самое что и st_get_rule_info, только для лимита. st_get_threshold_info Тоже самое что и st_get_rule_info, только для порога. st_get_rules_list Эта функция должна вернуть массив с именами и описаниями правил. Если регулярное выражение POSIX pat не NULL, то модуль должен вернуть только правила с именами, соответствующими этому регу- лярному выражению (pat_reg это скомпилированное регулярное выра- жение pat). Указатель на массив структур struct ipa_entity_desc должен быть сохранён в *buf_ptr, число элементов массива должно быть сохранено в *n. Если число элементов массива равно нулю, то *buf_ptr должно быть установлено в NULL. st_get_limits_list Тоже самое что и st_get_rules_list, только для лимитов. st_get_thresholds_list Тоже самое что и st_get_rules_list, только для порогов. st_get_rule_stat Эта функция используется для запроса статистики для правила номер ruleno за временной интервал с tm1 по tm2. Если exact равно нулю, то обе временные отметки записей правила должны быть внутри данного временного интервала, иначе только одна из вре- менных отметок записей правила должна быть внутри данного вре- менного интервала. Указатель на массив структур struct ipa_rule_stat должен быть сохранён в *buf_ptr, число эле- ментов массива должно быть сохранено в *n. Если число элементов массива равно нулю, то *buf_ptr должно быть установлено в NULL. В структуре struct ipa_rule_stat поля year, mon и mday опреде- ляют дату обоих временных отметок записи правила (новая запись для правила всегда добавляется для нового дня, поэтому доста- точно всего трёх полей для обоих временных отметок). t1, m1 и s1 это время первой временной отметки, t2, m2 и s1 это время второй временной отметки. cnt это статистика одной записи пра- вила. st_get_limit_stat Эта функция используется для запроса статистики для лимита номер limitno из правила номер ruleno, даты когда лимит был запущен должны быть в интервале от tm1 до tm2. Указатель на массив структур struct ipa_limit_state должен быть сохранён в *buf_ptr, число элементов массива должно быть сохранено в *n. Если число элементов массива равно нулю, то значение *buf_ptr должно быть установлено в NULL. Если tm1 равно NULL, то должно быть возвра- щено текущее состояние лимита. st_get_threshold_stat Эта функция используется для запроса текущего состояния для порога номер thresholdno из правила номер ruleno. Если модуль не имеет текущего состояния порога, то функция должна вернуть нуль. Если модуль имеет текущее состояние порога, то функция должна вернуть 1. Если какая-то функция возвращает числовое значение, то в случае ощибки необходимо вернуть значение -1, иначе функция должна вернуть значение 0 (если соответствующее описание не определяет другого значения). Если модуль статистики не поддерживает какие-то функции по запросу ста- тистики или описания, то необходимо установить соответствующие поля в NULL. Если какая-то функция принимает аргумент mem_type, то вся память выде- ляемая этой функцией и возвращаемая как результат должна быть выделена с помощью функций ipa_memfunc с типом памяти mem_type. Если какая-то функция экспортируется модулю, то соответствующее поле может быть установлено в любое значение (обычно NULL). ДРУГИЕ ИСТОЧНИКИ ipa(8), ipactl(8), ipastat(8), ipa.conf(5), ipastat.conf(5) АВТОР Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua> НЕДОРАБОТКИ Если вы обнаружите какие-либо ошибки, то, пожалуйста, сообщите мне по email. 5 декабря 2010 г. IPA_MOD(3)