/*- * Copyright (c) 2003-2004 Andrey Simonenko * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)$Id: ipa_mod.h,v 1.3 2005/12/20 16:24:13 simon Exp $ */ #ifndef IPA_MOD_H #define IPA_MOD_H #include #include #include #include #define IPA_MEMFUNC_API_VERSION 1 /* Version of ipa_memfunc API. */ #define IPA_MEMFUNC_FLAG_PTHREAD 0x01 /* Memory object is used from several threads. */ #define IPA_MEMFUNC_FLAG_OPTIMIZE 0x02 /* Optimize memory allocations. */ typedef struct ipa_mem_type_struct ipa_mem_type; typedef struct ipa_marray_struct ipa_marray; typedef struct ipa_mzone_struct ipa_mzone; /* * Exported memory manipulation functions for module. */ typedef struct { unsigned api_ver; int (*memfunc_init)(void); void (*memfunc_deinit)(int); ipa_mem_type *m_parser; ipa_mem_type *(*mem_type_new)(const char *, const char *, unsigned); void *(*mem_malloc)(size_t, ipa_mem_type *); void *(*mem_calloc)(size_t, size_t, ipa_mem_type *); void *(*mem_realloc)(void *, size_t, ipa_mem_type *); char *(*mem_strdup)(const char *, ipa_mem_type *); int (*mem_vasprintf)(ipa_mem_type *, char **, const char *, va_list); void (*mem_free)(void *, ipa_mem_type *); ipa_marray *(*marray_init)(const char *, const char *, unsigned, void **, size_t, unsigned, unsigned); void (*marray_deinit)(ipa_marray *); int (*marray_alloc)(ipa_marray *, unsigned *, int); void (*marray_free)(ipa_marray *, unsigned); void (*marray_minimize)(ipa_marray *); int (*marray_check_index)(ipa_marray *, unsigned); unsigned (*marray_nused)(ipa_marray *); ipa_mzone *(*mzone_init)(const char *, const char *, unsigned, size_t, unsigned, unsigned); void (*mzone_deinit)(ipa_mzone *); void *(*mzone_alloc)(ipa_mzone *); void (*mzone_free)(ipa_mzone *, void *); unsigned (*mzone_nused)(ipa_mzone *); } ipa_memfunc; /* * Versions of ipa_mod(3) APIs. */ #define IPA_AC_MOD_API_VERSION 1 /* Version of ipa_ac_mod API. */ #define IPA_DB_MOD_API_VERSION 1 /* Version of ipa_db_mod API. */ #define IPA_ST_MOD_API_VERSION 1 /* Version of ipa_st_mod API. */ /* * Modules flags. */ #define IPA_MOD_FLAG_PTHREAD_SAFE 0x1 /* * Log priority constants. */ enum { IPA_LOG_INFO = 0, IPA_LOG_WARNING, /* 1 */ IPA_LOG_ERR /* 2 */ }; /* * Type of parameter's argument. */ #define IPA_CONF_TYPE_INT32 0 /* int32_t */ #define IPA_CONF_TYPE_UINT32 1 /* uint32_t */ #define IPA_CONF_TYPE_INT64 2 /* int64_t */ #define IPA_CONF_TYPE_UINT64 3 /* uint64_t */ #define IPA_CONF_TYPE_STRING 4 /* "string" */ #define IPA_CONF_TYPE_BYTES 5 /* bytes */ #define IPA_CONF_TYPE_TIME 6 /* time */ #define IPA_CONF_TYPE_VALUE 7 /* value */ #define IPA_CONF_TYPE_PER_CENT 8 /* per cent */ #define IPA_CONF_TYPE_BOOLEAN 9 /* int */ #define IPA_CONF_TYPE_MISC 10 /* anything */ /* * Section IDs needed by a module. */ #define IPA_CONF_SECT_ROOT 1 /* no section */ #define IPA_CONF_SECT_GLOBAL 2 /* global{} */ #define IPA_CONF_SECT_RULE 3 /* rule{} */ #define IPA_CONF_SECT_LIMIT 4 /* limit{} */ #define IPA_CONF_SECT_THRESHOLD 5 /* threshold{} */ #define IPA_CONF_SECT_AUTORULE 6 /* autorule{} */ #define IPA_CONF_SECT_RULEPAT 7 /* rulepat{} */ /* * The offset for custom sections numbers. */ #define IPA_CONF_SECT_CUSTOM_OFFSET 0x80000000 /* * A structure for describing a parameter. */ typedef struct { const char *param_name; /* Parameter name. */ int arg_nargs; /* Number of expected arguments. */ const char *arg_pattern; /* Pattern for parameter arguments or NULL. */ regex_t *arg_regexp; /* Will be generated from arg_pattern. */ unsigned arg_type; /* Type of argument. */ const unsigned *param_where; /* Array of places where this parameter can be placed. */ int (*arg_parse)(void *); /* Module's parse function or NULL. */ } ipa_conf_param; /* * A structure for describing a section. */ typedef struct { const char *sect_name; /* Section name. */ unsigned sect_id; /* Section ID. */ int arg_nargs; /* Number of expected arguments. */ const char *arg_pattern; /* Pattern for section arguments or NULL. */ regex_t *arg_regexp; /* Will be generated from arg_patterm. */ unsigned arg_type; /* Type of argument. */ const unsigned *sect_where; /* Array of places where this section can be placed. */ int (*arg_parse)(void *); /* Module's parse function or NULL. */ } ipa_conf_sect; /* * Configuration events constants. */ #define IPA_CONF_EVENT_GLOBAL_BEGIN 0 #define IPA_CONF_EVENT_GLOBAL_END 1 #define IPA_CONF_EVENT_RULE_BEGIN 2 #define IPA_CONF_EVENT_RULE_END 3 #define IPA_CONF_EVENT_LIMIT_BEGIN 4 #define IPA_CONF_EVENT_LIMIT_END 5 #define IPA_CONF_EVENT_THRESHOLD_BEGIN 6 #define IPA_CONF_EVENT_THRESHOLD_END 7 #define IPA_CONF_EVENT_AUTORULE_BEGIN 8 #define IPA_CONF_EVENT_AUTORULE_END 9 #define IPA_CONF_EVENT_RULEPAT_BEGIN 10 #define IPA_CONF_EVENT_RULEPAT_END 11 #define IPA_CONF_EVENT_CUSTOM_SECT_BEGIN 12 #define IPA_CONF_EVENT_CUSTOM_SECT_END 13 /* * Exported support functions for module. */ typedef struct { void (*print_string)(const char *); void (*print_bytes)(const uint64_t *); void (*print_time)(const uint64_t *); void (*print_value)(const uint64_t *, unsigned); void (*print_boolean)(int); void (*print_space)(void); void (*set_indent)(int); void (*print_param_name)(const char *, const char *); void (*print_param_args)(const char *, va_list); void (*print_param_end)(void); void (*print_sect_name)(const char *, const char *); void (*print_sect_args)(const char *, va_list); void (*print_sect_begin)(void); void (*print_sect_end)(void); void (*open_log)(void); void (*close_log)(void); void (*logmsg)(const char *, int, int, const char *, va_list); void (*logconferr)(const char *, int, const char *, va_list); int (*local_sym_add)(char *, char *, int); int (*local_sym_del)(const char *); int (*global_sym_add)(char *, char *, int); int (*global_sym_del)(const char *); } ipa_suppfunc; /* * Limit's events constants. */ #define IPA_LIMIT_EVENT_START 0 #define IPA_LIMIT_EVENT_RESTART 1 #define IPA_LIMIT_EVENT_RESTART_EXEC 2 #define IPA_LIMIT_EVENT_REACH 3 #define IPA_LIMIT_EVENT_REACH_EXEC 4 #define IPA_LIMIT_EVENT_EXPIRE 5 #define IPA_LIMIT_EVENT_EXPIRE_EXEC 6 #define IPA_LIMIT_EVENT_UPDATED 7 #define IPA_LIMIT_EVENT_STARTUP_IF_REACHED 8 #define IPA_LIMIT_EVENT_STARTUP_IF_NOT_REACHED 9 #define IPA_LIMIT_EVENT_SHUTDOWN_IF_REACHED 10 #define IPA_LIMIT_EVENT_SHUTDOWN_IF_NOT_REACHED 11 /* * Events bits for limit state. */ #define IPA_LIMIT_EVENT_START_SET (1 << IPA_LIMIT_EVENT_START) #define IPA_LIMIT_EVENT_RESTART_SET (1 << IPA_LIMIT_EVENT_RESTART) #define IPA_LIMIT_EVENT_RESTART_EXEC_SET (1 << IPA_LIMIT_EVENT_RESTART_EXEC) #define IPA_LIMIT_EVENT_REACH_SET (1 << IPA_LIMIT_EVENT_REACH) #define IPA_LIMIT_EVENT_REACH_EXEC_SET (1 << IPA_LIMIT_EVENT_REACH_EXEC) #define IPA_LIMIT_EVENT_EXPIRE_SET (1 << IPA_LIMIT_EVENT_EXPIRE) #define IPA_LIMIT_EVENT_EXPIRE_EXEC_SET (1 << IPA_LIMIT_EVENT_EXPIRE_EXEC) #define IPA_LIMIT_EVENT_UPDATED_SET (1 << IPA_LIMIT_EVENT_UPDATED) /* Number of limit's events. */ #define IPA_LIMIT_EVENT_NUM 8 /* * ipa_tm is almost the same as struct tm{}, but: only * tm_{year,mon,mday,hour,min,sec} fields are used and * tm_year and tm_mon are equal to real year and month values. */ typedef struct tm ipa_tm; /* * Threshold's events constants. */ #define IPA_THRESHOLD_EVENT_BELOW 0 #define IPA_THRESHOLD_EVENT_EQUAL 1 #define IPA_THRESHOLD_EVENT_ABOVE 2 /* * Accounting module API. */ struct ipa_ac_mod { unsigned api_ver; unsigned 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, unsigned, const void *); int (*conf_mimic_real)(void); int (*conf_inherit)(unsigned, unsigned, const char *); void (*conf_show)(unsigned, unsigned); int (*ac_pre_init)(void); int (*ac_init_autorule)(unsigned, const char *); int (*ac_init_dynrule)(unsigned, unsigned, const char *); int (*ac_init_statrule)(unsigned, const char *); int (*ac_init)(void); int (*ac_deinit_rule)(unsigned); int (*ac_deinit_autorule)(unsigned); int (*ac_deinit)(void); int (*ac_get_stat)(void); int (*ac_get_rule_stat)(unsigned, int, unsigned, int *, uint64_t *); int (*ac_set_autorule_active)(unsigned, int); int (*ac_set_rule_active)(unsigned, int); int (*ac_set_limit_active)(unsigned, unsigned, int); int (*ac_set_threshold_active)(unsigned, unsigned, int); int (*ac_limit_event)(unsigned, unsigned, unsigned); int (*ac_threshold_event)(unsigned, unsigned, unsigned); int (*ac_create_rule)(const char *, unsigned, const char *, const char *); int (*ac_delete_rule)(const char *, unsigned); }; #define IPA_AC_MOD_ENTRY(x) x ## _ac_mod /* * Limit's state. */ struct ipa_limit_state { uint64_t lim; /* Limit parameter's value. */ uint64_t cnt; /* Limit counter. */ unsigned event_date_set; /* Which date in event_date is valid. */ ipa_tm event_date[IPA_LIMIT_EVENT_NUM]; /* Limit's events dates. */ }; /* * Threshold's state. */ struct ipa_threshold_state { uint64_t thr; /* Threshold parameter's value. */ uint64_t cnt; /* Threshold counter. */ ipa_tm tm_from; /* From time. */ ipa_tm tm_updated; /* Last updated time. */ }; /* * Database module API. */ struct ipa_db_mod { unsigned api_ver; unsigned 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, unsigned, const void *); int (*conf_mimic_real)(void); int (*conf_inherit)(unsigned, unsigned, const char *); void (*conf_show)(unsigned, unsigned); int (*db_pre_init)(void); int (*db_init_dynrule)(unsigned, unsigned, const char *, const char *); int (*db_init_statrule)(unsigned, const char *, const char *); int (*db_init_dynlimit)(unsigned, unsigned, const char *, const char *, unsigned, const char *, const char *); int (*db_init_statlimit)(unsigned, const char *, const char *, unsigned, const char *, const char *); int (*db_init_dynthreshold)(unsigned, unsigned, const char *, const char *, unsigned, const char *, const char *); int (*db_init_statthreshold)(unsigned, const char *, const char *, unsigned, const char *, const char *); int (*db_init)(void); int (*db_get_limit_state)(unsigned, unsigned, struct ipa_limit_state *); int (*db_set_limit_state)(unsigned, unsigned, const struct ipa_limit_state *, int); int (*db_get_threshold_state)(unsigned, unsigned, struct ipa_threshold_state *); int (*db_set_threshold_state)(unsigned, unsigned, const struct ipa_threshold_state *); int (*db_deinit_threshold)(unsigned, unsigned); int (*db_deinit_limit)(unsigned, unsigned); int (*db_deinit_rule)(unsigned); int (*db_deinit)(void); int (*db_append_rule)(unsigned, const uint64_t *, const ipa_tm *); int (*db_update_rule)(unsigned, const uint64_t *, const ipa_tm *); int (*db_update_limit)(unsigned, unsigned, const uint64_t *, const ipa_tm *); int (*db_limit_event)(unsigned, unsigned, unsigned, const ipa_tm *, const ipa_tm *); int (*db_update_threshold)(unsigned, unsigned, const uint64_t *, const ipa_tm *, const ipa_tm *); int (*db_set_rule_active)(unsigned, int); int (*db_set_limit_active)(unsigned, unsigned, int); int (*db_set_threshold_active)(unsigned, unsigned, int); }; #define IPA_DB_MOD_ENTRY(x) x ## _db_mod /* * Statistics from one record from database. */ struct ipa_rule_stat { unsigned year; /* Year. */ unsigned char mon; /* Month. */ unsigned char mday; /* Day of month. */ unsigned char h1, m1, s1; /* Time when a record was added. */ unsigned char h2, m2, s2; /* Time when a record was updated. */ uint64_t cnt; /* Counter. */ }; /* * Description of one rule/limit/threshold. */ struct ipa_entity_desc { char *name; /* Name. */ char *info; /* Info or NULL. */ }; /* * Statistics module API. */ struct ipa_st_mod { unsigned api_ver; unsigned 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, unsigned, const void *); int (*conf_mimic_real)(void); int (*conf_inherit)(unsigned, unsigned, const char *); void (*conf_show)(unsigned, unsigned); int (*st_pre_init)(void); int (*st_init_rule)(unsigned, const char *); int (*st_init_limit)(unsigned, const char *, unsigned, const char *); int (*st_init_threshold)(unsigned, const char *, unsigned, const char *); int (*st_init)(void); int (*st_deinit_threshold)(unsigned, unsigned); int (*st_deinit_limit)(unsigned, unsigned); int (*st_deinit_rule)(unsigned); int (*st_deinit)(void); int (*st_get_rule_info)(unsigned, ipa_mem_type *, char **); int (*st_get_limit_info)(unsigned, unsigned, ipa_mem_type *, char **); int (*st_get_threshold_info)(unsigned, unsigned, ipa_mem_type *, char **); int (*st_get_rules_list)(const char *, const regex_t *, ipa_mem_type *, unsigned *, struct ipa_entity_desc **); int (*st_get_limits_list)(unsigned, const char *, const regex_t *, ipa_mem_type *, unsigned *, struct ipa_entity_desc **); int (*st_get_thresholds_list)(unsigned, const char *, const regex_t *, ipa_mem_type *, unsigned *, struct ipa_entity_desc **); int (*st_get_rule_stat)(unsigned, const ipa_tm *, const ipa_tm *, int, ipa_mem_type *, unsigned *, struct ipa_rule_stat **); int (*st_get_limit_stat)(unsigned, unsigned, const ipa_tm *, const ipa_tm *, ipa_mem_type *, unsigned *, struct ipa_limit_state **); int (*st_get_threshold_stat)(unsigned, unsigned, struct ipa_threshold_state *); }; #define IPA_ST_MOD_ENTRY(x) x ## _st_mod #endif /* !IPA_MOD_H */