You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
8.7 KiB

/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
#ifndef ZABBIX_MODULE_H
#define ZABBIX_MODULE_H
#include "zbxtypes.h"
#define ZBX_MODULE_OK 0
#define ZBX_MODULE_FAIL -1
/* zbx_module_api_version() MUST return this constant */
#define ZBX_MODULE_API_VERSION 2
/* old name alias is kept for source compatibility only, SHOULD NOT be used */
#define ZBX_MODULE_API_VERSION_ONE ZBX_MODULE_API_VERSION
/* HINT: For conditional compilation with different module.h versions modules can use: */
/* #if ZBX_MODULE_API_VERSION == X */
/* ... */
/* #endif */
#define get_rkey(request) (request)->key
#define get_rparams_num(request) (request)->nparam
#define get_rparam(request, num) ((request)->nparam > num ? (request)->params[num] : NULL)
#define get_rparam_type(request, num) ((request)->nparam > num ? (request)->types[num] : \
REQUEST_PARAMETER_TYPE_UNDEFINED)
/* flags for command */
#define CF_HAVEPARAMS 0x01 /* item accepts either optional or mandatory parameters */
#define CF_MODULE 0x02 /* item is defined in a loadable module */
#define CF_USERPARAMETER 0x04 /* item is defined as user parameter */
typedef enum
{
REQUEST_PARAMETER_TYPE_UNDEFINED = 0,
REQUEST_PARAMETER_TYPE_STRING,
REQUEST_PARAMETER_TYPE_ARRAY
}
zbx_request_parameter_type_t;
/* agent request structure */
typedef struct
{
char *key;
int nparam;
char **params;
zbx_uint64_t lastlogsize;
int mtime;
zbx_request_parameter_type_t *types;
}
AGENT_REQUEST;
typedef struct
{
char *value;
char *source;
int timestamp;
int severity;
int logeventid;
}
zbx_log_t;
/* agent result types */
#define AR_UINT64 0x01
#define AR_DOUBLE 0x02
#define AR_STRING 0x04
#define AR_TEXT 0x08
#define AR_LOG 0x10
#define AR_MESSAGE 0x20
#define AR_META 0x40
#define AR_BIN 0x80
/* agent return structure */
typedef struct
{
zbx_uint64_t lastlogsize; /* meta information */
zbx_uint64_t ui64;
double dbl;
char *str;
char *text;
char *msg; /* possible error message */
zbx_log_t *log;
char *bin;
int type; /* flags: see AR_* above */
int mtime; /* meta information */
}
AGENT_RESULT;
typedef struct
{
char *key;
unsigned flags;
int (*function)(AGENT_REQUEST *request, AGENT_RESULT *result);
char *test_param; /* item test parameters; user parameter items keep command here */
}
zbx_metric_t;
/* for backward-compatibility */
#define ZBX_METRIC zbx_metric_t
/* SET RESULT */
#define SET_UI64_RESULT(res, val) \
( \
(res)->type |= AR_UINT64, \
(res)->ui64 = (zbx_uint64_t)(val) \
)
#define SET_DBL_RESULT(res, val) \
( \
(res)->type |= AR_DOUBLE, \
(res)->dbl = (double)(val) \
)
/* NOTE: always allocate new memory for val! DON'T USE STATIC OR STACK MEMORY!!! */
#define SET_STR_RESULT(res, val) \
( \
(res)->type |= AR_STRING, \
(res)->str = (char *)(val) \
)
/* NOTE: always allocate new memory for val! DON'T USE STATIC OR STACK MEMORY!!! */
#define SET_TEXT_RESULT(res, val) \
( \
(res)->type |= AR_TEXT, \
(res)->text = (char *)(val) \
)
/* NOTE: always allocate new memory for val! DON'T USE STATIC OR STACK MEMORY!!! */
#define SET_LOG_RESULT(res, val) \
( \
(res)->type |= AR_LOG, \
(res)->log = (zbx_log_t *)(val) \
)
/* NOTE: always allocate new memory for val! DON'T USE STATIC OR STACK MEMORY!!! */
#define SET_MSG_RESULT(res, val) \
( \
(res)->type |= AR_MESSAGE, \
(res)->msg = (char *)(val) \
)
/* CHECK RESULT */
#define ZBX_ISSET_UI64(res) ((res)->type & AR_UINT64)
#define ZBX_ISSET_DBL(res) ((res)->type & AR_DOUBLE)
#define ZBX_ISSET_STR(res) ((res)->type & AR_STRING)
#define ZBX_ISSET_TEXT(res) ((res)->type & AR_TEXT)
#define ZBX_ISSET_BIN(res) ((res)->type & AR_BIN)
#define ZBX_ISSET_LOG(res) ((res)->type & AR_LOG)
#define ZBX_ISSET_MSG(res) ((res)->type & AR_MESSAGE)
#define ZBX_ISSET_META(res) ((res)->type & AR_META)
#define ZBX_ISSET_VALUE(res) ((res)->type & (AR_UINT64 | AR_DOUBLE | AR_STRING | AR_TEXT | AR_LOG))
/* UNSET RESULT */
#define ZBX_UNSET_UI64_RESULT(res) \
\
do \
{ \
(res)->type &= ~AR_UINT64; \
(res)->ui64 = (zbx_uint64_t)0; \
} \
while (0)
#define ZBX_UNSET_DBL_RESULT(res) \
\
do \
{ \
(res)->type &= ~AR_DOUBLE; \
(res)->dbl = (double)0; \
} \
while (0)
#define ZBX_UNSET_STR_RESULT(res) \
\
do \
{ \
if ((res)->type & AR_STRING) \
{ \
zbx_free((res)->str); \
(res)->type &= ~AR_STRING; \
} \
} \
while (0)
#define ZBX_UNSET_TEXT_RESULT(res) \
\
do \
{ \
if ((res)->type & AR_TEXT) \
{ \
zbx_free((res)->text); \
(res)->type &= ~AR_TEXT; \
} \
} \
while (0)
#define ZBX_UNSET_BIN_RESULT(res) \
\
do \
{ \
if ((res)->type & AR_BIN) \
{ \
zbx_free((res)->bin); \
(res)->type &= ~AR_BIN ; \
} \
} \
while (0)
#define ZBX_UNSET_LOG_RESULT(res) \
\
do \
{ \
if ((res)->type & AR_LOG) \
{ \
zbx_free((res)->log->source); \
zbx_free((res)->log->value); \
zbx_free((res)->log); \
(res)->type &= ~AR_LOG; \
} \
} \
while (0)
#define ZBX_UNSET_MSG_RESULT(res) \
\
do \
{ \
if ((res)->type & AR_MESSAGE) \
{ \
zbx_free((res)->msg); \
(res)->type &= ~AR_MESSAGE; \
} \
} \
while (0)
/* AR_META is always excluded */
#define ZBX_UNSET_RESULT_EXCLUDING(res, exc_type) \
\
do \
{ \
if (!(exc_type & AR_UINT64)) ZBX_UNSET_UI64_RESULT(res); \
if (!(exc_type & AR_DOUBLE)) ZBX_UNSET_DBL_RESULT(res); \
if (!(exc_type & AR_STRING)) ZBX_UNSET_STR_RESULT(res); \
if (!(exc_type & AR_TEXT)) ZBX_UNSET_TEXT_RESULT(res); \
if (!(exc_type & AR_BIN)) ZBX_UNSET_BIN_RESULT(res); \
if (!(exc_type & AR_LOG)) ZBX_UNSET_LOG_RESULT(res); \
if (!(exc_type & AR_MESSAGE)) ZBX_UNSET_MSG_RESULT(res); \
} \
while (0)
#define zbx_init_agent_result(result) {memset((result), 0, sizeof(AGENT_RESULT));}
#define zbx_free_agent_result(result) \
{ \
ZBX_UNSET_UI64_RESULT((result)); \
ZBX_UNSET_DBL_RESULT((result)); \
ZBX_UNSET_STR_RESULT((result)); \
ZBX_UNSET_TEXT_RESULT((result)); \
ZBX_UNSET_BIN_RESULT(result); \
ZBX_UNSET_LOG_RESULT((result)); \
ZBX_UNSET_MSG_RESULT((result)); \
}
#define SYSINFO_RET_OK 0
#define SYSINFO_RET_FAIL 1
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
double value;
}
ZBX_HISTORY_FLOAT;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
zbx_uint64_t value;
}
ZBX_HISTORY_INTEGER;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
}
ZBX_HISTORY_STRING;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
}
ZBX_HISTORY_TEXT;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
}
ZBX_HISTORY_BIN;
typedef struct
{
zbx_uint64_t itemid;
int clock;
int ns;
const char *value;
const char *source;
int timestamp;
int logeventid;
int severity;
}
ZBX_HISTORY_LOG;
typedef struct
{
void (*history_float_cb)(const ZBX_HISTORY_FLOAT *history, int history_num);
void (*history_integer_cb)(const ZBX_HISTORY_INTEGER *history, int history_num);
void (*history_string_cb)(const ZBX_HISTORY_STRING *history, int history_num);
void (*history_text_cb)(const ZBX_HISTORY_TEXT *history, int history_num);
void (*history_log_cb)(const ZBX_HISTORY_LOG *history, int history_num);
void (*history_bin_cb)(const ZBX_HISTORY_BIN *history, int history_num);
}
ZBX_HISTORY_WRITE_CBS;
int zbx_module_api_version(void);
int zbx_module_init(void);
int zbx_module_uninit(void);
void zbx_module_item_timeout(int timeout);
ZBX_METRIC *zbx_module_item_list(void);
ZBX_HISTORY_WRITE_CBS zbx_module_history_write_cbs(void);
#endif