/*-
* 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 <sys/types.h>
#include <regex.h>
#include <stdarg.h>
#include <time.h>
#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 */
syntax highlighted by Code2HTML, v. 0.9.1