diff options
author | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-02-12 12:39:13 +0000 |
---|---|---|
committer | osmiy <osmiy@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-02-12 12:39:13 +0000 |
commit | 44c297403e8be585e6dd89ccfee7990dad1feadf (patch) | |
tree | 0b54dcfdff4ab1d02a9a239e7038487a3376758c | |
parent | 8db0715194e777206d508d8c354067b7ddef1645 (diff) | |
download | zabbix-44c297403e8be585e6dd89ccfee7990dad1feadf.tar.gz zabbix-44c297403e8be585e6dd89ccfee7990dad1feadf.tar.xz zabbix-44c297403e8be585e6dd89ccfee7990dad1feadf.zip |
- fixed large SQLs calling (Eugene)
- increased message size for alerts (Eugene)
- fixed macros substitution for messages (Eugene)
git-svn-id: svn://svn.zabbix.com/trunk@3821 97f52cf1-0a1b-0410-bd0e-c28be96e8082
33 files changed, 336 insertions, 552 deletions
@@ -1,5 +1,6 @@ Changes for 1.3.3: + - fixed large SQLs calling (Eugene) - new templates Unix_t, Windows_t, Standalone_t (Alexei) - added media_type.username, media_type.passwd (Alexei) - added hosts.dns. Host name is for informational purposes only. (Alexei) @@ -78,6 +79,8 @@ Integrated from 1.1.x 1.1.6 + - increased message size for alerts (Eugene) + - fixed macros substitution for messages (Eugene) - improved 'perf_counter[*]' for WinXX (Eugene) - fixed stderr/stdout redirection during logrotation (Eugene) - fixed graphs in Oracle system (Eugene) @@ -55,7 +55,7 @@ then echo " $0 [commands] [options]" echo echo " Commands:" - echo " [win2nix] - convers win EOL [\\r\\n] to nix EOL [\\r]" + echo " [win2nix] - convers win EOL [\\\\r\\\\n] to nix EOL [\\\\n]" echo " [copy|cpy] - copy automake files" echo " [premake|pre] - make configuration file" echo " [configure|config|conf] - configure make files" diff --git a/frontends/php/css.css b/frontends/php/css.css index 4baa7992..8b831761 100644 --- a/frontends/php/css.css +++ b/frontends/php/css.css @@ -1,3 +1,5 @@ +.top { vertical-align: top; } + body { background-color:#e5e5e5; @@ -1101,4 +1103,3 @@ ul.messages li.error color:#AA0000; list-style: url('images/general/error_small.gif') inside; } - diff --git a/frontends/php/include/actions.inc.php b/frontends/php/include/actions.inc.php index c8138d46..41d80ce2 100644 --- a/frontends/php/include/actions.inc.php +++ b/frontends/php/include/actions.inc.php @@ -295,7 +295,7 @@ 10*$start+$num); $table = new CTableInfo(S_NO_ACTIONS_FOUND); - $table->SetHeader(array(S_TIME, S_TYPE, S_STATUS, S_RECIPIENTS, S_SUBJECT, S_MESSAGE, S_ERROR)); + $table->SetHeader(array(S_TIME, S_TYPE, S_STATUS, S_RECIPIENTS, S_MESSAGE, S_ERROR)); $col=0; $skip=$start; while(($row=DBfetch($result))&&($col<$num)) @@ -309,15 +309,17 @@ if($row["status"] == 1) { - $status=new CCol(S_SENT,"off"); + $status=new CSpan(S_SENT,"off"); } else { - $status=new CCol(S_NOT_SENT,"on"); + $status=new CSpan(S_NOT_SENT,"on"); } $sendto=htmlspecialchars($row["sendto"]); - $subject="<pre>".htmlspecialchars($row["subject"])."</pre>"; - $message="<pre>".htmlspecialchars($row["message"])."</pre>"; + + $subject = empty($row["subject"]) ? '' : "<pre>".bold(S_SUBJECT.': ').htmlspecialchars($row["subject"])."</pre>"; + $message = array($subject,"<pre>".htmlspecialchars($row["message"])."</pre>"); + if($row["error"] == "") { $error=new CSpan(SPACE,"off"); @@ -327,13 +329,12 @@ $error=new CSpan($row["error"],"on"); } $table->AddRow(array( - $time, - $row["description"], - $status, - $sendto, - $subject, - $message, - $error)); + new CCol($time, 'top'), + new CCol($row["description"], 'top'), + new CCol($status, 'top'), + new CCol($sendto, 'top'), + new CCol($message, 'top'), + new CCol($error, 'top'))); $col++; } diff --git a/include/common.h b/include/common.h index 750f0fd7..d20a2ff2 100644 --- a/include/common.h +++ b/include/common.h @@ -509,7 +509,9 @@ int set_result_type(AGENT_RESULT *result, int value_type, char *c); size_t zbx_strlcpy(char *dst, const char *src, size_t siz); size_t zbx_strlcat(char *dst, const char *src, size_t siz); -char* zbx_dvsprintf(const char *f, va_list args); +char* zbx_dvsprintf(char *dest, const char *f, va_list args); +char* zbx_dsprintf(char *dest, const char *f, ...); +char* zbx_strdcat(char *dest, const char *src); int replace_param(const char *cmd, const char *param, char *out, int outlen); diff --git a/include/db.h b/include/db.h index ef7536e9..d106d298 100644 --- a/include/db.h +++ b/include/db.h @@ -61,6 +61,9 @@ extern char *CONFIG_DBPASSWORD; extern char *CONFIG_DBSOCKET; extern int CONFIG_DBPORT; +extern int CONFIG_NODEID; +extern int CONFIG_MASTER_NODEID; + #define DB_FULL_DELETE 0 #define DB_PART_DELETE 1 @@ -192,8 +195,8 @@ DB_EVENT int acknowledged; char trigger_description[TRIGGER_DESCRIPTION_LEN_MAX]; int trigger_priority; - char trigger_url[TRIGGER_URL_LEN_MAX]; - char trigger_comments[TRIGGER_COMMENTS_LEN_MAX]; + char *trigger_url; + char *trigger_comments; }; DB_HOST @@ -332,8 +335,8 @@ DB_TRIGGER zbx_uint64_t triggerid; char expression[TRIGGER_EXPRESSION_LEN_MAX]; char description[TRIGGER_DESCRIPTION_LEN_MAX]; - char url[TRIGGER_URL_LEN_MAX]; - char comments[TRIGGER_COMMENTS_LEN_MAX]; + char *url; + char *comments; int status; int value; // int prevvalue; @@ -348,12 +351,12 @@ DB_ACTION /* int delay;*/ int lastcheck; int recipient; - char subject[ACTION_SUBJECT_LEN_MAX]; /* don't use pointer, cose sizeof is used */ + char *subject; char *message; int message_len; int maxrepeats; int repeatdelay; - char scripts[MAX_STRING_LEN]; + char *scripts; }; DB_CONDITION @@ -476,7 +479,7 @@ int DBget_trends_count(void); int DBget_triggers_count(void); int DBget_queue_count(void); -void DBescape_string(char *from, char *to, int maxlen); +void DBescape_string(const char *from, char *to, int maxlen); void DBget_item_from_db(DB_ITEM *item,DB_ROW row); zbx_uint64_t DBadd_host(char *server, int port, int status, int useip, char *ip, int disable_until, int available); diff --git a/include/sysinfo.h b/include/sysinfo.h index 3de8519b..bed63b99 100644 --- a/include/sysinfo.h +++ b/include/sysinfo.h @@ -131,4 +131,15 @@ int SERVICE_STATE(const char *cmd, const char *param, unsigned flags, AGENT_RESU int PROC_INFO(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result); #endif /* _WINDOWS */ +#ifndef HAVE_SYS_PROCFS_H +int getprocs( + struct procsinfo *ProcessBuffer, + int ProcessSize, + struct fdsinfo *FileBuffer, + int FileSize, + pid_t *IndexPointer, + int Count + ); +#endif /* ndef HAVE_SYS_PROCFS_H */ + #endif diff --git a/src/libs/zbxcommon/str.c b/src/libs/zbxcommon/str.c index 04577476..65886297 100644 --- a/src/libs/zbxcommon/str.c +++ b/src/libs/zbxcommon/str.c @@ -734,25 +734,99 @@ size_t zbx_strlcat(char *dst, const char *src, size_t siz) * Comments: required free allocated string with function 'zbx_free' * * * ******************************************************************************/ -char* zbx_dvsprintf(const char *f, va_list args) +char* zbx_dvsprintf(char *dest, const char *f, va_list args) { char *string = NULL; int n, size = MAX_STRING_LEN >> 1; + va_list curr; + while(1) { string = zbx_malloc(size); - n = vsnprintf(string, size, f, args); + va_copy(curr, args); + n = vsnprintf(string, size, f, curr); + va_end(curr); if(n >= 0 && n < size) break; - if(n >= size) size = n + 3; + if(n >= size) size = n + 1; else size = size * 3 / 2 + 1; zbx_free(string); } + if(dest) zbx_free(dest); + + return string; +} + +/****************************************************************************** + * * + * Function: zbx_dsprintf * + * * + * Purpose: dinamical formatted output conversion * + * * + * Return value: formated string * + * * + * Author: Eugene Grigorjev * + * * + * Comments: required free allocated string with function 'zbx_free' * + * * + ******************************************************************************/ +char* zbx_dsprintf(char *dest, const char *f, ...) +{ + char *string = NULL; + va_list args; + + va_start(args, f); + + string = zbx_dvsprintf(dest, f, args); + + va_end(args); + return string; } +/****************************************************************************** + * * + * Function: zbx_strdcat * + * * + * Purpose: dinamical cating of strings * + * * + * Return value: new pointer of string * + * * + * Author: Eugene Grigorjev * + * * + * Comments: required free allocated string with function 'zbx_free' * + * * + ******************************************************************************/ +char* zbx_strdcat(char *dest, const char *src) +{ + register int new_len = 0; + char *new_dest = NULL; + + if(!src || !src[0]) return dest; + + if(dest) new_len += strlen(dest); + + new_len += strlen(src); + + new_dest = zbx_malloc(new_len + 1); + + if(dest) + { + strcpy(new_dest, dest); + strcat(new_dest, src); + zbx_free(dest); + } + else + { + strcpy(new_dest, src); + } + + new_dest[new_len] = '\0'; + + return new_dest; +} diff --git a/src/libs/zbxcomms/comms.c b/src/libs/zbxcomms/comms.c index 08ac0019..3bd18b46 100644 --- a/src/libs/zbxcomms/comms.c +++ b/src/libs/zbxcomms/comms.c @@ -234,18 +234,18 @@ int zbx_tcp_recv(zbx_sock_t *s, char **data) int allocated, offset; zbx_uint64_t expected_len; - memset(s->buf_stat,0,ZBX_STAT_BUF_LEN); + memset(s->buf_stat,0,sizeof(s->buf_stat)); + s->buf_type = ZBX_BUF_TYPE_STAT; nbytes=read(s->socket, s->buf_stat, 5); if(nbytes==5 && strncmp(s->buf_stat,"ZBXD",4)==0 && s->buf_stat[4] == 1) { - nbytes=read(s->socket, (zbx_uint64_t *)&expected_len, sizeof(expected_len)); + nbytes=read(s->socket, (void *)&expected_len, sizeof(zbx_uint64_t)); - read_max = ZBX_STAT_BUF_LEN -1; /* The rest was already cleared */ memset(s->buf_stat,0,5); - nbytes = read(s->socket, s->buf_stat, read_max); + nbytes = read(s->socket, s->buf_stat, sizeof(s->buf_stat) - 1 ); *data = s->buf_stat; } @@ -266,7 +266,7 @@ int zbx_tcp_recv(zbx_sock_t *s, char **data) { s->buf_type = ZBX_BUF_TYPE_DYN; allocated = ZBX_BUF_LEN; - s->buf_dyn=malloc(allocated); + s->buf_dyn=zbx_malloc(allocated); memset(s->buf_dyn,0,ZBX_BUF_LEN); strnscpy(s->buf_dyn, s->buf_stat, ZBX_BUF_LEN); diff --git a/src/libs/zbxdbhigh/Makefile.am b/src/libs/zbxdbhigh/Makefile.am index 77e90eab..399cc03b 100644 --- a/src/libs/zbxdbhigh/Makefile.am +++ b/src/libs/zbxdbhigh/Makefile.am @@ -10,4 +10,4 @@ libzbxdbhigh_a_SOURCES = \ host.c \ db.c -libzbxdbhigh_a_CPPFLAGS = $(DB_CPPFLAGS) +libzbxdbhigh_a_CPPFLAGS = -I@top_srcdir@/src/zabbix_server/ $(DB_CPPFLAGS) diff --git a/src/libs/zbxdbhigh/action.c b/src/libs/zbxdbhigh/action.c index 916ccb55..09116ee6 100644 --- a/src/libs/zbxdbhigh/action.c +++ b/src/libs/zbxdbhigh/action.c @@ -79,8 +79,8 @@ int DBget_action_by_actionid(zbx_uint64_t actionid,DB_ACTION *action) action->actionid=actionid; ZBX_STR2UINT64(action->userid, row[0]); action->recipient=atoi(row[1]); - strscpy(action->subject,row[2]); - strscpy(action->message,row[3]); + action->subject=strdup(row[2]); + action->message=strdup(row[3]); } DBfree_result(result); diff --git a/src/libs/zbxdbhigh/db.c b/src/libs/zbxdbhigh/db.c index d174d23e..2b4fc625 100644 --- a/src/libs/zbxdbhigh/db.c +++ b/src/libs/zbxdbhigh/db.c @@ -32,6 +32,7 @@ #include "log.h" #include "zlog.h" #include "common.h" +#include "actions.h" #include "../../zabbix_server/events.h" @@ -53,11 +54,6 @@ sqlo_db_handle_t oracle; #endif -extern void apply_actions(DB_TRIGGER *trigger,int trigger_value); -extern void update_services(int triggerid, int status); -extern int CONFIG_NODEID; -extern int CONFIG_MASTER_NODEID; - void DBclose(void) { #ifdef HAVE_MYSQL @@ -305,7 +301,7 @@ int DBexecute(const char *fmt, ...) va_start(args, fmt); - sql = zbx_dvsprintf(fmt, args); + sql = zbx_dvsprintf(sql, fmt, args); va_end(args); @@ -532,7 +528,7 @@ DB_RESULT DBselect(const char *fmt, ...) va_start(args, fmt); - sql = zbx_dvsprintf(fmt, args); + sql = zbx_dvsprintf(sql, fmt, args); va_end(args); @@ -641,34 +637,6 @@ DB_RESULT DBselectN(char *query, int n) } /* - * Get value for given row and field. Must be called after DBselect. - */ -/* -char *DBget_field(DB_RESULT result, int rownum, int fieldnum) -{ -#ifdef HAVE_MYSQL - MYSQL_ROW row; - - mysql_data_seek(result, rownum); - row=mysql_fetch_row(result); - if(row == NULL) - { - zabbix_log(LOG_LEVEL_ERR, "Error while mysql_fetch_row():Error [%s] Rownum [%d] Fieldnum [%d]", mysql_error(&mysql), rownum, fieldnum ); - zabbix_syslog("MYSQL: Error while mysql_fetch_row():Error [%s] Rownum [%d] Fieldnum [%d]", mysql_error(&mysql), rownum, fieldnum ); - exit(FAIL); - } - return row[fieldnum]; -#endif -#ifdef HAVE_POSTGRESQL - return PQgetvalue(result, rownum, fieldnum); -#endif -#ifdef HAVE_ORACLE - return FAIL; -#endif -} -*/ - -/* * Get value of autoincrement field for last insert or update statement */ zbx_uint64_t DBinsert_id(int exec_result, const char *table, const char *field) @@ -718,7 +686,6 @@ zbx_uint64_t DBinsert_id(int exec_result, const char *table, const char *field) row = DBfetch(result); ZBX_STR2UINT64(id, row[0]); -/* id = atoi(row[0]);*/ DBfree_result(result); return id; @@ -729,88 +696,6 @@ zbx_uint64_t DBinsert_id(int exec_result, const char *table, const char *field) } /* - * Returs number of affected rows of last select, update, delete or replace - */ -/* -long DBaffected_rows() -{ -#ifdef HAVE_MYSQL - return (long)mysql_affected_rows(&mysql); -#endif -#ifdef HAVE_POSTGRESQL - NOT IMPLEMENTED YET -#endif -#ifdef HAVE_ORACLE - return FAIL; -#endif -}*/ - - -/* - * Return SUCCEED if result conains no records - */ -/*int DBis_empty(DB_RESULT *result) -{ - zabbix_log(LOG_LEVEL_DEBUG, "In DBis_empty"); - if(result == NULL) - { - return SUCCEED; - } - if(DBnum_rows(result) == 0) - { - return SUCCEED; - } - if(DBget_field(result,0,0) == 0) - { - return SUCCEED; - } - - return FAIL; -}*/ - -/* - * Get number of selected records. - */ -/* -int DBnum_rows(DB_RESULT result) -{ -#ifdef HAVE_MYSQL - int rows; - - zabbix_log(LOG_LEVEL_DEBUG, "In DBnum_rows"); - if(result == NULL) - { - return 0; - } -// Order is important ! - rows = mysql_num_rows(result); - if(rows == 0) - { - return 0; - } - -// This is necessary to exclude situations like -// atoi(DBget_field(result,0,0). This leads to coredump. -// -// This is required for empty results for count(*), etc - if(DBget_field(result,0,0) == 0) - { - return 0; - } - zabbix_log(LOG_LEVEL_DEBUG, "Result of DBnum_rows [%d]", rows); - return rows; -#endif -#ifdef HAVE_POSTGRESQL - zabbix_log(LOG_LEVEL_DEBUG, "In DBnum_rows"); - return PQntuples(result); -#endif -#ifdef HAVE_ORACLE - return sqlo_prows(result); -#endif -} -*/ - -/* * Get function value. */ int DBget_function_result(double *result,char *functionid) @@ -908,93 +793,6 @@ static void get_latest_event_status(zbx_uint64_t triggerid, int *prev_status, in DBfree_result(result); } -/* Returns previous trigger value. If not value found, return TRIGGER_VALUE_FALSE */ -/*int DBget_prev_trigger_value(int triggerid) -{ - int clock; - int value; - - DB_RESULT result; - DB_ROW row; - - zabbix_log(LOG_LEVEL_DEBUG,"In DBget_prev_trigger_value[%d]", triggerid); - - result = DBselect("select max(clock) from events where triggerid=%d",triggerid); - - row=DBfetch(result); - - if(!row || DBis_null(row[0])==SUCCEED) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" ); - DBfree_result(result); - return TRIGGER_VALUE_UNKNOWN; - } - clock=atoi(row[0]); - DBfree_result(result); - - result=DBselect("select max(clock) from events where triggerid=%d and clock<%d",triggerid,clock); - row=DBfetch(result); - - if(!row || DBis_null(row[0])==SUCCEED) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" ); - DBfree_result(result); - return TRIGGER_VALUE_FALSE; - } - clock=atoi(row[0]); - DBfree_result(result); - - result = DBselect("select value from events where triggerid=%d and clock=%d",triggerid,clock); - row=DBfetch(result); - - if(!row || DBis_null(row[0])==SUCCEED) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result of SQL is empty"); - DBfree_result(result); - return TRIGGER_VALUE_UNKNOWN; - } - value=atoi(row[0]); - DBfree_result(result); - - return value; -}*/ - -/* SUCCEED if latest event with triggerid has this status */ -/* Rewrite required to simplify logic ?*/ -/* -static int latest_event(int triggerid, int status) -{ - char sql[MAX_STRING_LEN]; - DB_RESULT result; - DB_ROW row; - int ret = FAIL; - - - zabbix_log(LOG_LEVEL_DEBUG,"In latest_event()"); - - zbx_snprintf(sql,sizeof(sql),"select value from events where triggerid=%d order by clock desc",triggerid); - zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql); - result = DBselectN(sql,1); - row = DBfetch(result); - - if(!row || DBis_null(row[0])==SUCCEED) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for last is empty" ); - } - else - { - if(atoi(row[0]) == status) - { - ret = SUCCEED; - } - } - - DBfree_result(result); - - return ret; -} -*/ - /* SUCCEED if latest service alarm has this status */ /* Rewrite required to simplify logic ?*/ int latest_service_alarm(zbx_uint64_t serviceid, int status) @@ -1036,36 +834,6 @@ int latest_service_alarm(zbx_uint64_t serviceid, int status) return ret; } -/* Returns eventid or 0 */ -/* -int add_event(int triggerid,int status,int clock,int *eventid) -{ - *eventid=0; - - zabbix_log(LOG_LEVEL_DEBUG,"In add_event(%d,%d,%d)",triggerid, status, *eventid); - - if(latest_event(triggerid,status) == SUCCEED) - { - zabbix_log(LOG_LEVEL_DEBUG,"Alarm for triggerid [%d] status [%d] already exists",triggerid,status); - return FAIL; - } - - - *eventid = DBinsert_id( - DBexecute("insert into events(triggerid,clock,value) values(%d,%d,%d)", triggerid, clock, status), - "events", "eventid"); - - if(status == TRIGGER_VALUE_FALSE || status == TRIGGER_VALUE_TRUE) - { - DBexecute("update events set retries=3,error='Trigger changed its status. WIll not send repeats.' where triggerid=%d and repeats>0 and status=%d", triggerid, ALERT_STATUS_NOT_SENT); - } - - zabbix_log(LOG_LEVEL_DEBUG,"End of add_event()"); - - return SUCCEED; -} -*/ - int DBadd_service_alarm(zbx_uint64_t serviceid,int status,int clock) { zabbix_log(LOG_LEVEL_DEBUG,"In add_service_alarm()"); @@ -1172,15 +940,18 @@ void update_triggers_status_to_unknown(zbx_uint64_t hostid,int clock,char *reaso zabbix_log(LOG_LEVEL_DEBUG,"In update_triggers_status_to_unknown()"); -/* zbx_snprintf(sql,sizeof(sql),"select distinct t.triggerid from hosts h,items i,triggers t,functions f where f.triggerid=t.triggerid and f.itemid=i.itemid and h.hostid=i.hostid and h.hostid=%d and i.key_<>'%s'",hostid,SERVER_STATUS_KEY);*/ - result = DBselect("select distinct t.triggerid,t.value,t.comments from hosts h,items i,triggers t,functions f where f.triggerid=t.triggerid and f.itemid=i.itemid and h.hostid=i.hostid and h.hostid=" ZBX_FS_UI64 " and i.key_ not in ('%s','%s','%s')",hostid,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY); + result = DBselect("select distinct t.triggerid,t.expression,t.description,t.status,t.priority,t.value,t.url,t.comments from hosts h,items i,triggers t,functions f where f.triggerid=t.triggerid and f.itemid=i.itemid and h.hostid=i.hostid and h.hostid=" ZBX_FS_UI64 " and i.key_ not in ('%s','%s','%s')",hostid,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY); while((row=DBfetch(result))) { ZBX_STR2UINT64(trigger.triggerid,row[0]); -/* trigger.triggerid=atoi(row[0]);*/ - trigger.value=atoi(row[1]); - strscpy(trigger.comments, row[2]); + strscpy(trigger.expression,row[1]); + strscpy(trigger.description,row[2]); + trigger.status = atoi(row[3]); + trigger.priority = atoi(row[4]); + trigger.value = atoi(row[5]); + trigger.url = row[6]; + trigger.comments = row[7]; DBupdate_trigger_value(&trigger,TRIGGER_VALUE_UNKNOWN,clock,reason); } @@ -1337,13 +1108,18 @@ void DBupdate_triggers_status_after_restart(void) now=time(NULL); - result = DBselect("select distinct t.triggerid,t.value from hosts h,items i,triggers t,functions f where f.triggerid=t.triggerid and f.itemid=i.itemid and h.hostid=i.hostid and i.nextcheck+i.delay<%d and i.key_<>'%s' and h.status not in (%d,%d)",now,SERVER_STATUS_KEY, HOST_STATUS_DELETED, HOST_STATUS_TEMPLATE); + result = DBselect("select distinct t.triggerid,t.expression,t.description,t.status,t.priority,t.value,t.url,t.comments from hosts h,items i,triggers t,functions f where f.triggerid=t.triggerid and f.itemid=i.itemid and h.hostid=i.hostid and i.nextcheck+i.delay<%d and i.key_<>'%s' and h.status not in (%d,%d)",now,SERVER_STATUS_KEY, HOST_STATUS_DELETED, HOST_STATUS_TEMPLATE); while((row=DBfetch(result))) { ZBX_STR2UINT64(trigger.triggerid,row[0]); -/* trigger.triggerid=atoi(row[0]);*/ - trigger.value=atoi(row[1]); + strscpy(trigger.expression,row[1]); + strscpy(trigger.description,row[2]); + trigger.status = atoi(row[3]); + trigger.priority = atoi(row[4]); + trigger.value = atoi(row[5]); + trigger.url = row[6]; + trigger.comments = row[7]; result2 = DBselect("select min(i.nextcheck+i.delay) from hosts h,items i,triggers t,functions f where f.triggerid=t.triggerid and f.itemid=i.itemid and h.hostid=i.hostid and i.nextcheck<>0 and t.triggerid=%d and i.type<>%d",trigger.triggerid,ITEM_TYPE_TRAPPER); row2=DBfetch(result2); @@ -1896,19 +1672,20 @@ int DBadd_alert(zbx_uint64_t actionid, zbx_uint64_t userid, zbx_uint64_t trigger zabbix_log(LOG_LEVEL_DEBUG,"In add_alert(triggerid[%d])",triggerid); now = time(NULL); -/* Does not work on PostgreSQL */ -/* zbx_snprintf(sql,sizeof(sql),"insert into alerts (alertid,actionid,clock,mediatypeid,sendto,subject,message,status,retries) values (NULL,%d,%d,%d,'%s','%s','%s',0,0)",actionid,now,mediatypeid,sendto,subject,message);*/ size = strlen(sendto) * 3 / 2 + 1; sendto_esc = zbx_malloc(size); + memset(sendto_esc, 0, size); DBescape_string(sendto, sendto_esc, size); size = strlen(subject) * 3 / 2 + 1; subject_esc = zbx_malloc(size); + memset(subject_esc, 0, size); DBescape_string(subject,subject_esc,size); size = strlen(message) * 3 / 2 + 1; message_esc = zbx_malloc(size); + memset(message_esc, 0, size); DBescape_string(message,message_esc,size); DBexecute("insert into alerts (alertid, actionid,triggerid,userid,clock,mediatypeid,sendto,subject,message,status,retries,maxrepeats,delay)" @@ -1950,47 +1727,17 @@ void DBvacuum(void) #endif } -/* Broken: -void DBescape_string(char *from, char *to, int maxlen) -{ - int i,ptr; - char *f; - - ptr=0; - f=(char *)strdup(from); - for(i=0;f[i]!=0;i++) - { - if( (f[i]=='\'') || (f[i]=='\\')) - { - if(ptr>maxlen-1) break; - to[ptr]='\\'; - if(ptr+1>maxlen-1) break; - to[ptr+1]=f[i]; - ptr+=2; - } - else - { - if(ptr>maxlen-1) break; - to[ptr]=f[i]; - ptr++; - } - } - free(f); - - to[ptr]=0; - to[maxlen-1]=0; -} -*/ - -void DBescape_string(char *from, char *to, int maxlen) +void DBescape_string(const char *from, char *to, int maxlen) { - int i,ptr; + register int i,ptr; assert(to); maxlen--; for(i=0, ptr=0; from && from[i] && ptr < maxlen; i++) { + if( from[i] == '\r' ) continue; + #ifdef HAVE_ORACLE if( (from[i] == '\'')) { @@ -2004,7 +1751,7 @@ void DBescape_string(char *from, char *to, int maxlen) } to[ptr++] = from[i]; } - to[ptr]=0; + to[ptr] = '\0'; } void DBget_item_from_db(DB_ITEM *item,DB_ROW row) diff --git a/src/libs/zbxemail/email.c b/src/libs/zbxemail/email.c index 4d745bdd..044903ce 100644 --- a/src/libs/zbxemail/email.c +++ b/src/libs/zbxemail/email.c @@ -48,7 +48,7 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c { int s; int i,e; - char c[MAX_STRING_LEN]; + char c[MAX_STRING_LEN], *cp = NULL; struct hostent *hp; char str_time[MAX_STRING_LEN]; @@ -81,15 +81,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL3"); -/* if(hp==NULL) - { - zabbix_log(LOG_LEVEL_ERR, "Cannot get IP for mailserver [%s]",smtp_server); - return FAIL; - } - - servaddr_in.sin_addr.s_addr=((struct in_addr *)(hp->h_addr))->s_addr; - servaddr_in.sin_port=htons(25);*/ - s=socket(AF_INET,SOCK_STREAM,0); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL4"); if(s == -1) @@ -115,8 +106,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL5"); memset(c,0,MAX_STRING_LEN); -/* i=sizeof(struct sockaddr_in); - i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i);*/ i=read(s,c,MAX_STRING_LEN); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL6"); if(i == -1) @@ -140,7 +129,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c { memset(c,0,MAX_STRING_LEN); zbx_snprintf(c,sizeof(c),"HELO %s\r\n",smtp_helo); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ e=write(s,c,strlen(c)); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL7"); if(e == -1) @@ -153,8 +141,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c } memset(c,0,MAX_STRING_LEN); -/* i=sizeof(struct sockaddr_in); - i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i);*/ i=read(s,c,MAX_STRING_LEN); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL8"); if(i == -1) @@ -177,10 +163,8 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c memset(c,0,MAX_STRING_LEN); - /* zbx_snprintf(c,sizeof(c),"MAIL FROM: %s\r\n",smtp_email); */ zbx_snprintf(c,sizeof(c),"MAIL FROM: <%s>\r\n",smtp_email); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ e=write(s,c,strlen(c)); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL9"); if(e == -1) @@ -193,8 +177,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c } memset(c,0,MAX_STRING_LEN); -/* i=sizeof(struct sockaddr_in); - i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i);*/ i=read(s,c,MAX_STRING_LEN); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL10"); if(i == -1) @@ -216,7 +198,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c memset(c,0,MAX_STRING_LEN); zbx_snprintf(c,sizeof(c),"RCPT TO: <%s>\r\n",mailto); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ e=write(s,c,strlen(c)); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL11"); if(e == -1) @@ -228,8 +209,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c return FAIL; } memset(c,0,MAX_STRING_LEN); -/* i=sizeof(struct sockaddr_in); - i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i);*/ i=read(s,c,MAX_STRING_LEN); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL12"); if(i == -1) @@ -252,7 +231,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c memset(c,0,MAX_STRING_LEN); zbx_snprintf(c,sizeof(c),"DATA\r\n"); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ e=write(s,c,strlen(c)); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL13"); if(e == -1) @@ -264,8 +242,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c return FAIL; } memset(c,0,MAX_STRING_LEN); -/* i=sizeof(struct sockaddr_in); - i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i);*/ i=read(s,c,MAX_STRING_LEN); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL14"); if(i == -1) @@ -289,11 +265,9 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c time(&email_time); local_time = localtime(&email_time); strftime( str_time, MAX_STRING_LEN, "%a, %d %b %Y %H:%M:%S %z", local_time ); -/* zbx_snprintf(c,sizeof(c),"Subject: %s\r\n%s",mailsubject, mailbody);*/ -/* zbx_snprintf(c,sizeof(c),"From:<%s>\r\nTo:<%s>\r\nSubject: %s\r\n\r\n%s",smtp_email,mailto,mailsubject, mailbody);*/ - zbx_snprintf(c,sizeof(c),"From:<%s>\r\nTo:<%s>\r\nDate: %s\r\nSubject: %s\r\n\r\n%s",smtp_email,mailto,str_time,mailsubject, mailbody); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ - e=write(s,c,strlen(c)); + cp = zbx_dsprintf(cp,"From:<%s>\r\nTo:<%s>\r\nDate: %s\r\nSubject: %s\r\n\r\n%s",smtp_email,mailto,str_time,mailsubject, mailbody); + e=write(s,cp,strlen(cp)); + zbx_free(cp); if(e == -1) { zabbix_log(LOG_LEVEL_DEBUG, "Error sending mail subject and body to mailserver [%s]", strerror(errno)); @@ -305,7 +279,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c memset(c,0,MAX_STRING_LEN); zbx_snprintf(c,sizeof(c),"\r\n.\r\n"); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ e=write(s,c,strlen(c)); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL15"); if(e == -1) @@ -317,8 +290,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c return FAIL; } memset(c,0,MAX_STRING_LEN); -/* i=sizeof(struct sockaddr_in); - i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i);*/ i=read(s,c,MAX_STRING_LEN); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL16"); if(i == -1) @@ -340,7 +311,6 @@ int send_email(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,c memset(c,0,MAX_STRING_LEN); zbx_snprintf(c,sizeof(c),"QUIT\r\n"); -/* e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); */ e=write(s,c,strlen(c)); zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL18"); if(e == -1) diff --git a/src/libs/zbxlog/log.c b/src/libs/zbxlog/log.c index 0453355d..0be91741 100644 --- a/src/libs/zbxlog/log.c +++ b/src/libs/zbxlog/log.c @@ -195,6 +195,8 @@ void zabbix_log(int level, const char *fmt, ...) struct stat buf; + static size_t old_size = 0; + char filename_old[MAX_STRING_LEN]; #if defined(_WINDOWS) @@ -252,8 +254,14 @@ void zabbix_log(int level, const char *fmt, ...) { zbx_error("Can't rename log file [%s] to [%s] [%s]", log_filename, filename_old, strerror(errno)); } + } + + if(old_size > buf.st_size) + { redirect_std(log_filename); } + + old_size = buf.st_size; } } diff --git a/src/libs/zbxsys/mutexs.c b/src/libs/zbxsys/mutexs.c index c6c518ee..c392e38d 100644 --- a/src/libs/zbxsys/mutexs.c +++ b/src/libs/zbxsys/mutexs.c @@ -173,6 +173,8 @@ int zbx_mutex_lock(ZBX_MUTEX *mutex) struct sembuf sem_lock = { *mutex, -1, 0 }; + if(!*mutex) return ZBX_MUTEX_OK; + if (-1 == (semop(ZBX_SEM_LIST_ID, &sem_lock, 1))) { zbx_error("Lock failed [%s]", strerror(errno)); @@ -216,6 +218,8 @@ int zbx_mutex_unlock(ZBX_MUTEX *mutex) struct sembuf sem_unlock = { *mutex, 1, 0}; + if(!*mutex) return ZBX_MUTEX_OK; + if ((semop(ZBX_SEM_LIST_ID, &sem_unlock, 1)) == -1) { zbx_error("Unlock failed [%s]", strerror(errno)); diff --git a/src/libs/zbxsysinfo/aix/proc.c b/src/libs/zbxsysinfo/aix/proc.c index 55bd280f..eadf19c2 100644 --- a/src/libs/zbxsysinfo/aix/proc.c +++ b/src/libs/zbxsysinfo/aix/proc.c @@ -27,18 +27,6 @@ #define DO_MIN 2 #define DO_AVG 3 - -#ifndef HAVE_SYS_PROCFS_H - extern int getprocs( - struct procsinfo *ProcessBuffer, - int ProcessSize, - struct fdsinfo *FileBuffer, - int FileSize, - pid_t *IndexPointer, - int Count - ); -#endif /* ndef HAVE_SYS_PROCFS_H */ - int PROC_MEMORY(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { /* usage: <function name>[ <process name>, <user name>, <mode>, <command> ] */ diff --git a/src/zabbix_sender/zabbix_sender.c b/src/zabbix_sender/zabbix_sender.c index fb5dd918..e0dd611e 100644 --- a/src/zabbix_sender/zabbix_sender.c +++ b/src/zabbix_sender/zabbix_sender.c @@ -43,7 +43,7 @@ char *progname = NULL; char title_message[] = "ZABBIX send"; -char usage_message[] = "[-vh] [-z <zabbix_server>] [-p <port>] [-s <host>] [-k <metric>] [-o <value>] [-i <input_file>]"; +char usage_message[] = "[-vh] {-zpsko | -i}"; #ifdef HAVE_GETOPT_LONG char *help_message[] = { @@ -88,11 +88,11 @@ struct zbx_option longopts[] = {0,0,0,0} }; -void signal_handler( int sig ) +static void zbx_sender_signal_handler( int sig ) { if( SIGALRM == sig ) { - signal( SIGALRM, signal_handler ); + signal( SIGALRM, zbx_sender_signal_handler ); fprintf(stderr,"Timeout while executing operation.\n"); } @@ -158,10 +158,10 @@ int main(int argc, char **argv) progname = argv[0]; - signal( SIGINT, signal_handler ); - signal( SIGQUIT, signal_handler ); - signal( SIGTERM, signal_handler ); - signal( SIGALRM, signal_handler ); + signal( SIGINT, zbx_sender_signal_handler ); + signal( SIGQUIT, zbx_sender_signal_handler ); + signal( SIGTERM, zbx_sender_signal_handler ); + signal( SIGALRM, zbx_sender_signal_handler ); while ((ch = zbx_getopt_long(argc, argv, "z:p:s:k:o:i:hv", longopts, NULL)) != EOF) { diff --git a/src/zabbix_server/actions.c b/src/zabbix_server/actions.c index 189ebf25..1e9758c4 100644 --- a/src/zabbix_server/actions.c +++ b/src/zabbix_server/actions.c @@ -80,10 +80,11 @@ static void send_to_user_medias(DB_EVENT *event,DB_ACTION *action, zbx_uint64_t while((row=DBfetch(result))) { ZBX_STR2UINT64(media.mediatypeid, row[0]); - media.sendto=row[1]; - media.active=atoi(row[2]); - media.severity=atoi(row[3]); - media.period=row[4]; + + media.sendto = row[1]; + media.active = atoi(row[2]); + media.severity = atoi(row[3]); + media.period = row[4]; zabbix_log( LOG_LEVEL_DEBUG, "Trigger severity [%d] Media severity [%d] Period [%s]",event->trigger_priority, media.severity, media.period); if(((1<<event->trigger_priority)&media.severity)==0) @@ -370,8 +371,8 @@ static int check_action_condition(DB_EVENT *event, DB_CONDITION *condition) zbx_uint64_t hostid; zbx_uint64_t condition_value; - char tmp_str[MAX_STRING_LEN]; - + char *tmp_str = NULL; + int ret = FAIL; zabbix_log( LOG_LEVEL_DEBUG, "In check_action_condition [actionid:" ZBX_FS_UI64 ",conditionid:" ZBX_FS_UI64 ",cond.value:%s]", condition->actionid, condition->conditionid, condition->value); @@ -472,9 +473,9 @@ static int check_action_condition(DB_EVENT *event, DB_CONDITION *condition) } else if(condition->conditiontype == CONDITION_TYPE_TRIGGER_NAME) { - zbx_snprintf(tmp_str, sizeof(tmp_str), "%s",event->trigger_description); + tmp_str = zbx_dsprintf(tmp_str, "%s", event->trigger_description); - substitute_simple_macros(event, NULL, tmp_str, sizeof(tmp_str), MACRO_TYPE_TRIGGER_DESCRIPTION); + substitute_simple_macros(event, NULL, &tmp_str, MACRO_TYPE_TRIGGER_DESCRIPTION); if(condition->operator == CONDITION_OPERATOR_LIKE) { @@ -495,6 +496,7 @@ static int check_action_condition(DB_EVENT *event, DB_CONDITION *condition) zabbix_log( LOG_LEVEL_ERR, "Unsupported operator [%d] for condition id [" ZBX_FS_UI64 "]", condition->operator, condition->conditionid); } + zbx_free(tmp_str); } else if(condition->conditiontype == CONDITION_TYPE_TRIGGER_SEVERITY) { @@ -711,36 +713,29 @@ void apply_actions(DB_EVENT *event) if(check_action_conditions(event, action.actionid) == SUCCEED) { zabbix_log( LOG_LEVEL_WARNING, "Conditions match our trigger. Do apply actions."); + ZBX_STR2UINT64(action.userid, row[1]); - strscpy(action.subject,row[2]); - - action.message_len = strlen(row[3]) * 3 / 2 + 1; - action.message = zbx_malloc(action.message_len); + action.subject = strdup(row[2]); + action.message = strdup(row[3]); + action.scripts = strdup(row[7]); - strnscpy(action.message,row[3], action.message_len); - action.recipient = atoi(row[4]); action.maxrepeats = atoi(row[5]); action.repeatdelay = atoi(row[6]); - strscpy(action.scripts,row[7]); action.actiontype = atoi(row[8]); - substitute_macros(event, &action, action.message, action.message_len); - substitute_macros(event, &action, action.subject, sizeof(action.subject)); + substitute_macros(event, &action, &action.message); + substitute_macros(event, &action, &action.subject); -zabbix_log(LOG_LEVEL_CRIT,"Original [%d]: %s", strlen(row[3]), row[3]); // TMP!!! -zabbix_log(LOG_LEVEL_CRIT,"Substituted [%d,%d]: %s", strlen(action.message), action.message_len, action.message); // TMP!!! - if(action.actiontype == ACTION_TYPE_MESSAGE) send_to_user(event,&action); else run_commands(event,&action); -/* zbx_snprintf(sql,sizeof(sql),"update actions set nextcheck=%d where actionid=%d",now+action.delay,action.actionid); - DBexecute(sql);*/ - zbx_free(action.message); + zbx_free(action.subject); + zbx_free(action.scripts); } else { diff --git a/src/zabbix_server/evalfunc.c b/src/zabbix_server/evalfunc.c index 98cf0339..7e4226bb 100644 --- a/src/zabbix_server/evalfunc.c +++ b/src/zabbix_server/evalfunc.c @@ -1349,7 +1349,7 @@ int replace_value_by_map(char *value, zbx_uint64_t valuemapid) zbx_snprintf(value, MAX_STRING_LEN, "%s (%s)", new_value, or_value); - zabbix_log(LOG_LEVEL_DEBUG, "Value: $s", value); + zabbix_log(LOG_LEVEL_DEBUG, "Value: %s", value); return SUCCEED; } diff --git a/src/zabbix_server/events.c b/src/zabbix_server/events.c index c42c23c3..08a1ed5d 100644 --- a/src/zabbix_server/events.c +++ b/src/zabbix_server/events.c @@ -59,7 +59,7 @@ * * * Author: Alexei Vladishev * * * - * Comments: * + * Comments: use 'free_trigger_info' function to clear allocated memory * * * ******************************************************************************/ static void add_trigger_info(DB_EVENT *event) @@ -69,20 +69,18 @@ static void add_trigger_info(DB_EVENT *event) if(event->triggerid == 0) return; - result = DBselect("select description,priority,comments,url from triggers where triggerid=" ZBX_FS_UI64, - event->triggerid); + result = DBselect("select description,priority,comments,url from triggers where triggerid=" ZBX_FS_UI64,event->triggerid); row = DBfetch(result); - event->trigger_description[0]=0; - event->trigger_comments[0]=0; - event->trigger_url[0]=0; + zbx_free(event->trigger_comments); + zbx_free(event->trigger_url); if(row) { strscpy(event->trigger_description, row[0]); event->trigger_priority = atoi(row[1]); - strscpy(event->trigger_comments, row[2]); - strscpy(event->trigger_url, row[3]); + event->trigger_comments = strdup(row[2]); + event->trigger_url = strdup(row[3]); } DBfree_result(result); @@ -90,6 +88,27 @@ static void add_trigger_info(DB_EVENT *event) /****************************************************************************** * * + * Function: free_trigger_info * + * * + * Purpose: clean allocated memory by function 'add_trigger_info' * + * * + * Parameters: event - event data (event.triggerid) * + * * + * Return value: * + * * + * Author: Eugene Grigorjev * + * * + * Comments: * + * * + ******************************************************************************/ +static void free_trigger_info(DB_EVENT *event) +{ + zbx_free(event->trigger_url); + zbx_free(event->trigger_comments); +} + +/****************************************************************************** + * * * Function: process_event * * * * Purpose: process new event * @@ -128,7 +147,6 @@ int process_event(DB_EVENT *event) if(event->value == TRIGGER_VALUE_TRUE) { -// update_services(trigger->triggerid, trigger->priority); update_services(event->triggerid, event->trigger_priority); } else @@ -136,6 +154,8 @@ int process_event(DB_EVENT *event) update_services(event->triggerid, 0); } + free_trigger_info(event); + zabbix_log(LOG_LEVEL_DEBUG,"End of add_event()"); return SUCCEED; diff --git a/src/zabbix_server/events.h b/src/zabbix_server/events.h index 6c1afafb..b56d9f77 100644 --- a/src/zabbix_server/events.h +++ b/src/zabbix_server/events.h @@ -24,8 +24,6 @@ #include "common.h" #include "db.h" -extern int CONFIG_NODEID; - int process_event(DB_EVENT *event); #endif diff --git a/src/zabbix_server/expression.c b/src/zabbix_server/expression.c index 9036ee4a..c52aeedc 100644 --- a/src/zabbix_server/expression.c +++ b/src/zabbix_server/expression.c @@ -549,7 +549,6 @@ int evaluate(int *result,char *exp, char *error, int maxerrlen) * Parameters: trigger - trigger structure * * action - action structure (NULL if uncnown) * * data - data string * - * data_max_len - max length of data string,include '\0' * * * * Return value: * * * @@ -588,7 +587,7 @@ int evaluate(int *result,char *exp, char *error, int maxerrlen) #define STR_UNKNOWN_VARIABLE "*UNKNOWN*" -void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, int data_max_len, int macro_type) +void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char **data, int macro_type) { char @@ -596,11 +595,8 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in *pr = NULL, *str_out = NULL, *replace_to = NULL; - int - replace_to_len, - str_out_len, - str_out_fill, - var_len; + + int var_len; time_t now; struct tm *tm; @@ -608,24 +604,20 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in DB_RESULT result; DB_ROW row; - zabbix_log(LOG_LEVEL_DEBUG, "In substitute_simple_macros [%s]",data); + if(!data || !*data) return; + + zabbix_log(LOG_LEVEL_DEBUG, "In substitute_simple_macros [%s]",*data); - replace_to_len = strlen(data); - replace_to = zbx_malloc(replace_to_len); + if('\0' == *data[0]) return; - str_out_fill = 0; - str_out_len = strlen(data) * 3 / 2 + 1; - str_out = zbx_malloc(str_out_len + 1); - *str_out = '\0'; - - pl = data; - while((pr = strchr(pl, '{')) && str_out_fill < str_out_len) + pl = *data; + while((pr = strchr(pl, '{'))) { pr[0] = '\0'; - str_out_fill = zbx_strlcat(str_out, pl, str_out_len); + str_out = zbx_strdcat(str_out, pl); pr[0] = '{'; - zbx_snprintf(replace_to, replace_to_len, "{"); + replace_to = zbx_dsprintf(replace_to, "{"); var_len = 1; if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && @@ -633,15 +625,16 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in { var_len = strlen(MVAR_TRIGGER_NAME); - zbx_snprintf(replace_to, replace_to_len, "%s", event->trigger_description); - substitute_simple_macros(event, action, replace_to, replace_to_len, MACRO_TYPE_TRIGGER_DESCRIPTION); + replace_to = zbx_dsprintf(replace_to, "%s", event->trigger_description); + + substitute_simple_macros(event, action, &replace_to, MACRO_TYPE_TRIGGER_DESCRIPTION); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_TRIGGER_COMMENT, strlen(MVAR_TRIGGER_COMMENT)) == 0) { var_len = strlen(MVAR_TRIGGER_COMMENT); - zbx_snprintf(replace_to, replace_to_len, "%s", event->trigger_comments); + replace_to = zbx_dsprintf(replace_to, "%s", event->trigger_comments); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_PROFILE_DEVICETYPE, strlen(MVAR_PROFILE_DEVICETYPE)) == 0) @@ -659,11 +652,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.DEVECETYPE in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.DEVECETYPE in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -683,11 +676,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.NAME in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.NAME in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -707,11 +700,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.OS in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.OS in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -731,11 +724,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.SERIALNO in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.SERIALNO in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -755,11 +748,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.TAG in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.TAG in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -779,11 +772,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.MACADDRESS in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.MACADDRESS in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -803,11 +796,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.HARDWARE in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.HARDWARE in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -827,11 +820,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.SOFTWARE in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.SOFTWARE in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -851,11 +844,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.CONTACT in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.CONTACT in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -875,11 +868,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.LOCATION in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.LOCATION in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -899,11 +892,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_log( LOG_LEVEL_ERR, "No PROFILE.NOTES in substitute_simple_macros. Triggerid [%d]", event->triggerid); zabbix_syslog("No PROFILE.NOTES in substitute_simple_macros. Triggerid [%d]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -925,11 +918,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_syslog("No hostname in substitute_simple_macros. Triggerid [" ZBX_FS_UI64 "]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -950,12 +943,12 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in event->triggerid); zabbix_syslog("No ITEM.NAME in substitute_simple_macros. Triggerid [" ZBX_FS_UI64 "]", event->triggerid); - /* remove variable */ - *replace_to = '\0'; + + replace_to = zbx_dsprintf(replace_to, STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); @@ -977,12 +970,12 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in event->triggerid); zabbix_syslog("No TRIGGER.KEY in substitute_simple_macros. Triggerid [" ZBX_FS_UI64 "]", event->triggerid); - /* remove variable */ - *replace_to = '\0'; + + replace_to = zbx_dsprintf(replace_to, STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); @@ -1005,11 +998,11 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in zabbix_syslog("No hostname in substitute_simple_macros. Triggerid [" ZBX_FS_UI64 "]", event->triggerid); - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + replace_to = zbx_dsprintf(replace_to, "%s", STR_UNKNOWN_VARIABLE); } else { - zbx_snprintf(replace_to, replace_to_len, "%s", row[0]); + replace_to = zbx_dsprintf(replace_to, "%s", row[0]); } DBfree_result(result); } @@ -1020,7 +1013,7 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in now = time(NULL); tm = localtime(&now); - zbx_snprintf(replace_to, replace_to_len-1, "%.4d.%.2d.%.2d", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday); + replace_to = zbx_dsprintf(replace_to, "%.4d.%.2d.%.2d", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY)&& strncmp(pr, MVAR_TIME, strlen(MVAR_TIME)) == 0) @@ -1029,7 +1022,7 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in now = time(NULL); tm = localtime(&now); - zbx_snprintf(replace_to, replace_to_len, "%.2d:%.2d:%.2d",tm->tm_hour,tm->tm_min,tm->tm_sec); + replace_to = zbx_dsprintf(replace_to, "%.2d:%.2d:%.2d",tm->tm_hour,tm->tm_min,tm->tm_sec); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && @@ -1038,10 +1031,8 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in /* NOTE: if you make changes for this bloc, don't forgot MVAR_TRIGGER_STATUS_OLD block */ var_len = strlen(MVAR_TRIGGER_STATUS); - if(event->value == TRIGGER_VALUE_TRUE) - zbx_snprintf(replace_to, replace_to_len, "OFF"); - else - zbx_snprintf(replace_to, replace_to_len, "ON"); + replace_to = zbx_dsprintf(replace_to, "%s", + event->value == TRIGGER_VALUE_TRUE ? "OFF" : "ON"); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_TRIGGER_STATUS_OLD, strlen(MVAR_TRIGGER_STATUS_OLD)) == 0) @@ -1049,10 +1040,8 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in /* NOTE: if you make changes for this bloc, don't forgot MVAR_TRIGGER_STATUS block */ var_len = strlen(MVAR_TRIGGER_STATUS_OLD); - if(event->value == TRIGGER_VALUE_TRUE) - zbx_snprintf(replace_to, replace_to_len, "OFF"); - else - zbx_snprintf(replace_to, replace_to_len, "ON"); + replace_to = zbx_dsprintf(replace_to, "%s", + event->value == TRIGGER_VALUE_TRUE ? "OFF" : "ON"); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_TRIGGER_ID, strlen(MVAR_TRIGGER_ID)) == 0) @@ -1060,7 +1049,7 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in /* NOTE: if you make changes for this bloc, don't forgot MVAR_TRIGGER_STATUS block */ var_len = strlen(MVAR_TRIGGER_ID); - zbx_snprintf(replace_to, replace_to_len, ZBX_FS_UI64, event->triggerid); + replace_to = zbx_dsprintf(replace_to, ZBX_FS_UI64, event->triggerid); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_TRIGGER_URL, strlen(MVAR_TRIGGER_URL)) == 0) @@ -1068,7 +1057,7 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in /* NOTE: if you make changes for this bloc, don't forgot MVAR_TRIGGER_STATUS block */ var_len = strlen(MVAR_TRIGGER_URL); - zbx_snprintf(replace_to, replace_to_len, "%s", event->trigger_url); + replace_to = zbx_dsprintf(replace_to, "%s", event->trigger_url); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_EVENT_ID, strlen(MVAR_EVENT_ID)) == 0) @@ -1076,33 +1065,34 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in /* NOTE: if you make changes for this bloc, don't forgot MVAR_TRIGGER_STATUS block */ var_len = strlen(MVAR_EVENT_ID); - zbx_snprintf(replace_to, replace_to_len, ZBX_FS_UI64, event->eventid); + replace_to = zbx_dsprintf(replace_to, ZBX_FS_UI64, event->eventid); } else if(macro_type & (MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY) && strncmp(pr, MVAR_TRIGGER_SEVERITY, strlen(MVAR_TRIGGER_SEVERITY)) == 0) { var_len = strlen(MVAR_TRIGGER_SEVERITY); - if(event->trigger_priority == 0) zbx_snprintf(replace_to, replace_to_len, "Not classified"); - else if(event->trigger_priority == 1) zbx_snprintf(replace_to, replace_to_len, "Information"); - else if(event->trigger_priority == 2) zbx_snprintf(replace_to, replace_to_len, "Warning"); - else if(event->trigger_priority == 3) zbx_snprintf(replace_to, replace_to_len, "Average"); - else if(event->trigger_priority == 4) zbx_snprintf(replace_to, replace_to_len, "High"); - else if(event->trigger_priority == 5) zbx_snprintf(replace_to, replace_to_len, "Disaster"); - else zbx_snprintf(replace_to, replace_to_len, "Unknown"); + if(event->trigger_priority == 0) replace_to = zbx_dsprintf(replace_to, "Not classified"); + else if(event->trigger_priority == 1) replace_to = zbx_dsprintf(replace_to, "Information"); + else if(event->trigger_priority == 2) replace_to = zbx_dsprintf(replace_to, "Warning"); + else if(event->trigger_priority == 3) replace_to = zbx_dsprintf(replace_to, "Average"); + else if(event->trigger_priority == 4) replace_to = zbx_dsprintf(replace_to, "High"); + else if(event->trigger_priority == 5) replace_to = zbx_dsprintf(replace_to, "Disaster"); + else replace_to = zbx_dsprintf(replace_to, "Unknown"); } - str_out_fill = zbx_strlcat(str_out, replace_to, str_out_len); + str_out = zbx_strdcat(str_out, replace_to); pl = pr + var_len; + + zbx_free(replace_to); } - str_out_fill = zbx_strlcat(str_out, pl, str_out_len); + str_out = zbx_strdcat(str_out, pl); - zbx_snprintf(data, data_max_len, "%s", str_out); + zbx_free(*data); - zbx_free(str_out); - zbx_free(replace_to); + *data = str_out; - zabbix_log( LOG_LEVEL_DEBUG, "Result expression [%s]", data ); + zabbix_log( LOG_LEVEL_DEBUG, "Result expression [%s]", *data ); } /****************************************************************************** @@ -1113,7 +1103,6 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in * * * Parameters: trigger - trigger structure * * action - action structure * - * data_max_len - max length of data string,include '\0' * * data - data string * * * * Return value: * @@ -1123,7 +1112,7 @@ void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char *data, in * Comments: example: "{127.0.0.1:system[procload].last(0)}" to "1.34" * * * ******************************************************************************/ -void substitute_macros(DB_EVENT *event, DB_ACTION *action, char *data, int data_max_len) +void substitute_macros(DB_EVENT *event, DB_ACTION *action, char **data) { char *str_out = NULL, @@ -1139,26 +1128,16 @@ void substitute_macros(DB_EVENT *event, DB_ACTION *action, char *data, int data_ function[MAX_STRING_LEN], parameter[MAX_STRING_LEN]; - int - replace_to_len, - str_out_len, - str_out_fill, - var_len; + if(!data || !*data) return; - zabbix_log(LOG_LEVEL_DEBUG, "In substitute_macros([%s])",data); - - substitute_simple_macros(event, action, data, data_max_len, MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY); - - replace_to_len = strlen(data); - replace_to = zbx_malloc(replace_to_len); - - str_out_fill = 0; - str_out_len = strlen(data) * 3 / 2 + 1; - str_out = zbx_malloc(str_out_len + 1); - *str_out = '\0'; + zabbix_log(LOG_LEVEL_DEBUG, "In substitute_macros([%s])",*data); + + if('\0' == *data[0]) return; - pl = data; - while((pr = strchr(pl, '{')) && str_out_fill < str_out_len) + substitute_simple_macros(event, action, data, MACRO_TYPE_MESSAGE_SUBJECT | MACRO_TYPE_MESSAGE_BODY); + + pl = *data; + while((pr = strchr(pl, '{'))) { if((pme = strchr(pr, '}')) == NULL) break; @@ -1169,15 +1148,15 @@ void substitute_macros(DB_EVENT *event, DB_ACTION *action, char *data, int data_ /* copy left side */ pr[0] = '\0'; - str_out_fill = zbx_strlcat(str_out, pl, str_out_len); + str_out = zbx_strdcat(str_out, pl); pr[0] = '{'; /* copy original name of variable */ - zbx_snprintf(replace_to, replace_to_len, "%s}", pr); /* in format used '}' */ + replace_to = zbx_dsprintf(replace_to, "%s}", pr); /* in format used '}' */ /* cose in 'pr' string symbol '}' is changed to '\0' by 'pme'*/ - var_len = strlen(replace_to); - + pl = pr + strlen(replace_to); + pms = pr + 1; if(NULL != (p = strchr(pms, ':'))) @@ -1205,8 +1184,12 @@ void substitute_macros(DB_EVENT *event, DB_ACTION *action, char *data, int data_ *p = ')'; pms = p + 1; + /* function 'evaluate_FUNCTION2' require 'replace_to' with size 'MAX_STRING_LEN' */ + zbx_free(replace_to); + replace_to = zbx_malloc(MAX_STRING_LEN); + if(evaluate_FUNCTION2(replace_to,host,key,function,parameter) != SUCCEED) - zbx_snprintf(replace_to, replace_to_len, "%s", STR_UNKNOWN_VARIABLE); + zbx_snprintf(replace_to, MAX_STRING_LEN, "%s", STR_UNKNOWN_VARIABLE); } } } @@ -1214,17 +1197,16 @@ void substitute_macros(DB_EVENT *event, DB_ACTION *action, char *data, int data_ } pme[0] = '}'; - str_out_fill = zbx_strlcat(str_out, replace_to, str_out_len); - pl = pr + var_len; + str_out = zbx_strdcat(str_out, replace_to); + zbx_free(replace_to); } - str_out_fill = zbx_strlcat(str_out, pl, str_out_len); + str_out = zbx_strdcat(str_out, pl); - zbx_snprintf(data, data_max_len, "%s", str_out); + zbx_free(*data); - zbx_free(str_out); - zbx_free(replace_to); + *data = str_out; - zabbix_log( LOG_LEVEL_DEBUG, "Result expression:%s", data ); + zabbix_log( LOG_LEVEL_DEBUG, "Result expression:%s", *data ); } /****************************************************************************** diff --git a/src/zabbix_server/expression.h b/src/zabbix_server/expression.h index 5c187f26..921b5ad6 100644 --- a/src/zabbix_server/expression.h +++ b/src/zabbix_server/expression.h @@ -27,8 +27,7 @@ int cmp_double(double a,double b); int find_char(char *str,char c); int evaluate_expression(int *result,char *expression, char *error, int maxerrlen); -//void substitute_macros(DB_TRIGGER *trigger, DB_ACTION *action, char *data, int dala_max_len); -void substitute_macros(DB_EVENT *event, DB_ACTION *action, char *data, int dala_max_len); +void substitute_macros(DB_EVENT *event, DB_ACTION *action, char **data); int evaluate_expression (int *result,char *expression,char *error,int maxerrlen); void delete_reol(char *c); @@ -36,7 +35,6 @@ void delete_reol(char *c); #define MACRO_TYPE_MESSAGE_SUBJECT 2 #define MACRO_TYPE_MESSAGE_BODY 4 -//void substitute_simple_macros(DB_TRIGGER *trigger, DB_ACTION *action, char *data, int dala_max_len, int macro_type); -void substitute_simple_macros(DB_EVENT *trigger, DB_ACTION *action, char *data, int dala_max_len, int macro_type); +void substitute_simple_macros(DB_EVENT *event, DB_ACTION *action, char **data, int macro_type); #endif diff --git a/src/zabbix_server/functions.c b/src/zabbix_server/functions.c index 8d3c0186..df5014c9 100644 --- a/src/zabbix_server/functions.c +++ b/src/zabbix_server/functions.c @@ -50,8 +50,6 @@ #include "functions.h" #include "expression.h" -extern int autoregister(char *server); - /****************************************************************************** * * * Function: update_functions * @@ -280,7 +278,6 @@ void update_triggers(zbx_uint64_t itemid) char exp[MAX_STRING_LEN]; char error[MAX_STRING_LEN]; int exp_value; - time_t now; DB_TRIGGER trigger; DB_RESULT result; DB_ROW row; @@ -292,26 +289,27 @@ void update_triggers(zbx_uint64_t itemid) while((row=DBfetch(result))) { ZBX_STR2UINT64(trigger.triggerid,row[0]); -// trigger.triggerid=atoi(row[0]); strscpy(trigger.expression,row[1]); - trigger.status=atoi(row[2]); - trigger.priority=atoi(row[4]); - trigger.value=atoi(row[5]); strscpy(trigger.description,row[6]); - - strscpy(exp, trigger.expression); + trigger.status = atoi(row[2]); + trigger.priority = atoi(row[4]); + trigger.value = atoi(row[5]); + trigger.url = row[6]; + trigger.comments = row[7]; + + /* NOTE: function 'evaluate_expression' require 'exp' with 'MAX_STRING_LEN' length*/ + memset(exp, 0, MAX_STRING_LEN); + zbx_strlcpy(exp, trigger.expression, MAX_STRING_LEN-1); if( evaluate_expression(&exp_value, exp, error, sizeof(error)) != 0 ) { zabbix_log( LOG_LEVEL_WARNING, "Expression [%s] cannot be evaluated [%s]",trigger.expression, error); zabbix_syslog("Expression [%s] cannot be evaluated [%s]",trigger.expression, error); -/* We shouldn't update triggervalue if expressions failed */ -/* now = time(NULL); - DBupdate_trigger_value(&trigger, exp_value, now, error);*/ - continue; +/* DBupdate_trigger_value(&trigger, exp_value, time(NULL), error);*//* We shouldn't update triggervalue if expressions failed */ + } + else + { + DBupdate_trigger_value(&trigger, exp_value, time(NULL), NULL); } - - now = time(NULL); - DBupdate_trigger_value(&trigger, exp_value, now, NULL); } DBfree_result(result); zabbix_log( LOG_LEVEL_DEBUG, "End of update_triggers [%d]", itemid); diff --git a/src/zabbix_server/nodewatcher/events.c b/src/zabbix_server/nodewatcher/events.c index c83782f3..50590909 100644 --- a/src/zabbix_server/nodewatcher/events.c +++ b/src/zabbix_server/nodewatcher/events.c @@ -56,8 +56,6 @@ #define ZBX_NODE_MASTER 0 #define ZBX_NODE_SLAVE 1 -extern int CONFIG_NODEID; - /****************************************************************************** * * * Function: process_node * diff --git a/src/zabbix_server/nodewatcher/history.c b/src/zabbix_server/nodewatcher/history.c index 5076cb56..ab541781 100644 --- a/src/zabbix_server/nodewatcher/history.c +++ b/src/zabbix_server/nodewatcher/history.c @@ -53,8 +53,6 @@ #include "nodesender.h" #include "history.h" -extern int CONFIG_NODEID; - /****************************************************************************** * * * Function: process_node_history_str * diff --git a/src/zabbix_server/nodewatcher/nodecomms.c b/src/zabbix_server/nodewatcher/nodecomms.c index 1162339e..6d2e3d40 100644 --- a/src/zabbix_server/nodewatcher/nodecomms.c +++ b/src/zabbix_server/nodewatcher/nodecomms.c @@ -52,8 +52,6 @@ #include "nodecomms.h" -extern int CONFIG_NODEID; - /****************************************************************************** * * * Function: send_to_node * diff --git a/src/zabbix_server/nodewatcher/nodesender.c b/src/zabbix_server/nodewatcher/nodesender.c index b852275d..a0ad4f10 100644 --- a/src/zabbix_server/nodewatcher/nodesender.c +++ b/src/zabbix_server/nodewatcher/nodesender.c @@ -56,8 +56,6 @@ #define ZBX_NODE_MASTER 0 #define ZBX_NODE_SLAVE 1 -extern int CONFIG_NODEID; - /****************************************************************************** * * * Function: send_config_data * diff --git a/src/zabbix_server/timer/timer.c b/src/zabbix_server/timer/timer.c index b2847a9b..e4d53563 100644 --- a/src/zabbix_server/timer/timer.c +++ b/src/zabbix_server/timer/timer.c @@ -44,9 +44,6 @@ #include "common.h" #include "timer.h" -extern void update_triggers(int itemid); -extern void update_functions(DB_ITEM *item); - /****************************************************************************** * * * Function: main_timer_loop * diff --git a/src/zabbix_server/trapper/nodeevents.c b/src/zabbix_server/trapper/nodeevents.c index f8610f34..7f81914e 100644 --- a/src/zabbix_server/trapper/nodeevents.c +++ b/src/zabbix_server/trapper/nodeevents.c @@ -43,8 +43,6 @@ #include "nodeevents.h" -extern int process_event(DB_EVENT *event); - /****************************************************************************** * * * Function: process_record * diff --git a/src/zabbix_server/trapper/nodehistory.c b/src/zabbix_server/trapper/nodehistory.c index 239d3367..9d2e85f8 100644 --- a/src/zabbix_server/trapper/nodehistory.c +++ b/src/zabbix_server/trapper/nodehistory.c @@ -43,8 +43,6 @@ #include "nodeevents.h" -extern int process_event(DB_EVENT *event); - /****************************************************************************** * * * Function: process_record * diff --git a/src/zabbix_server/trapper/trapper.c b/src/zabbix_server/trapper/trapper.c index 9a1648a4..ccbe6f33 100644 --- a/src/zabbix_server/trapper/trapper.c +++ b/src/zabbix_server/trapper/trapper.c @@ -58,8 +58,6 @@ #include "daemon.h" -extern int send_list_of_active_checks(zbx_sock_t *sock, char *host); - int process_trap(zbx_sock_t *sock,char *s, int max_len) { char *p,*line,*host; diff --git a/src/zabbix_server/zlog.c b/src/zabbix_server/zlog.c index 84579e8f..ed228ed4 100644 --- a/src/zabbix_server/zlog.c +++ b/src/zabbix_server/zlog.c @@ -34,8 +34,6 @@ #include "log.h" #include "zlog.h" -extern int CONFIG_NODEID; - /****************************************************************************** * * * Function: zabbix_syslog * |