ipa_mod man page on DragonFly

Man page or keyword search:  
man Server   44335 pages
apropos Keyword Search (all sections)
Output format
DragonFly logo
[printable version]

IPA_MOD(3)							    IPA_MOD(3)

NAME
       ipa_mod -- IPA modules APIs

SYNOPSIS
       #include <ipa_mod.h>

DESCRIPTION
       This manual page describes API of IPA modules.  Let's call any IPA mod‐
       ule simply ``a module''.	 Information given  in	this  manual  page  is
       mainly for developers, but it can be interesting for anybody who wishes
       to understand how IPA utilities work with IPA modules.

       This manual page has descriptions of the following APIs:

       ipa_memfunc API version 1 (IPA_MEMFUNC_API_VERSION);
       ipa_ac_mod API version 2 (IPA_AC_MOD_API_VERSION);
       ipa_db_mod API version 2 (IPA_DB_MOD_API_VERSION);
       ipa_st_mod API version 2 (IPA_ST_MOD_API_VERSION).

   Module's symbols naming
       Any module is stored in a file  with  the  name	like  foobar-x.y.z.so.
       After  loading a module using the dlopen(3) or similar function, any of
       IPA utilities removes a suffix and a version number from	 the  module's
       file  name  and	tries  to  find	 foobar_ac_mod,	 foobar_db_mod or foo‐
       bar_st_mod symbol in a module if a module is  accounting,  database  or
       statistics module.  If a module has a searched symbol, then a module is
       considered as an IPA module.

       Then found (void *) pointer to a symbol is converted to	one  of	 three
       (struct ipa_XX_mod *)  pointers.	  Structures ipa_XX_mod determine APIs
       between IPA utilities and modules.

       Such method of naming symbols in modules allows to have several modules
       of  different  types  in	 one file.  You can create links to a module's
       file with different names to follow above given naming scheme.

   Single-threaded and multi-threaded modules
       Any module can be single-threaded or multi-threaded.  If a module  does
       not  block  in  its functions, then it can be built as single-threaded.
       If a module can block in some of its functions or if a module needs  to
       continuously  monitor  some  event,  then  it  must  be built as multi-
       threaded.  Alternatively a module can fork(2) another process  and  use
       some form of IPC to communicate with it from some of its functions, and
       used IPC functions also must be nonblockable.

       If a module is single-threaded, then it can use signals for own purpose
       (for  example  SIGALRM to implement timeout), except signals used by an
       IPA utility, which loaded this module.  If a module is  multi-threaded,
       then it is not allowed to use signals.

       It  is  very important to return from a module's function as quickly as
       possible, since IPA utilities expect, that module's functions will  not
       block.	If  a module spends too much time in its functions, then time‐
       stamps of statistics and reaction on some planned events	 will  be  not
       very accurate in IPA utilities.

       Even  if	 a module is not designed as multi-threaded, other modules can
       be multi-threaded.  All loaded modules must be all  single-threaded  or
       must  be	 all  multi-threaded.  So any single-threaded module should be
       able to be built as multi-threaded.  A module always should set correct
       flag in its API structure to say if it is single- or multi-threaded.

       IPA utilities are single-threaded by design, but if at least one multi-
       threaded module is used, then they must be built as multi-threaded.  In
       multi-threaded  regime functions from ipa_memfunc, which is exported by
       IPA utilities to modules, become thread-safe.

       Modules are allowed to create  threads  only  after  the	 configuration
       phase.

   Exported memory allocation functions for a module
       Modules	APIs  require  some  type  of organization of data in modules.
       ipa_memfunc functions are exported to a module and try to help a module
       with  memory  manipulation.   A module is free to decide if it will use
       these functions or if it will  not.   In	 some  functions  modules  are
       required to use functions from ipa_memfunc.

       There  are four types of functions from ipa_memfunc: initialization and
       deinitialization functions, functions for general purpose memory	 allo‐
       cation,	functions  for	working	 with mzones and functions for working
       with marrays.

       Functions mem_* for general purpose memory allocation are wrappers  for
       standard	 library  memory  allocation  functions	 malloc(3), calloc(3),
       realloc(3), free(3), strdup(3) and for vasprintf(3) function, found  on
       some systems.  Any memory allocated with some of mem_* functions should
       be freed with mem_free function.	  These	 functions  accept  extra  one
       argument,  called  mem_type (memory type), which is used for collecting
       statistics about memory usage.  This mem_type should be created by  the
       mem_type_new function.

       Marrays	(memory arrays) are used for creating arrays of items.	Mzones
       (memory zones) are used for creating items of the same size.  All  mar‐
       ray_*  and  mzone_*  functions  internally  use mem_* memory allocation
       functions.

       Functions from ipa_memfunc detect wrong pointers	 and  incorrect	 argu‐
       ments in mem_*, marray_* and mzone_* functions.	If some critical error
       is found in any of these functions, then this function terminates  exe‐
       cution of a program and a core dump is generated.

       If IPA utilities were built with defined WITH_MEMFUNC_DEBUG macro vari‐
       able, then allocated and freed memory  objects  are  filled  with  some
       garbage	bytes, so if some part of code uses already freed memory, then
       it is likely, that it will get an error.	 Also mem_realloc in this case
       is  equivalent to malloc(3) new memory area, memcpy(3) data to new mem‐
       ory area, free(3) old memory area.

       Any IPA utility during exit stage  and  during  reconfiguration	checks
       size  of	 allocated  and not freed memory, if this size is not equal to
       zero, then a debug message is sent to the log.  If some mzone of marray
       was not deinitialized, then its name appears in a debug message.

       The ipa_memfunc has following format:

       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
	      Version  of the ipa_memfunc API, a module should check values of
	      supported API versions with IPA_MEMFUNC_API_VERSION during  com‐
	      pilation.

       memfunc_init
	      A	 child	of  a  module can call this function to initialize all
	      other ipa_memfunc functions.

       memfunc_deinit
	      A child of a module can call this function to  free  all	memory
	      allocated	 in  mzones  and  marrays,  and deinitialize all other
	      ipa_memfunc own structures.  If foreign flag is  non-zero,  then
	      all  messages  about memory leaks will be suppressed and statis‐
	      tics about memory usage will be flushed.	 Note  that  this  and
	      previous functions can be called only in a child of some module.

       m_parser
	      This  is a pointer to mem_type used by a parser to allocate mem‐
	      ory during configuration file parsing.

       mem_type_new
	      Create new mem_type, name is a short name for new mem_type, desc
	      is  its  description  (usually  several  words).	 name and desc
	      should exist until marray	 is  deinitialized.   flags  are  ORed
	      flags  for  new  mem_type.   Currently  only  one	 flag IPA_MEM‐
	      FUNC_FLAG_PTHREAD is defined, which should be set if  memory  of
	      this  mem_type  will  be	allocated  or freed by several threads
	      asynchronously.  This function returns a pointer to new mem_type
	      or NULL if an error occurred.

       mem_malloc
	      Analogous to malloc(3).

       mem_calloc
	      Analogous to calloc(3).

       mem_realloc
	      Analogous to realloc(3).

       mem_strdup
	      Analogous to strdup(3).

       mem_vasprintf
	      Analogous	 to vasprintf(3) found on some systems.	 This function
	      sets *buf_ptr to be a pointer to a buffer sufficiently large  to
	      hold  the	 formatted string and returns the number of characters
	      in a buffer (not including the trailing  `\0').	If  sufficient
	      space  cannot be allocated, this function will return -1 and set
	      *buf_ptr to be a NULL pointer.  format and ap are the same argu‐
	      ments as for vprintf(3).

       mem_free
	      Analogous to free(3).

       marray_init
	      Create marray, name is a name of marray, desc is its description
	      (usually several words).	name and desc should exist until  mar‐
	      ray  is deinitialized.  flags determines ORed flags for new mar‐
	      ray,  currently  only  one  flag	 IPA_MEMFUNC_FLAG_PTHREAD   is
	      defined,	this flag must be set if items from this marray can be
	      allocated and freed by several threads asynchronously.  arr is a
	      pointer where to store the pointer to the actual array of items.
	      isize is a size of one item in marray.  nitems means  number  of
	      items  to	 allocate  initially.  nalloc means number of items to
	      allocate if there is not any unused items in marray.  If you are
	      not  sure about these values, then set them to 1.	 This function
	      returns a pointer to just created marray or  NULL	 if  an	 error
	      occurred.	  Note that the pointer saved in memory pointed by arr
	      can be changed by next marray_alloc  and	marray_free  functions
	      calls.

       marray_deinit
	      Release  memory  used by marray.	If a module does not call this
	      function, then an IPA utility will report about leak  of	memory
	      and deinitialize module's marray, but this deinitialization does
	      not mean that memory leak is avoided,  because  deinitialization
	      of  marray  is  not deep-free for its items.  If marray is NULL,
	      then this function does nothing.

       marray_alloc
	      Allocate a new item in marray.  If fixed is non-zero, then *idxp
	      should  be  a desired index number of a new item in marray, else
	      this function will allocate an item  with	 the  lowest  possible
	      unused  index  number and save this index number in *idxp.  This
	      function returns 0 if a new item was  allocated  and  -1	if  an
	      error  occurred.	Usually a module calls this function with non-
	      zero value of the fixed argument.

       marray_free
	      Return previously allocated item with index idx to marray.

       marray_minimize
	      Try to minimize memory used by  marray.	Such  minimization  is
	      possible	because marray_alloc and marray_free try to keep extra
	      memory for future items allocations.

       marray_check_index
	      This function checks whether an item  with  the  idx  index  was
	      allocated	 previously in marray.	If an item was allocated, then
	      0 is returned, else non-zero value is returned.

       marray_nused
	      Return number of allocated items in marray.

       mzone_init
	      Create mzone, name is a name of mzone, desc is  its  description
	      (usually	several words).	 name and desc should exist until mar‐
	      ray is deinitialized.  flags means the same  as  in  marray_init
	      function,	 mzone	also  accepts  IPA_MEMFUNC_FLAG_OPTIMIZE, this
	      flag should be set if it will be many items in mzone.  isize  is
	      a	 size  of  one item in mzone.  nitems means number of items to
	      allocate initially.  nalloc means number of items to allocate if
	      there  is	 not  any  unused  item in mzone.  If you are not sure
	      about these values, then set them to 1.  This function returns a
	      pointer to just created mzone or NULL if an error occurred.

       mzone_deinit
	      Release  memory  used  by mzone.	If a module does not call this
	      function, then an IPA utility will report about leak  of	memory
	      and  deinitialize module's mzone, but this deinitialization does
	      not mean that memory leak is avoided,  because  deinitialization
	      of mzone is not deep-free for its items.	If mzone is NULL, then
	      this function does nothing.

       mzone_alloc
	      Allocate a new item from mzone.  This function returns a pointer
	      to a new item or NULL if an error occurred.

       mzone_free
	      Return previously allocated item pointed by ptr to mzone.

       mzone_nused
	      Return number of allocated items from mzone.

   Exported support functions for a module
       Sometime	 a  module needs to add some macro variable to some section of
       the configuration file, or needs to output own parameters when  an  IPA
       utility	outputs parsed configuration file, or needs to send a log mes‐
       sage.  Since a module does not know how to do  this,  an	 IPA  utility,
       which uses this module, exports ipa_suppfunc functions to a module:

       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
	      This function prints a string with quotes.

       print_bytes
	      This function prints bytes value.

       print_time
	      This function prints time value.

       print_value
	      This  function  prints  bytes, time or 64-bit unsigned number if
	      value_type   is	IPA_CONF_TYPE_BYTES,   IPA_CONF_TYPE_TIME   or
	      IPA_CONF_TYPE_UINT64 respectively.

       print_boolean
	      This function prints boolean value.

       print_space
	      This  function  prints one space character if it was not printed
	      yet.

       print_param_name
	      This function outputs a parameter's name param  with  configura‐
	      tion  prefix  prefix.  If a parameter does not have a configura‐
	      tion prefix, then prefix should be NULL.

       print_param_args
	      This vprintf(3)-like function outputs parameter's arguments.  It
	      can be invoked several times for the same parameter.

       print_param_end
	      This  function should be called after outputting all parameter's
	      arguments.

       print_sect_name
	      This function outputs a section's name sect  with	 configuration
	      prefix  prefix.  If a section does not have a configuration pre‐
	      fix, then prefix should be NULL.

       print_sect_args
	      This vprintf(3)-like function outputs section's  arguments.   It
	      can be invoked several times for the same section.

       print_sect_begin
	      This  function  should  be called after outputting all section's
	      arguments.

       print_sect_end
	      This function should be called at the end of a module's section.

       open_log, close_log
	      If a module needs to fork another process, then that process can
	      use  logmsg function (described below), but if it needs to close
	      some descriptors and then use log system again, then  it	should
	      call close_log and then open_log function.  Creation of the file
	      descriptor for sending log messages is delayed until  the	 first
	      message is sent.

       logmsg A	 module should use this function for sending log messages from
	      any part of its code, but not from  configuration	 file  parsing
	      functions.  mod_name is a module's name.	priority is a priority
	      of the message: IPA_LOG_INFO,  IPA_LOG_WARNING  or  IPA_LOG_ERR.
	      code is the errno(2) value or 0 if there is not any error condi‐
	      tion.  format and ap are vprintf(3)-like arguments.

       logconferr
	      A module should use this function	 for  sending  messages	 about
	      errors  during  configuration file parsing.  Arguments means the
	      same as for logmsg function.

       local_sym_add
	      Create a local macro variable with name sym and  value  val,  if
	      copy_flag is non-zero, then memory will be allocated and sym and
	      val will be copied to it, else original pointers will  be	 used.
	      This  function  returns 0 if a macro variable was created and -1
	      if memory could not be allocated.

       local_sym_del
	      Delete a local macro variable with name sym.   If	 there	is  no
	      local  variable with the given name, then -1 is returned, else 0
	      is returned.  A module has a choice not to  call	this  function
	      for  each variable previously created by the local_sym_add func‐
	      tion, because an IPA utility automatically handles this.

       global_sym_add
	      Like local_sym_add, but for global macro variables.

       global_sym_del
	      Like local_sym_del, but for global macro variables.

   Configuration section description
       The ipa_conf_sect structure is defined as:

       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
	      This is a name of the section.

       sect_id
	      This is a section ID, which is local for a module.   This	 value
	      should be greater than IPA_CONF_SECT_CUSTOM_OFFSET.

       arg_nargs
	      This  is	a number of arguments a section should have.  Set this
	      field to zero if a section does not expect any arguments.	 If  a
	      section  can  have  variable  number of arguments, then set this
	      field to negative number, which absolute value is equal to mini‐
	      mal number of arguments a section should have.

       arg_pattern
	      A section's argument should match the given extended POSIX regu‐
	      lar expression.  If there is  not	 such  expression,  then  this
	      field should be set to NULL.

       arg_regexp
	      This  is	a  pointer  to	the  variable  with  regex_t type.  if
	      arg_pattern is not NULL, then this  field	 also  should  not  be
	      NULL.  It is possible share some regular expression between sec‐
	      tions and parameters and do not waste  memory  for  extra	 vari‐
	      ables.   In  this	 case  only one section or parameter must have
	      valid pointer in arg_pattern, all others sections and parameters
	      must set arg_pattern to NULL.

       arg_type
	      This is a type of the argument.  There are following types:

	      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   - a string;
	      IPA_CONF_TYPE_BYTES    - bytes;
	      IPA_CONF_TYPE_TIME     - time;
	      IPA_CONF_TYPE_VALUE    - value;
	      IPA_CONF_TYPE_PER_CENT - per cent;
	      IPA_CONF_TYPE_BOOLEAN  - boolean;
	      IPA_CONF_TYPE_MISC     - without any format.

	      Usually  a  module  uses a regular expression (field arg_regexp)
	      with IPA_CONF_TYPE_MISC argument type and does not use a regular
	      expression with other argument types.  IPA_CONF_TYPE_VALUE means
	      time, bytes or uint64_t value.  See below details.

       sect_where
	      This field determines where this section should be placed, it is
	      a pointer to an array of 'unsigned int' values, each value is an
	      ID of a section, last element in this array should be  equal  to
	      zero.  Predefined sections IDs are follows:

	      IPA_CONF_SECT_ROOT      - no section;
	      IPA_CONF_SECT_GLOBAL    - the global section;
	      IPA_CONF_SECT_RULE      - the rule section;
	      IPA_CONF_SECT_LIMIT     - the limit section;
	      IPA_CONF_SECT_THRESHOLD - the threshold section;
	      IPA_CONF_SECT_AUTORULE  - the autorule section;
	      IPA_CONF_SECT_RULEPAT   - the rulepat section;
	      IPA_CONF_SECT_RESTART   - the restart section;
	      IPA_CONF_SECT_REACH     - the reach section;
	      IPA_CONF_SECT_EXPIRE    - the expire section;
	      IPA_CONF_SECT_STARTUP   - the startup section;
	      IPA_CONF_SECT_SHUTDOWN  - the shutdown section;
	      IPA_CONF_SECT_IF_REACHED - the if_reached section;
	      IPA_CONF_SECT_IF_NOT_REACHED - the if_not_reached section;
	      IPA_CONF_SECT_IF_ALL_REACHED - the if_all_reached section;
	      IPA_CONF_SECT_IF_ANY_REACHED - the if_any_reached section;
	      IPA_CONF_SECT_IF_ALL_NOT_REACHED - the if_all_not_reached section;
	      IPA_CONF_SECT_IF_ANY_NOT_REACHED - the if_any_not_reached section;
	      IPA_CONF_SECT_BELOW_THRESHOLD - the below_threshold section;
	      IPA_CONF_SECT_EQUAL_THRESHOLD - the equal_threshold section;
	      IPA_CONF_SECT_ABOVE_THRESHOLD - the above_threshold section.

       arg_parse
	      This function is called for parsing section arguments.  A module
	      can set this field to NULL if it has not	any  parsing  function
	      for  arguments.  arg is a pointer to some data, which depends on
	      arg_type, and arg_parse function should perform following casts:

	      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.

	      If arg_type is IPA_CONF_TYPE_STRING, then arg is	a  pointer  to
	      the allocated memory with the parsed string (whithout quotes) by
	      mem_malloc function with m_parser mem_type, and a module	should
	      free  this  memory  if it does not need it by mem_free function.
	      In other cases arg_parse function should copy  any  needed  data
	      and  do  not  use data by pointers, also it is allowed to modify
	      data arg points to.  If  arg_type	 is  IPA_CONF_TYPE_MISC,  then
	      there  are not space characters at the beginning and at the tail
	      of arg, also there is only one ` '  character  between  any  two
	      arguments	 in arg.  If arg_type is IPA_CONF_TYPE_VALUE, then arg
	      is a pointer to an array, first item of this array has  type  of
	      value	  IPA_CONF_TYPE_BYTES,	    IPA_CONF_TYPE_TIME	    or
	      IPA_CONF_TYPE_UINT64, second item has a value itself.

   Configuration parameter description
       The ipa_conf_param structure is defined as:

       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
	      This is a name of the parameter.

       arg_nargs
	      Explained above.

       arg_pattern
	      Explained above.

       arg_regexp
	      Explained above.

       arg_type
	      Explained above.

       param_where
	      Explained above for sect_where.

       arg_parse
	      Explained above.

   Structure for representing dates
       The ipa_tm structure is defined as:

       typedef struct tm ipa_tm;

       Only following fields in the ipa_tm structure  can  be  used:  tm_year,
       tm_mon,	tm_mday,  tm_hour,  tm_min,  tm_sec and tm_wday.  These fields
       determine some local date.  tm_year is equal to the real value  of  the
       year and tm_mon is equal to the real value of the month.

   Limit's state
       The state of any limit is kept in the ipa_limit_state structure:

       struct ipa_limit_state {
	   uint64_t	   lim;
	   uint64_t	   cnt;
	   unsigned int	   event_date_set;
	   ipa_tm	   event_date[IPA_LIMIT_EVENT_NUM];
       };

       lim    This is a value of the limit parameter.

       cnt    This is a value of the limit's counter.

       event_date_set
	      This  is	a  bits	 filed,	 which	determines  valid  entries  in
	      event_date array, each IPA_LIMIT_EVENT_xxx element in event_date
	      array   has   corresponding   IPA_LIMIT_EVENT_xxx_SET   bit   in
	      event_date_set.

       event_date
	      This is an array of limit's events dates.	 There	are  following
	      entries in this array:

	      IPA_LIMIT_EVENT_START - date when the limit started;

	      IPA_LIMIT_EVENT_RESTART - date  when  the	 limit will restart or
	      restarted;

	      IPA_LIMIT_EVENT_RESTART_EXEC - date  when	  commands   for   the
	      restarted limit were run;

	      IPA_LIMIT_EVENT_REACH - date when the limit reached;

	      IPA_LIMIT_EVENT_REACH_EXEC - date	 when commands for the reached
	      limit were run;

	      IPA_LIMIT_EVENT_EXPIRE - date when the reached limit will expire
	      and will restart or expired and restarted;

	      IPA_LIMIT_EVENT_EXPIRE_EXEC - date when commands for the expired
	      limit were run;

	      IPA_LIMIT_EVENT_UPDATED - date when the limit was	 updated  last
	      time.

   Threshold's state
       The  state  of  any threshold is kept in the ipa_threshold_state struc‐
       ture:

       struct ipa_threshold_state {
	   uint64_t	   thr;
	   uint64_t	   cnt;
	   ipa_tm	   tm_from;
	   ipa_tm	   tm_updated;
       };

       thr    This is a value of the threshold parameter.

       cnt    This is a value of the threshold's counter.

       tm_from, tm_updated
	      Two timestamps for the threshold.

   Accounting module API
       Accounting module API is exported by a module to an IPA utility in  the
       ipa_ac_mod structure:

       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
	      This  is	the  version  of  the  accounting module API, a module
	      should   check   values	of   supported	 API   versions	  with
	      IPA_AC_MOD_API_VERSION during compilation.  After loading a mod‐
	      ule, this version number is checked with	version	 of  used  API
	      version.

       mod_flags
	      Flags,  which  describe  module  working regimes.	 Only one flag
	      IPA_MOD_FLAG_PTHREAD_SAFE is defined, and it must be  set	 if  a
	      module is thread-safe.

       ac_name
	      This is a name of the module's accounting system.

       suppfunc
	      This  is	a pointer to ipa_suppfunc structure, which is exported
	      to a module.

       memfunc
	      This is a pointer to ipa_memfunc structure, which is exported to
	      a module.

       conf_prefix
	      This is a configuration prefix for module's sections and parame‐
	      ters.  If a module does not have a  configuration	 prefix,  then
	      set this field to NULL.

       conf_sect_tbl
	      This  is a pointer to the array of the ipa_conf_sect structures,
	      which describe module's  sections.   Last	 item  in  this	 table
	      should  have sect_name equal to NULL.  If a module does not have
	      sections, then set this field to NULL.

       conf_param_tbl
	      This is a pointer to the array of the ipa_param_sect structures,
	      which  describe  module's	 parameters.   Last item in this table
	      should have param_name equal to NULL.  If a module does not have
	      parameters, then set this field to NULL.

       conf_init
	      After loading a module, this function is called.

       conf_deinit
	      After parsing a configuration file, this function is called.

       conf_event
	      This  function is called each time when some configuration event
	      occurs.  conf_event describes a configuration event.  Configura‐
	      tion events allows a module to know for which section its param‐
	      eter or section  belongs.	  There	 are  following	 configuration
	      events:

	      IPA_CONF_EVENT_GLOBAL_BEGIN - the begin of the global section;

	      IPA_CONF_EVENT_RULE_BEGIN - the  begin  of the rule section, arg
	      points to a string with the rule's name and should be casted  to
	      (const char *),  no is an ordinal number of this section, start‐
	      ing from 0;

	      IPA_CONF_EVENT_LIMIT_BEGIN - the begin of the limit section, arg
	      points to a string with the limit's name and should be casted to
	      (const char *), no is an ordinal number of this section  in  the
	      current section, starting from 0;

	      IPA_CONF_EVENT_THRESHOLD_BEGIN - the begin of the threshold sec‐
	      tion, arg points to a  string  with  the	threshold's  name  and
	      should  be  casted to (const char *), no is an ordinal number of
	      this section in the current section, starting from 0;

	      IPA_CONF_EVENT_AUTORULE_BEGIN - the begin of the	autorule  sec‐
	      tion, arg points to a string with the autorule's name and should
	      be casted to (const char *), no is an  ordinal  number  of  this
	      section, starting from 0;

	      IPA_CONF_EVENT_RULEPAT_BEGIN - the begin of the rulepat section,
	      arg points to a POSIX regular expression and should be casted to
	      (const char *),  no is an ordinal number of this section, start‐
	      ing from 0;

	      IPA_CONF_EVENT_CUSTOM_SECT_BEGIN - the begin  of	some  module's
	      section,	no  is	the  ID	 of  a module's section, arg should be
	      ignored;

	      There  are  IPA_CONF_EVENT_xxx_BEGIN  configuration  events  for
	      other  of	 IPA_CONF_SECT_xxx  sections, but no and arg should be
	      ignored by a module for them.

	      For all above listed configuration events there are  correspond‐
	      ing  IPA_CONF_EVENT_xxx_END  configuration events, with the same
	      arguments.

       conf_mimic_real
	      If this function is called, then a module should mimic real con‐
	      figuration.

       conf_inherit
	      In  this	function a module should inherit all settings from the
	      rulepat section number rulepatno for the rule number ruleno with
	      name  rule_name.	 This  function	 is called before ac_pre_init,
	      then a module should use logconferr function for reporting about
	      occurred errors, else logmsg function should be used.

       conf_show
	      This function is called when IPA utility outputs the parsed con‐
	      figuration file.	sect_id is the ID of  a	 section.   no	is  an
	      ordinal  number  of  a  section with the given section ID.  If a
	      module has some configuration for this section, then  it	should
	      output  this configuration.  A module should not directly output
	      any configuration, instead it should use one  of	the  functions
	      from the suppfunc structure.

       ac_pre_init
	      This  function  is called after parsing a configuration file.  A
	      module should make general preinitialization of  its  accounting
	      system.	This  function	is always called before other ac_init*
	      functions.

       ac_init_autorule
	      This function is called if some autorule uses a module.  autoru‐
	      leno is a number of the autorule, autorule_name is its name.

       ac_init_dynrule
	      This  function  is  called  if  some dynamic rule uses a module.
	      autoruleno is a number of the autorule from which	 this  dynamic
	      rule  was	 generated,  ruleno  is	 a number of the dynamic rule,
	      rule_name is its name.  Data, rule_name points  to,  will	 exist
	      until  ac_deinit_rule is called for this rule.  This function is
	      called when a module calls ac_create_rule from ac_get_stat.

       ac_init_statrule
	      The same as ac_init_dynrule but for static rules and  is	called
	      after configuration phase.

       ac_init
	      This  function  is  called  after	 all  other ac_init* functions
	      (except ac_init_dynrule, which is called from ac_create_rule).

       ac_deinit_rule
	      This function is called to deinitialize a	 rule,	which  uses  a
	      module.  A module should not expect, that ac_init_*rule for this
	      rule was called before.  This function is called for static  and
	      dynamic rules.

       ac_deinit_autorule
	      This  function is called to deinitialize an autorule, which uses
	      a module.	 A module should not expect, that ac_init_autorule was
	      called for this autorule before.

       ac_deinit
	      This  function  is  called  to  deinitialize a module.  A module
	      should not expect that ac_*init functions	 were  called  before.
	      This  function  is  always  called  after all others ac_deinit_*
	      functions.

       ac_get_stat
	      This function is called before calls to  ac_get_rule_stat	 func‐
	      tion.  ctm is the current local date.  There is internal statis‐
	      tics generation number, which is changed each time when any mod‐
	      ule's  ac_get_stat  function  is	called and its value is always
	      greater than zero.

       ac_get_rule_stat
	      This function should  return  statistics	for  the  rule	number
	      ruleno.	The  stat_generation  value is the value of statistics
	      generation number (see above for description).  The newstat flag
	      means,  that a module should consider that this is a first invo‐
	      cation of this function (for example this flag is non-zero  when
	      a	 rule becomes active).	chunk points to statistics returned by
	      the module and *addition determines what	to  do	with  returned
	      statistics,  if  it  is  non-zero,  then	returned statistics is
	      added, else it is subtracted.  Here statistics means  statistics
	      for period between two invocations of the ac_get_rule_stat func‐
	      tion.  This function is not called if a rule which uses a module
	      is inactive.

       ac_set_autorule_active
	      This function should mark an autorule as active or inactive.  If
	      flag active is equal to zero, then an autorule should be	marked
	      as  inactive  in	a module, else an autorule should be marked as
	      active.

       ac_set_rule_active
	      The same as above, but for a rule.

       ac_set_limit_active
	      The same as above, but for a limit.

       ac_set_threshold_active
	      The same as above, but for a threshold.

       ac_limit_event
	      This function is called when some event occurred with the limit.
	      event can be:

	      IPA_LIMIT_EVENT_RESTART - the limit is restarted;
	      IPA_LIMIT_EVENT_REACH   - the limit becomes reached;
	      IPA_LIMIT_EVENT_EXPIRE  - the reached limit expires;
	      IPA_LIMIT_EVENT_STARTUP_IF_REACHED - reached at startup;
	      IPA_LIMIT_EVENT_STARTUP_IF_NOT_REACHED - not reached at startup;
	      IPA_LIMIT_EVENT_SHUTDOWN_IF_REACHED - reached at shutdown;
	      IPA_LIMIT_EVENT_SHUTDOWN_IF_NOT_REACHED - not reached at shutdown.

       ac_threshold_event
	      This  function  is  called  when	some  event  occurred with the
	      threshold.  event means that threshold's counter is:

	      IPA_THRESHOLD_EVENT_BELOW - below threshold's value;
	      IPA_THRESHOLD_EVENT_EQUAL - equal to threshold's value;
	      IPA_THRESHOLD_EVENT_ABOVE - above threshold's value.

       ac_create_rule
	      This function is exported to a module.

	      A module should call this function  only	from  the  ac_get_stat
	      function	to create a dynamic rule.  mod_name is a module's name
	      (is used only for debugging and only in this function).  autoru‐
	      leno  is a number of the autorule from which to create a dynamic
	      rule.  rule_name is a rule's name and rule_info is its  descrip‐
	      tion,  these  strings  are  not used by pointers, so if a module
	      allocated memory for them, then it should	 release  this	memory
	      itself.	If  everything	is  correct,  then  ac_init_dynrule is
	      called.

	      This function returns 0 if a dynamic rule was created, -2	 if  a
	      rule  with  the same name already exists and -1 if some critical
	      error occurred, in this  case  a	module	must  return  -1  from
	      ac_get_stat.

       ac_delete_rule
	      This function is exported to a module.

	      A	 module	 should	 call  this function only from the ac_get_stat
	      function to delete a dynamic rule number ruleno previously  cre‐
	      ated  by	the  ac_create_rule  function.	mod_name is a module's
	      name (is used only for debugging and only in this function).  At
	      some point the ac_deinit_rule is called for the given rule.

	      If  everything  is  correct,  then this functions returns 0.  If
	      there were problems with the deinitialization, then -1 should be
	      returned, in this case a module must return -1 from ac_get_stat.

       If some function, except ac_create_rule, returns integer value, then it
       should return the value -1 if an error occurred, else  zero  should  be
       returned.

       If  a module does not support some function for dynamic or static rule,
       for autorules, for limits or thresholds, then it should set correspond‐
       ing field to NULL.

       If  some	 function is exported to a module, then corresponding field in
       API structure can be set to any value (usually NULL).

   Database module API
       Database module API is exported by a module to an IPA  utility  in  the
       ipa_db_mod structure:

       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
	      This  is the version of the database module API, a module should
	      check values of supported API versions with  IPA_DB_MOD_API_VER‐
	      SION  during  compilation.  After loading a module, this version
	      number is checked with version of used API version.

       mod_flags
	      Explained above.

       db_name
	      This is a name of the module's database.

       suppfunc
	      Explained above.

       memfunc
	      Explained above.

       conf_prefix
	      Explained above.

       conf_sect_tbl
	      Explained above.

       conf_param_tbl
	      Explained above.

       conf_init
	      Explained above.

       conf_deinit
	      Explained above.

       conf_event
	      Explained above.

       conf_mimic_real
	      Explained above.

       conf_inherit
	      Explained above.

       conf_show
	      Explained above.

       db_pre_init
	      This function is called after parsing a configuration  file.   A
	      module should make general initialization of its database.  This
	      function always is called before other db_init* functions.

       db_init_dynrule
	      This function is called if some  dynamic	rule  uses  a  module.
	      autoruleno  is  a number of the autorule from which this dynamic
	      rule was generated, ruleno is a  number  of  the	dynamic	 rule,
	      rule_name	 is  its  name and rule_info is its description.  Only
	      data, rule_name points to, will exist  until  db_deinit_rule  is
	      called for this rule.

       db_init_statrule
	      The same as db_init_dynrule but for static rules.

       db_init_dynlimit
	      This function is called if some limit from a dynamic rule uses a
	      module.  limitno is an ordinal number of the limit in the	 rule,
	      limit_name  is its name and limit_info is its description.  Rest
	      of arguments means the same as in db_init_dynrule.   Only	 data,
	      rule_name	  and	limit_name   point   to,   will	  exist	 until
	      db_deinit_limit is called for this limit.	 Since a rule can  use
	      another  database, than its limits use, then a module should not
	      expect that db_init_dynrule was  called  before  for  a  limit's
	      rule.  If a limit's rule uses this module too, then db_init_dyn‐
	      rule for a rule is called first.

       db_init_statlimit
	      The same as db_init_dynlimit but for limits from static rules.

       db_init_dynthreshold
	      This function is called if some threshold from  a	 dynamic  rule
	      uses  a module.  thresholdno is an ordinal number of the thresh‐
	      old in the rule, threshold_name is its name  and	threshold_info
	      is  its  description.   Rest  of	arguments means the same as in
	      db_init_dynrule.	Only data, rule_name and threshold_name	 point
	      to,  will	 exist	until  db_deinit_threshold  is called for this
	      threshold.  Since a rule can  use	 another  database,  than  its
	      thresholds   use,	  then	 a   module  should  not  expect  that
	      db_init_dynrule was called before for a threshold's rule.	 If  a
	      threshold's  rule uses this module too, then db_init_dynrule for
	      a rule is called first.

       db_init_statthreshold
	      The same as db_init_dynthreshold but for thresholds from	static
	      rules.

       db_init
	      This function is called after all other db_init_stat* functions.

       db_get_limit_state
	      This  function should return the current state of the limit.  If
	      a module does not have current state for	the  limit,  then  the
	      return  value should be zero.  If a module has current state for
	      the limit, then the return value should be 1.

       db_set_limit_state
	      This function  should  set  a  new  state	 for  the  limit.   If
	      new_state	 is  zero,  then current limit's state in the database
	      should be updated, else a new limit's  state  should  be	regis‐
	      tered.

       db_get_threshold_state
	      This  function should return the current state of the threshold.
	      If a module does not have current state for the threshold,  then
	      the  return value should be zero.	 If a module has current state
	      for the threshold, then the return value should be 1.

       db_set_threshold_state
	      This function should update the current state for the threshold.

       db_deinit_threshold
	      This function is called to deinitialize a threshold, which  uses
	      a	 module.   A module should not expect, that db_init_*threshold
	      was called for this threshold before.

       db_deinit_limit
	      This function is called to deinitialize a limit,	which  uses  a
	      module.	A  module  should  not expect, that db_init_*limit was
	      called for this limit before.

       db_deinit_rule
	      This function is called to deinitialize a	 rule,	which  uses  a
	      module.	If some of rule's limits or thresholds use this module
	      too,  then  db_deinit_limit  or  db_deinit_threshold  is	called
	      first.   A module should not expect, that db_init_*rule for this
	      rule was called before.

       db_deinit
	      This function is called to  deinitialize	a  module.   A	module
	      should  not  expect  that db_*init functions were called before.
	      This function is always called after all other db_deinit_* func‐
	      tions.

       db_append_rule
	      This  function  should  append  a new record for the given rule.
	      cnt is a pointer to a new value of the rule's counter.   ctm  is
	      the  current  local  date.  This function is called before first
	      call of the db_update_rule function.

       db_update_rule
	      This function should update a  database  record  for  the	 given
	      rule.   cnt  is  a pointer to a new value of the rule's counter,
	      ctm is the current local date.

       db_update_limit
	      This function should update a state of the limit	in  the	 data‐
	      base.   cnt  is  a pointer to a new value of the counter, ctm is
	      the current local date.  IPA_LIMIT_EVENT_UPDATED date should  be
	      also updated by a module.

       db_limit_event
	      This  function  should  register an event event for the limit in
	      the database.  The given event can take place right  now	or  in
	      future.  etm is the local date of the given event and ctm is the
	      current local date.  IPA_LIMIT_EVENT_UPDATED date should be also
	      updated by a module.  This function is called only for following
	      limit's	events	  IPA_LIMIT_EVENT_:    RESTART_EXEC,	REACH,
	      REACH_EXEC, EXPIRE and EXPIRE_EXEC.

       db_update_threshold
	      This  function  should  update  a	 state of the threshold in the
	      database.	 cnt is a pointer to  a	 new  value  of	 the  counter,
	      tm_from and tm_updated are two timestamps for the threshold.

       db_set_rule_active
	      Explained above in ac_set_rule_active.  When a rule is marked as
	      active,	then   db_append_rule	will	be    called	before
	      db_update_rule.

       db_set_limit_active
	      Explained above in ac_set_limit_active.

       db_set_threshold_active
	      Explained above in ac_set_threshold_active.

       If some function returns integer value, then it should return the value
       -1 if an error occurred, else zero should be returned (if corresponding
       description does not specify another value).

       If  a database module does not support dynamic rules, limits or thresh‐
       olds, then it should set corresponding db_init_dyn* fields to NULL.  If
       a  database module does not support static rules, limits or thresholds,
       then set corresponding db_init_stat* fields to NULL.

       If   a	database   module   does   not	 support   db_get_limit_state,
       db_get_threshold_state, db_set_*active function, then set corresponding
       field to NULL.

       If some function is exported to a module, then corresponding  field  in
       API structure can be set to any value (usually NULL).

   Statistics module API
       Statistics  module API is exported by a module to an IPA utility in the
       ipa_st_mod structure:

       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
	      This is the version of  the  statistics  module  API,  a	module
	      should   check   values	of   supported	 API   versions	  with
	      IPA_ST_MOD_API_VERSION during compilation.  After loading a mod‐
	      ule,  this  version  number  is checked with version of used API
	      version.

       mod_flags
	      Explained above.

       st_name
	      This is a name of the module's statistics system.

       suppfunc
	      Explained above.

       memfinc
	      Explained above.

       conf_prefix
	      Explained above.

       conf_sect_tbl
	      Explained above.

       conf_param_tbl
	      Explained above.

       conf_init
	      Explained above.

       conf_deinit
	      Explained above.

       conf_event
	      Explained above.

       conf_mimic_real
	      Explained above.

       conf_inherit
	      Explained above.

       conf_show
	      Explained above.

       st_pre_init
	      This function is called after parsing a configuration  file.   A
	      module should make general initialization of its statistics sys‐
	      tem.  This function always is called before other st_init* func‐
	      tions.

       st_init_rule
	      This  function  is  called if a rule uses a module.  ruleno is a
	      number of the rule, rule_name  is	 its  name.   Data,  rule_name
	      points  to,  will	 exist until st_deinit_rule is called for this
	      rule.  This function can be called for a rule which  has	corre‐
	      sponding section in the configuration file, and for a rule which
	      was generated on-the-fly (can be considered as a dynamic rule).

       st_init_limit
	      This function is called if some limit from a rule uses a module.
	      limitno  is  an  ordinal	number	of  the	 limit	in  the	 rule,
	      limit_name is a its name.	 Only data, rule_name  and  limit_name
	      point  to,  will	exist until st_deinit_limit is called for this
	      limit.  Since a rule can use another statistics system, than its
	      limits  use,  then  a module should not expect that st_init_rule
	      was called before for a limit's rule.  If a  limit's  rule  uses
	      this  module too, then st_init_rule for a limit's rule is called
	      first.  Like st_init_rule this function can be called for a rule
	      and/or a limit which has corresponding section in the configura‐
	      tion file, and for a rule and/or limit which was	generated  on-
	      the-fly (can be considered as a dynamic rule and/or a limit).

       st_init_threshold
	      This  function  is  called  if some threshold from a rule uses a
	      module.  thresholdno is an ordinal number of  the	 threshold  in
	      the  rule,  threshold_name  is a its name.  Only data, rule_name
	      and threshold_name point to, will exist until  st_deinit_thresh‐
	      old  is called for this threshold.  Since a rule can use another
	      statistics system, than its thresholds use, then a module should
	      not expect that st_init_rule was called before for a threshold's
	      rule.   If  a  threshold's  rule	uses  this  module  too,  then
	      st_init_rule  for	 a  threshold's	 rule  is  called first.  Like
	      st_init_rule this function can be called for  a  rule  and/or  a
	      threshold	 which	has corresponding section in the configuration
	      file, and for a rule and/or threshold which  was	generated  on-
	      the-fly  (can  be	 considered as a dynamic rule and/or a thresh‐
	      old).

       st_init
	      This function is called after all other st_init* functions.

       st_deinit_threshold
	      This function is called to deinitialize a threshold, which  uses
	      a	 module.   A  module should not expect, that st_init_threshold
	      was called for this threshold before.

       st_deinit_limit
	      This function is called to deinitialize a limit,	which  uses  a
	      module.	A  module  should  not	expect, that st_init_limit was
	      called for this limit before.

       st_deinit_rule
	      This function is called to deinitialize a	 rule,	which  uses  a
	      module.	If some of rule's limits or thresholds use this module
	      too, then st_deinit_limit or st_deinit_threshold is  called  for
	      such  rule's  limits  or thresholds before.  A module should not
	      expect, that st_init_rule for this rule was called before.

       st_deinit
	      This function is called to  deinitialize	a  module.   A	module
	      should  not  expect  that st_*init functions were called before.
	      This function is always called after all other st_deinit_* func‐
	      tions.

       st_get_rule_info
	      This  function  should  return a description for the rule number
	      ruleno, pointer to a rule's description should  be  returned  in
	      *info_ptr.   If  a  rule	does  not  have	 a  description,  then
	      *info_ptr should be set to NULL.

       st_get_limit_info
	      The same as st_get_rule_info, but for a limit.

       st_get_threshold_info
	      The same as st_get_rule_info, but for a threshold.

       st_get_rules_list
	      This function should  return  an	array  with  rules  names  and
	      descriptions.   If the POSIX regular expression pat is not NULL,
	      then a module should return only rules, with names which matched
	      this  regular  expression (pat_reg is a compiled regular expres‐
	      sion pat).  The pointer to the array  of	struct ipa_entity_desc
	      should  be returned in *buf_ptr, number of entries in this array
	      should be returned in *n.	 If number  of	entries	 is  equal  to
	      zero, then *buf_ptr must be NULL.

       st_get_limits_list
	      The same as st_get_rules_list, buf for limits.

       st_get_thresholds_list
	      The same as st_get_rules_list, buf for thresholds.

       st_get_rule_stat
	      This  function is used for querying statistics for a rule number
	      ruleno for time interval from tm1 till tm2.  If exact  is	 zero,
	      then  both  of  rule's  records  timestamps should be inside the
	      given time interval, else only one of rule's records  timestamps
	      should  be  inside  the given time interval.  The pointer to the
	      array of struct ipa_rule_stat should be  returned	 in  *buf_ptr,
	      number  of  entries  in this array should be returned in *n.  If
	      number of entries is equal to zero, then *buf_ptr must be NULL.

	      Structure	 struct ipa_rule_stat  represents  statistics  of  one
	      rule's  record.	In  struct ipa_rule_stat  fields year, mon and
	      mday specify date of both timestamps of a rule's record  (a  new
	      record for any rule is always appended for a new day, that's why
	      it is enough only these three fields for	dates  of  both	 time‐
	      stamps).	 t1,  m1 and s1 is time of first timestamp; t2, m2 and
	      s2 is time of second timestamp.  cnt is statistics for the  time
	      interval in one rule's record.

       st_get_limit_stat
	      This function is used for querying statistics for a limit number
	      limitno in a rule number ruleno, dates when a limit was  started
	      should  be  in  time interval from tm1 till tm2.	The pointer to
	      the  array  of  struct ipa_limit_state  should  be  returned  in
	      *buf_ptr,	 number of entries in this array should be returned in
	      *n.  If number of entries is equal to zero, then	*buf_ptr  must
	      be  NULL.	  If  tm1  is NULL, then current limit state should be
	      returned.

       st_get_threshold_stat
	      This function is used for querying current state for a threshold
	      number  thresholdno  in  a rule number ruleno.  If a module does
	      not have current state for the threshold, then the return	 value
	      should  be  0.  If a module has current state for the threshold,
	      then the return value should be 1.

       If some function returns integer value, then it should return the value
       -1 if an error occurred, else zero should be returned (if corresponding
       description does not specify another value).

       If a statistics module does not support	some  functions,  which	 query
       statistics or description, then set corresponding fields to NULL.

       If  some	 function  accepts  mem_type argument, then all allocated data
       being returned by this function should be allocated with the help  from
       ipa_memfunc functions with the given mem_type.

       If  some	 function is exported to a module, then corresponding field in
       API structure can be set to any value (usually NULL).

SEE ALSO
       ipa(8), ipactl(8), ipastat(8), ipa.conf(5), ipastat.conf(5)

AUTHOR
       Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua>

BUGS
       If you find any, please send email me.

			       December 5, 2010			    IPA_MOD(3)
[top]

List of man pages available for DragonFly

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net