summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2005-10-03 17:21:57 +0000
committerhugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2005-10-03 17:21:57 +0000
commitea3a915cd2ee5031fcd779724a4e42be08e5d2b7 (patch)
treef1fa44775c1d8533f510c6387f3bb17561879094 /src
parenta9829831e0b9fb432aa0ed827a5c4cba56cbcdef (diff)
downloadzabbix-ea3a915cd2ee5031fcd779724a4e42be08e5d2b7.tar.gz
zabbix-ea3a915cd2ee5031fcd779724a4e42be08e5d2b7.tar.xz
zabbix-ea3a915cd2ee5031fcd779724a4e42be08e5d2b7.zip
Minor changes.
git-svn-id: svn://svn.zabbix.com/trunk@2095 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src')
-rw-r--r--src/libs/zbxdbhigh/host.c1447
-rw-r--r--src/zabbix_server/trapper/autoregister.c9
2 files changed, 1456 insertions, 0 deletions
diff --git a/src/libs/zbxdbhigh/host.c b/src/libs/zbxdbhigh/host.c
new file mode 100644
index 00000000..19e7feb3
--- /dev/null
+++ b/src/libs/zbxdbhigh/host.c
@@ -0,0 +1,1447 @@
+/*
+** ZABBIX
+** Copyright (C) 2000-2005 SIA Zabbix
+**
+** 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+**/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/* for setproctitle() */
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <string.h>
+#include <strings.h>
+
+#include "db.h"
+#include "log.h"
+#include "zlog.h"
+#include "common.h"
+
+
+int add_new_host(server, 10050, HOST_STATUS_MONITORED, 0, "", 0, HOST_AVAILABLE_UNKNOWN)
+{
+$sql="insert into hosts (host,port,status,useip,ip,disable_until,available) values ('$host',$port,$status,$use
+ip,'$ip',0,".HOST_AVAILABLE_UNKNOWN.")";
+}
+
+
+
+
+
+
+
+void DBclose(void)
+{
+#ifdef HAVE_MYSQL
+ mysql_close(&mysql);
+#endif
+#ifdef HAVE_PGSQL
+ PQfinish(conn);
+#endif
+}
+
+/*
+ * Connect to the database.
+ * If fails, program terminates.
+ */
+void DBconnect(void)
+{
+ for(;;)
+ {
+ /* zabbix_log(LOG_LEVEL_ERR, "[%s] [%s] [%s]\n",dbname, dbuser, dbpassword ); */
+#ifdef HAVE_MYSQL
+ /* For MySQL >3.22.00 */
+ /* if( ! mysql_connect( &mysql, NULL, dbuser, dbpassword ) )*/
+ mysql_init(&mysql);
+ if( ! mysql_real_connect( &mysql, CONFIG_DBHOST, CONFIG_DBUSER, CONFIG_DBPASSWORD, CONFIG_DBNAME, CONFIG_DBPORT, CONFIG_DBSOCKET,0 ) )
+ {
+ fprintf(stderr, "Failed to connect to database: Error: %s\n",mysql_error(&mysql) );
+ zabbix_log(LOG_LEVEL_ERR, "Failed to connect to database: Error: %s",mysql_error(&mysql) );
+ if( (ER_SERVER_SHUTDOWN != mysql_errno(&mysql)) && (CR_SERVER_GONE_ERROR != mysql_errno(&mysql)))
+ {
+ exit(FAIL);
+ }
+ }
+ else
+ {
+ if( mysql_select_db( &mysql, CONFIG_DBNAME ) != 0 )
+
+ {
+ fprintf(stderr, "Failed to select database: Error: %s\n",mysql_error(&mysql) );
+ zabbix_log(LOG_LEVEL_ERR, "Failed to select database: Error: %s",mysql_error(&mysql) );
+ exit( FAIL );
+ }
+ else
+ {
+ break;
+ }
+ }
+#endif
+#ifdef HAVE_PGSQL
+/* conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName); */
+/* conn = PQsetdb(NULL, NULL, NULL, NULL, dbname);*/
+ conn = PQsetdbLogin(CONFIG_DBHOST, NULL, NULL, NULL, CONFIG_DBNAME, CONFIG_DBUSER, CONFIG_DBPASSWORD );
+
+/* check to see that the backend connection was successfully made */
+ if (PQstatus(conn) != CONNECTION_OK)
+ {
+ fprintf(stderr, "Connection to database '%s' failed.\n", CONFIG_DBNAME);
+ zabbix_log(LOG_LEVEL_ERR, "Connection to database '%s' failed.\n", CONFIG_DBNAME);
+ fprintf(stderr, "%s\n", PQerrorMessage(conn));
+ zabbix_log(LOG_LEVEL_ERR, "%s", PQerrorMessage(conn));
+ exit(FAIL);
+ }
+ else
+ {
+ break;
+ }
+#endif
+ fprintf(stderr, "Will retry to connect to the database after 30 seconds\n");
+ zabbix_log(LOG_LEVEL_ERR, "Will retry to connect to the database after 30 seconds");
+ sleep(30);
+ }
+}
+
+/*
+ * Execute SQL statement. For non-select statements only.
+ * If fails, program terminates.
+ */
+int DBexecute(char *query)
+{
+/* Do not include any code here. Will break HAVE_PGSQL section */
+#ifdef HAVE_MYSQL
+ zabbix_log( LOG_LEVEL_DEBUG, "Executing query:%s",query);
+ while( mysql_query(&mysql,query) != 0)
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",query);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed:%s [%d]", mysql_error(&mysql), mysql_errno(&mysql) );
+ if( (ER_SERVER_SHUTDOWN != mysql_errno(&mysql)) && (CR_SERVER_GONE_ERROR != mysql_errno(&mysql)))
+ {
+ return FAIL;
+ }
+ sleep(30);
+ }
+#endif
+#ifdef HAVE_PGSQL
+ PGresult *result;
+
+ zabbix_log( LOG_LEVEL_DEBUG, "Executing query:%s",query);
+ result = PQexec(conn,query);
+
+ if( result==NULL)
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",query);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", "Result is NULL" );
+ PQclear(result);
+ return FAIL;
+ }
+ if( PQresultStatus(result) != PGRES_COMMAND_OK)
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",query);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", PQresStatus(PQresultStatus(result)) );
+ PQclear(result);
+ return FAIL;
+ }
+ PQclear(result);
+#endif
+/* zabbix_set_log_level(LOG_LEVEL_WARNING);*/
+ return SUCCEED;
+}
+
+/*
+ * Execute SQL statement. For select statements only.
+ * If fails, program terminates.
+ */
+DB_RESULT *DBselect(char *query)
+{
+/* Do not include any code here. Will break HAVE_PGSQL section */
+#ifdef HAVE_MYSQL
+ zabbix_log( LOG_LEVEL_DEBUG, "Executing query:%s",query);
+ while(mysql_query(&mysql,query) != 0)
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",query);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed:%s [%d]", mysql_error(&mysql), mysql_errno(&mysql) );
+ if( (ER_SERVER_SHUTDOWN != mysql_errno(&mysql)) && (CR_SERVER_GONE_ERROR != mysql_errno(&mysql)))
+ {
+ exit(FAIL);
+ }
+ sleep(30);
+ }
+/* zabbix_set_log_level(LOG_LEVEL_WARNING);*/
+ return mysql_store_result(&mysql);
+#endif
+#ifdef HAVE_PGSQL
+ PGresult *result;
+
+ zabbix_log( LOG_LEVEL_DEBUG, "Executing query:%s",query);
+ result = PQexec(conn,query);
+
+ if( result==NULL)
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",query);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", "Result is NULL" );
+ exit( FAIL );
+ }
+ if( PQresultStatus(result) != PGRES_TUPLES_OK)
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Query::%s",query);
+ zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", PQresStatus(PQresultStatus(result)) );
+ exit( FAIL );
+ }
+ return result;
+#endif
+}
+
+/*
+ * 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_PGSQL
+ return PQgetvalue(result, rownum, fieldnum);
+#endif
+}
+
+/*
+ * Get value of autoincrement field for last insert or update statement
+ */
+int DBinsert_id()
+{
+#ifdef HAVE_MYSQL
+ zabbix_log(LOG_LEVEL_DEBUG, "In DBinsert_id()" );
+ return mysql_insert_id(&mysql);
+#endif
+#ifdef HAVE_PGSQL
+#error SUPPORT OF POSTGRESQL NOT IMPLEMENTED YET
+#endif
+}
+
+/*
+ * Returs number of affected rows of last select, update, delete or replace
+ */
+long DBaffected_rows()
+{
+#ifdef HAVE_MYSQL
+ /* It actually returns my_ulonglong */
+ return (long)mysql_affected_rows(&mysql);
+#endif
+#ifdef HAVE_PGSQL
+ NOT IMPLEMENTED YET
+#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_PGSQL
+ zabbix_log(LOG_LEVEL_DEBUG, "In DBnum_rows");
+ return PQntuples(result);
+#endif
+}
+
+/*
+ * Get function value.
+ */
+int DBget_function_result(double *result,char *functionid)
+{
+ DB_RESULT *dbresult;
+ int res = SUCCEED;
+
+ char sql[MAX_STRING_LEN];
+
+/* 0 is added to distinguish between lastvalue==NULL and empty result */
+ snprintf( sql, sizeof(sql)-1, "select 0,lastvalue from functions where functionid=%s", functionid );
+ dbresult = DBselect(sql);
+
+ if(DBnum_rows(dbresult) == 0)
+ {
+ zabbix_log(LOG_LEVEL_WARNING, "No function for functionid:[%s]", functionid );
+ zabbix_syslog("No function for functionid:[%s]", functionid );
+ res = FAIL;
+ }
+ else if(DBget_field(dbresult,0,1) == NULL)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "function.lastvalue==NULL [%s]", functionid );
+ res = FAIL;
+ }
+ else
+ {
+ *result=atof(DBget_field(dbresult,0,1));
+ }
+ DBfree_result(dbresult);
+
+ return res;
+}
+
+/* Returns previous trigger value. If not value found, return TRIGGER_VALUE_FALSE */
+int DBget_prev_trigger_value(int triggerid)
+{
+ char sql[MAX_STRING_LEN];
+ int clock;
+ int value;
+
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_prev_trigger_value[%d]", triggerid);
+
+ snprintf(sql,sizeof(sql)-1,"select max(clock) from alarms where triggerid=%d",triggerid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" );
+ DBfree_result(result);
+ return TRIGGER_VALUE_UNKNOWN;
+ }
+ clock=atoi(DBget_field(result,0,0));
+ DBfree_result(result);
+
+ snprintf(sql,sizeof(sql),"select max(clock) from alarms where triggerid=%d and clock<%d",triggerid,clock);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" );
+ DBfree_result(result);
+/* Assume that initially Trigger value is False. Otherwise alarms will not be generated when
+status changes to TRUE for te first time */
+ return TRIGGER_VALUE_FALSE;
+/* return TRIGGER_VALUE_UNKNOWN;*/
+ }
+ clock=atoi(DBget_field(result,0,0));
+ DBfree_result(result);
+
+ snprintf(sql,sizeof(sql)-1,"select value from alarms where triggerid=%d and clock=%d",triggerid,clock);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "Result of [%s] is empty", sql );
+ DBfree_result(result);
+ return TRIGGER_VALUE_UNKNOWN;
+ }
+ value=atoi(DBget_field(result,0,0));
+ DBfree_result(result);
+
+ return value;
+}
+
+/* SUCCEED if latest alarm with triggerid has this status */
+/* Rewrite required to simplify logic ?*/
+int latest_alarm(int triggerid, int status)
+{
+ char sql[MAX_STRING_LEN];
+ int clock;
+ DB_RESULT *result;
+ int ret = FAIL;
+
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In latest_alarm()");
+
+ snprintf(sql,sizeof(sql)-1,"select max(clock) from alarms where triggerid=%d",triggerid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" );
+ ret = FAIL;
+ }
+ else
+ {
+ clock=atoi(DBget_field(result,0,0));
+ DBfree_result(result);
+
+ snprintf(sql,sizeof(sql)-1,"select value from alarms where triggerid=%d and clock=%d",triggerid,clock);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+ if(DBnum_rows(result)==1)
+ {
+ if(atoi(DBget_field(result,0,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(int serviceid, int status)
+{
+ char sql[MAX_STRING_LEN];
+ int clock;
+ DB_RESULT *result;
+ int ret = FAIL;
+
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In latest_service_alarm()");
+
+ snprintf(sql,sizeof(sql)-1,"select max(clock) from service_alarms where serviceid=%d",serviceid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" );
+ ret = FAIL;
+ }
+ else
+ {
+ clock=atoi(DBget_field(result,0,0));
+ DBfree_result(result);
+
+ snprintf(sql,sizeof(sql)-1,"select value from service_alarms where serviceid=%d and clock=%d",serviceid,clock);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+ if(DBnum_rows(result)==1)
+ {
+ if(atoi(DBget_field(result,0,0)) == status)
+ {
+ ret = SUCCEED;
+ }
+ }
+ }
+
+ DBfree_result(result);
+
+ return ret;
+}
+
+/* Returns alarmid or 0 */
+int add_alarm(int triggerid,int status,int clock,int *alarmid)
+{
+ char sql[MAX_STRING_LEN];
+
+ *alarmid=0;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_alarm(%d,%d,%d)",triggerid, status, *alarmid);
+
+ /* Latest alarm has the same status? */
+ if(latest_alarm(triggerid,status) == SUCCEED)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG,"Alarm for triggerid [%d] status [%d] already exists",triggerid,status);
+ return FAIL;
+ }
+
+ snprintf(sql,sizeof(sql)-1,"insert into alarms(triggerid,clock,value) values(%d,%d,%d)", triggerid, clock, status);
+ DBexecute(sql);
+
+ *alarmid=DBinsert_id();
+
+ /* Cancel currently active escalations */
+ if(status == TRIGGER_VALUE_FALSE || status == TRIGGER_VALUE_TRUE)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG,"Before SQL");
+ snprintf(sql,sizeof(sql)-1,"update escalation_log set status=1 where triggerid=%d and status=0", triggerid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ DBexecute(sql);
+ }
+
+ zabbix_log(LOG_LEVEL_DEBUG,"End of add_alarm()");
+
+ return SUCCEED;
+}
+
+int DBadd_service_alarm(int serviceid,int status,int clock)
+{
+ char sql[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_service_alarm()");
+
+ if(latest_service_alarm(serviceid,status) == SUCCEED)
+ {
+ return SUCCEED;
+ }
+
+ snprintf(sql,sizeof(sql)-1,"insert into service_alarms(serviceid,clock,value) values(%d,%d,%d)", serviceid, clock, status);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ DBexecute(sql);
+
+ zabbix_log(LOG_LEVEL_DEBUG,"End of add_service_alarm()");
+
+ return SUCCEED;
+}
+
+int DBupdate_trigger_value(DB_TRIGGER *trigger, int new_value, int now, char *reason)
+{
+ char sql[MAX_STRING_LEN];
+ int alarmid;
+ int ret = SUCCEED;
+
+ if(reason==NULL)
+ {
+ zabbix_log(LOG_LEVEL_DEBUG,"In update_trigger_value[%d,%d,%d]", trigger->triggerid, new_value, now);
+ }
+ else
+ {
+ zabbix_log(LOG_LEVEL_DEBUG,"In update_trigger_value[%d,%d,%d,%s]", trigger->triggerid, new_value, now, reason);
+ }
+
+ if(trigger->value != new_value)
+ {
+ trigger->prevvalue=DBget_prev_trigger_value(trigger->triggerid);
+ if(add_alarm(trigger->triggerid,new_value,now,&alarmid) == SUCCEED)
+ {
+ if(reason==NULL)
+ {
+ snprintf(sql,sizeof(sql)-1,"update triggers set value=%d,lastchange=%d,error='' where triggerid=%d",new_value,now,trigger->triggerid);
+ }
+ else
+ {
+ snprintf(sql,sizeof(sql)-1,"update triggers set value=%d,lastchange=%d,error='%s' where triggerid=%d",new_value,now,reason, trigger->triggerid);
+ }
+ DBexecute(sql);
+ if(TRIGGER_VALUE_UNKNOWN == new_value)
+ {
+ snprintf(sql,sizeof(sql)-1,"update functions set lastvalue=NULL where triggerid=%d",trigger->triggerid);
+ DBexecute(sql);
+ }
+ if( ((trigger->value == TRIGGER_VALUE_TRUE) && (new_value == TRIGGER_VALUE_FALSE)) ||
+ ((trigger->value == TRIGGER_VALUE_FALSE) && (new_value == TRIGGER_VALUE_TRUE)) ||
+ ((trigger->prevvalue == TRIGGER_VALUE_FALSE) && (trigger->value == TRIGGER_VALUE_UNKNOWN) && (new_value == TRIGGER_VALUE_TRUE)) ||
+ ((trigger->prevvalue == TRIGGER_VALUE_TRUE) && (trigger->value == TRIGGER_VALUE_UNKNOWN) && (new_value == TRIGGER_VALUE_FALSE)))
+ {
+ zabbix_log(LOG_LEVEL_DEBUG,"In update_trigger_value. Before apply_actions. Triggerid [%d]", trigger->triggerid);
+ apply_actions(trigger,alarmid,new_value);
+ if(new_value == TRIGGER_VALUE_TRUE)
+ {
+ update_services(trigger->triggerid, trigger->priority);
+ }
+ else
+ {
+ update_services(trigger->triggerid, 0);
+ }
+ }
+ }
+ else
+ {
+ zabbix_log(LOG_LEVEL_DEBUG,"Alarm not added for triggerid [%d]", trigger->triggerid);
+ ret = FAIL;
+ }
+ }
+ return ret;
+}
+
+/*
+int DBupdate_trigger_value(int triggerid,int value,int clock)
+{
+ char sql[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In update_trigger_value[%d,%d,%d]", triggerid, value, clock);
+ add_alarm(triggerid,value,clock);
+
+ snprintf(sql,sizeof(sql)-1,"update triggers set value=%d,lastchange=%d where triggerid=%d",value,clock,triggerid);
+ DBexecute(sql);
+
+ if(TRIGGER_VALUE_UNKNOWN == value)
+ {
+ snprintf(sql,sizeof(sql)-1,"update functions set lastvalue=NULL where triggerid=%d",triggerid);
+ DBexecute(sql);
+ }
+
+ zabbix_log(LOG_LEVEL_DEBUG,"End of update_trigger_value()");
+ return SUCCEED;
+}
+*/
+
+void update_triggers_status_to_unknown(int hostid,int clock,char *reason)
+{
+ int i;
+ char sql[MAX_STRING_LEN];
+
+ DB_RESULT *result;
+ DB_TRIGGER trigger;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In update_triggers_status_to_unknown()");
+
+/* snprintf(sql,sizeof(sql)-1,"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);*/
+ snprintf(sql,sizeof(sql)-1,"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 h.hostid=%d and i.key_ not in ('%s','%s','%s')",hostid,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ for(i=0;i<DBnum_rows(result);i++)
+ {
+ trigger.triggerid=atoi(DBget_field(result,i,0));
+ trigger.value=atoi(DBget_field(result,i,1));
+ DBupdate_trigger_value(&trigger,TRIGGER_VALUE_UNKNOWN,clock,reason);
+ }
+
+ DBfree_result(result);
+ zabbix_log(LOG_LEVEL_DEBUG,"End of update_triggers_status_to_unknown()");
+
+ return;
+}
+
+void DBdelete_service(int serviceid)
+{
+ char sql[MAX_STRING_LEN];
+
+ snprintf(sql,sizeof(sql)-1,"delete from services_links where servicedownid=%d or serviceupid=%d", serviceid, serviceid);
+ DBexecute(sql);
+ snprintf(sql,sizeof(sql)-1,"delete from services where serviceid=%d", serviceid);
+ DBexecute(sql);
+}
+
+void DBdelete_services_by_triggerid(int triggerid)
+{
+ int i, serviceid;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBdelete_services_by_triggerid(%d)", triggerid);
+ snprintf(sql,sizeof(sql)-1,"select serviceid from services where triggerid=%d", triggerid);
+ result = DBselect(sql);
+
+ for(i=0;i<DBnum_rows(result);i++)
+ {
+ serviceid=atoi(DBget_field(result,i,0));
+ DBdelete_service(serviceid);
+ }
+ DBfree_result(result);
+
+ zabbix_log(LOG_LEVEL_DEBUG,"End of DBdelete_services_by_triggerid(%d)", triggerid);
+}
+
+void DBdelete_trigger(int triggerid)
+{
+ char sql[MAX_STRING_LEN];
+
+ snprintf(sql,sizeof(sql)-1,"delete from trigger_depends where triggerid_down=%d or triggerid_up=%d", triggerid, triggerid);
+ DBexecute(sql);
+ snprintf(sql,sizeof(sql)-1,"delete from functions where triggerid=%d", triggerid);
+ DBexecute(sql);
+ snprintf(sql,sizeof(sql)-1,"delete from alarms where triggerid=%d", triggerid);
+ DBexecute(sql);
+ snprintf(sql,sizeof(sql)-1,"delete from actions where triggerid=%d and scope=%d", triggerid, ACTION_SCOPE_TRIGGER);
+ DBexecute(sql);
+
+ DBdelete_services_by_triggerid(triggerid);
+
+ snprintf(sql,sizeof(sql)-1,"update sysmaps_links set triggerid=NULL where triggerid=%d", triggerid);
+ DBexecute(sql);
+ snprintf(sql,sizeof(sql)-1,"delete from triggers where triggerid=%d", triggerid);
+ DBexecute(sql);
+}
+
+void DBdelete_triggers_by_itemid(int itemid)
+{
+ int i, triggerid;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBdelete_triggers_by_itemid(%d)", itemid);
+ snprintf(sql,sizeof(sql)-1,"select triggerid from functions where itemid=%d", itemid);
+ result = DBselect(sql);
+
+ for(i=0;i<DBnum_rows(result);i++)
+ {
+ triggerid=atoi(DBget_field(result,i,0));
+ DBdelete_trigger(triggerid);
+ }
+ DBfree_result(result);
+
+ snprintf(sql,sizeof(sql)-1,"delete from functions where itemid=%d", itemid);
+ DBexecute(sql);
+
+ zabbix_log(LOG_LEVEL_DEBUG,"End of DBdelete_triggers_by_itemid(%d)", itemid);
+}
+
+void DBdelete_trends_by_itemid(int itemid)
+{
+ char sql[MAX_STRING_LEN];
+
+ snprintf(sql,sizeof(sql)-1,"delete from trends where itemid=%d", itemid);
+ DBexecute(sql);
+}
+
+void DBdelete_history_by_itemid(int itemid)
+{
+ char sql[MAX_STRING_LEN];
+
+ snprintf(sql,sizeof(sql)-1,"delete from history where itemid=%d", itemid);
+ DBexecute(sql);
+ snprintf(sql,sizeof(sql)-1,"delete from history_str where itemid=%d", itemid);
+ DBexecute(sql);
+}
+
+void DBdelete_sysmaps_links_by_shostid(int shostid)
+{
+ char sql[MAX_STRING_LEN];
+
+ snprintf(sql,sizeof(sql)-1,"delete from sysmaps_links where shostid1=%d or shostid2=%d", shostid, shostid);
+ DBexecute(sql);
+}
+
+void DBdelete_sysmaps_hosts_by_hostid(int hostid)
+{
+ int i, shostid;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBdelete_sysmaps_hosts(%d)", hostid);
+ snprintf(sql,sizeof(sql)-1,"select shostid from sysmaps_hosts where hostid=%d", hostid);
+ result = DBselect(sql);
+
+ for(i=0;i<DBnum_rows(result);i++)
+ {
+ shostid=atoi(DBget_field(result,i,0));
+ DBdelete_sysmaps_links_by_shostid(shostid);
+ }
+ DBfree_result(result);
+
+ snprintf(sql,sizeof(sql)-1,"delete from sysmaps_hosts where hostid=%d", hostid);
+ DBexecute(sql);
+}
+
+int DBdelete_history_pertial(int itemid)
+{
+ char sql[MAX_STRING_LEN];
+
+ snprintf(sql,sizeof(sql)-1,"delete from history where itemid=%d limit 500", itemid);
+ DBexecute(sql);
+
+ return DBaffected_rows();
+}
+
+void DBupdate_triggers_status_after_restart(void)
+{
+ int i;
+ char sql[MAX_STRING_LEN];
+ int lastchange;
+ int now;
+
+ DB_RESULT *result;
+ DB_RESULT *result2;
+ DB_TRIGGER trigger;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBupdate_triggers_after_restart()");
+
+ now=time(NULL);
+
+ snprintf(sql,sizeof(sql)-1,"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);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ for(i=0;i<DBnum_rows(result);i++)
+ {
+ trigger.triggerid=atoi(DBget_field(result,i,0));
+ trigger.value=atoi(DBget_field(result,i,1));
+
+ snprintf(sql,sizeof(sql)-1,"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);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result2 = DBselect(sql);
+ if( DBnum_rows(result2) == 0 )
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "No triggers to update (2)");
+ DBfree_result(result2);
+ continue;
+ }
+
+ lastchange=atoi(DBget_field(result2,0,0));
+ DBfree_result(result2);
+
+ DBupdate_trigger_value(&trigger,TRIGGER_VALUE_UNKNOWN,lastchange,"ZABBIX was down.");
+ }
+
+ DBfree_result(result);
+ zabbix_log(LOG_LEVEL_DEBUG,"End of DBupdate_triggers_after_restart()");
+
+ return;
+}
+
+void DBupdate_host_availability(int hostid,int available,int clock, char *error)
+{
+ DB_RESULT *result;
+ char sql[MAX_STRING_LEN];
+ char error_esc[MAX_STRING_LEN];
+ int disable_until;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In update_host_availability()");
+
+ DBescape_string(error,error_esc,MAX_STRING_LEN);
+
+ snprintf(sql,sizeof(sql)-1,"select available,disable_until from hosts where hostid=%d",hostid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot select host with hostid [%d]",hostid);
+ zabbix_syslog("Cannot select host with hostid [%d]",hostid);
+ DBfree_result(result);
+ return;
+ }
+
+ disable_until = atoi(DBget_field(result,0,1));
+
+ if(available == atoi(DBget_field(result,0,0)))
+ {
+ if((available==HOST_AVAILABLE_FALSE)
+ &&(clock+DELAY_ON_NETWORK_FAILURE>disable_until) )
+ {
+ }
+ else
+ {
+ zabbix_log(LOG_LEVEL_DEBUG, "Host already has availability [%d]",available);
+ DBfree_result(result);
+ return;
+ }
+ }
+
+ DBfree_result(result);
+
+ if(available==HOST_AVAILABLE_TRUE)
+ {
+ snprintf(sql,sizeof(sql)-1,"update hosts set available=%d where hostid=%d",HOST_AVAILABLE_TRUE,hostid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ DBexecute(sql);
+ }
+ else if(available==HOST_AVAILABLE_FALSE)
+ {
+ if(disable_until+DELAY_ON_NETWORK_FAILURE>clock)
+ {
+ snprintf(sql,sizeof(sql)-1,"update hosts set available=%d,disable_until=disable_until+%d,error='%s' where hostid=%d",HOST_AVAILABLE_FALSE,DELAY_ON_NETWORK_FAILURE,error_esc,hostid);
+ }
+ else
+ {
+ snprintf(sql,sizeof(sql)-1,"update hosts set available=%d,disable_until=%d,error='%s' where hostid=%d",HOST_AVAILABLE_FALSE,clock+DELAY_ON_NETWORK_FAILURE,error_esc,hostid);
+ }
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ DBexecute(sql);
+ }
+ else
+ {
+ zabbix_log( LOG_LEVEL_ERR, "Unknown host availability [%d] for hostid [%d]", available, hostid);
+ zabbix_syslog("Unknown host availability [%d] for hostid [%d]", available, hostid);
+ return;
+ }
+
+ update_triggers_status_to_unknown(hostid,clock,"Host is unavailable.");
+ zabbix_log(LOG_LEVEL_DEBUG,"End of update_host_availability()");
+
+ return;
+}
+
+int DBupdate_item_status_to_notsupported(int itemid, char *error)
+{
+ char sql[MAX_STRING_LEN];
+ char error_esc[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBupdate_item_status_to_notsupported()");
+
+ DBescape_string(error,error_esc,MAX_STRING_LEN);
+
+ snprintf(sql,sizeof(sql)-1,"update items set status=%d,error='%s' where itemid=%d",ITEM_STATUS_NOTSUPPORTED,error_esc,itemid);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ DBexecute(sql);
+
+ return SUCCEED;
+}
+
+int DBadd_trend(int itemid, double value, int clock)
+{
+ DB_RESULT *result;
+ char sql[MAX_STRING_LEN];
+ int hour;
+ int num;
+ double value_min, value_avg, value_max;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_trend()");
+
+ hour=clock-clock%3600;
+
+ snprintf(sql,sizeof(sql)-1,"select num,value_min,value_avg,value_max from trends where itemid=%d and clock=%d", itemid, hour);
+ zabbix_log(LOG_LEVEL_DEBUG,"SQL [%s]",sql);
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 1)
+ {
+ num=atoi(DBget_field(result,0,0));
+ value_min=atof(DBget_field(result,0,1));
+ value_avg=atof(DBget_field(result,0,2));
+ value_max=atof(DBget_field(result,0,3));
+ if(value<value_min) value_min=value;
+/* Unfortunate mistake... */
+/* if(value>value_avg) value_max=value;*/
+ if(value>value_max) value_max=value;
+ value_avg=(num*value_avg+value)/(num+1);
+ num++;
+ snprintf(sql,sizeof(sql)-1,"update trends set num=%d, value_min=%f, value_avg=%f, value_max=%f where itemid=%d and clock=%d", num, value_min, value_avg, value_max, itemid, hour);
+ }
+ else
+ {
+ snprintf(sql,sizeof(sql)-1,"insert into trends (clock,itemid,num,value_min,value_avg,value_max) values (%d,%d,%d,%f,%f,%f)", hour, itemid, 1, value, value, value);
+ }
+ DBexecute(sql);
+
+ DBfree_result(result);
+
+ return SUCCEED;
+}
+
+int DBadd_history(int itemid, double value, int clock)
+{
+ char sql[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_history()");
+
+ snprintf(sql,sizeof(sql)-1,"insert into history (clock,itemid,value) values (%d,%d,%f)",clock,itemid,value);
+ DBexecute(sql);
+
+ DBadd_trend(itemid, value, clock);
+
+ return SUCCEED;
+}
+
+int DBadd_history_str(int itemid, char *value, int clock)
+{
+ char sql[MAX_STRING_LEN];
+ char value_esc[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_history_str()");
+
+ DBescape_string(value,value_esc,MAX_STRING_LEN);
+ snprintf(sql,sizeof(sql)-1,"insert into history_str (clock,itemid,value) values (%d,%d,'%s')",clock,itemid,value_esc);
+ DBexecute(sql);
+
+ return SUCCEED;
+}
+
+int DBadd_history_log(int itemid, char *value, int clock, int timestamp,char *source, int severity)
+{
+ char sql[MAX_STRING_LEN];
+ char value_esc[MAX_STRING_LEN];
+ char source_esc[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_history_log()");
+
+ DBescape_string(value,value_esc,MAX_STRING_LEN);
+ DBescape_string(source,source_esc,MAX_STRING_LEN);
+ snprintf(sql,sizeof(sql)-1,"insert into history_log (clock,itemid,timestamp,value,source,severity) values (%d,%d,%d,'%s','%s',%d)",clock,itemid,timestamp,value_esc,source_esc,severity);
+ DBexecute(sql);
+
+ return SUCCEED;
+}
+
+
+int DBget_items_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_items_count()");
+
+ snprintf(sql,sizeof(sql)-1,"select count(*) from items");
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBget_triggers_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_triggers_count()");
+
+ snprintf(sql,sizeof(sql)-1,"select count(*) from triggers");
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBget_items_unsupported_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_items_unsupported_count()");
+
+ snprintf(sql,sizeof(sql)-1,"select count(*) from items where status=%d", ITEM_STATUS_NOTSUPPORTED);
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBget_history_str_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_history_str_count()");
+
+ snprintf(sql,sizeof(sql)-1,"select count(*) from history_str");
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBget_history_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_history_count()");
+
+ snprintf(sql,sizeof(sql)-1,"select count(*) from history");
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBget_trends_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_trends_count()");
+
+ snprintf(sql,sizeof(sql)-1,"select count(*) from trends");
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBget_queue_count(void)
+{
+ int res;
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+ int now;
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In DBget_queue_count()");
+
+ now=time(NULL);
+/* snprintf(sql,sizeof(sql)-1,"select count(*) from items i,hosts h where i.status=%d and i.type not in (%d) and h.status=%d and i.hostid=h.hostid and i.nextcheck<%d and i.key_<>'status'", ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, HOST_STATUS_MONITORED, now);*/
+ snprintf(sql,sizeof(sql)-1,"select count(*) from items i,hosts h where i.status=%d and i.type not in (%d) and ((h.status=%d and h.available!=%d) or (h.status=%d and h.available=%d and h.disable_until<=%d)) and i.hostid=h.hostid and i.nextcheck<%d and i.key_ not in ('%s','%s','%s','%s')", ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, now, now, SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY, SERVER_ZABBIXLOG_KEY);
+
+ result=DBselect(sql);
+
+ if(DBnum_rows(result) == 0)
+ {
+ zabbix_log(LOG_LEVEL_ERR, "Cannot execute query [%s]", sql);
+ zabbix_syslog("Cannot execute query [%s]", sql);
+ DBfree_result(result);
+ return 0;
+ }
+
+ res = atoi(DBget_field(result,0,0));
+
+ DBfree_result(result);
+
+ return res;
+}
+
+int DBadd_alert(int actionid, int mediatypeid, char *sendto, char *subject, char *message)
+{
+ int now;
+ char sql[MAX_STRING_LEN];
+ char sendto_esc[MAX_STRING_LEN];
+ char subject_esc[MAX_STRING_LEN];
+ char message_esc[MAX_STRING_LEN];
+
+ zabbix_log(LOG_LEVEL_DEBUG,"In add_alert()");
+
+ now = time(NULL);
+/* Does not work on PostgreSQL */
+/* snprintf(sql,sizeof(sql)-1,"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);*/
+ DBescape_string(sendto,sendto_esc,MAX_STRING_LEN);
+ DBescape_string(subject,subject_esc,MAX_STRING_LEN);
+ DBescape_string(message,message_esc,MAX_STRING_LEN);
+ snprintf(sql,sizeof(sql)-1,"insert into alerts (actionid,clock,mediatypeid,sendto,subject,message,status,retries) values (%d,%d,%d,'%s','%s','%s',0,0)",actionid,now,mediatypeid,sendto_esc,subject_esc,message_esc);
+ DBexecute(sql);
+
+ return SUCCEED;
+}
+
+void DBvacuum(void)
+{
+#ifdef HAVE_PGSQL
+ char *table_for_housekeeping[]={"services", "services_links", "graphs_items", "graphs", "sysmaps_links",
+ "sysmaps_hosts", "sysmaps", "config", "groups", "hosts_groups", "alerts",
+ "actions", "alarms", "functions", "history", "history_str", "hosts", "trends",
+ "items", "media", "media_type", "triggers", "trigger_depends", "users",
+ "sessions", "rights", "service_alarms", "profiles", "screens", "screens_items",
+ "stats",
+ NULL};
+
+ char sql[MAX_STRING_LEN];
+ char *table;
+ int i;
+#ifdef HAVE_FUNCTION_SETPROCTITLE
+ setproctitle("housekeeper [vacuum DB]");
+#endif
+ i=0;
+ while (NULL != (table = table_for_housekeeping[i++]))
+ {
+ snprintf(sql,sizeof(sql)-1,"vacuum analyze %s", table);
+ DBexecute(sql);
+ }
+#endif
+
+#ifdef HAVE_MYSQL
+ /* Nothing to do */
+#endif
+}
+
+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 DBget_item_from_db(DB_ITEM *item,DB_RESULT *result, int row)
+{
+ char *s;
+ int i;
+
+ i=row;
+
+ item->itemid=atoi(DBget_field(result,i,0));
+ item->key=DBget_field(result,i,1);
+ item->host=DBget_field(result,i,2);
+ item->port=atoi(DBget_field(result,i,3));
+ item->delay=atoi(DBget_field(result,i,4));
+ item->description=DBget_field(result,i,5);
+ item->nextcheck=atoi(DBget_field(result,i,6));
+ item->type=atoi(DBget_field(result,i,7));
+ item->snmp_community=DBget_field(result,i,8);
+ item->snmp_oid=DBget_field(result,i,9);
+ item->useip=atoi(DBget_field(result,i,10));
+ item->ip=DBget_field(result,i,11);
+ item->history=atoi(DBget_field(result,i,12));
+ s=DBget_field(result,i,13);
+ if(s==NULL)
+ {
+ item->lastvalue_null=1;
+ }
+ else
+ {
+ item->lastvalue_null=0;
+ item->lastvalue_str=s;
+ item->lastvalue=atof(s);
+ }
+ s=DBget_field(result,i,14);
+ if(s==NULL)
+ {
+ item->prevvalue_null=1;
+ }
+ else
+ {
+ item->prevvalue_null=0;
+ item->prevvalue_str=s;
+ item->prevvalue=atof(s);
+ }
+ item->hostid=atoi(DBget_field(result,i,15));
+ item->host_status=atoi(DBget_field(result,i,16));
+ item->value_type=atoi(DBget_field(result,i,17));
+
+ item->host_network_errors=atoi(DBget_field(result,i,18));
+ item->snmp_port=atoi(DBget_field(result,i,19));
+ item->delta=atoi(DBget_field(result,i,20));
+
+ s=DBget_field(result,i,21);
+ if(s==NULL)
+ {
+ item->prevorgvalue_null=1;
+ }
+ else
+ {
+ item->prevorgvalue_null=0;
+ item->prevorgvalue=atof(s);
+ }
+ s=DBget_field(result,i,22);
+ if(s==NULL)
+ {
+ item->lastclock=0;
+ }
+ else
+ {
+ item->lastclock=atoi(s);
+ }
+
+ item->units=DBget_field(result,i,23);
+ item->multiplier=atoi(DBget_field(result,i,24));
+
+ item->snmpv3_securityname = DBget_field(result,i,25);
+ item->snmpv3_securitylevel = atoi(DBget_field(result,i,26));
+ item->snmpv3_authpassphrase = DBget_field(result,i,27);
+ item->snmpv3_privpassphrase = DBget_field(result,i,28);
+ item->formula = DBget_field(result,i,29);
+ item->host_available=atoi(DBget_field(result,i,30));
+}
+
+int DBget_default_escalation_id()
+{
+ DB_RESULT *dbresult;
+ int res = SUCCEED;
+
+ char sql[MAX_STRING_LEN];
+
+/* 0 is added to distinguish between lastvalue==NULL and empty result */
+ snprintf( sql, sizeof(sql)-1, "select escalationid from escalations where dflt=1");
+ dbresult = DBselect(sql);
+
+ if(DBnum_rows(dbresult) == 0)
+ {
+ zabbix_log(LOG_LEVEL_WARNING, "No default escalation defined");
+ zabbix_syslog("No default escalation defined");
+ res = FAIL;
+ }
+ res = atoi(DBget_field(dbresult,0,0));
+ DBfree_result(dbresult);
+
+ return res;
+}
+
+/*-----------------------------------------------------------------------------
+ *
+ * Function : DBget_trigger_by_triggerid
+ *
+ * Purpose : get trigger data from DBby triggerid
+ *
+ * Parameters : triggerid - ID of the trigger
+ *
+ * Returns : SUCCEED - trigger data retrieved sucesfully
+ * FAIL - otherwise
+ *
+ * Author : Alexei Vladishev
+ *
+ * Comments :
+ *
+ ----------------------------------------------------------------------------*/
+int DBget_trigger_by_triggerid(int triggerid, DB_TRIGGER *trigger)
+{
+ char sql[MAX_STRING_LEN];
+ DB_RESULT *result;
+
+ int i;
+ int ret = SUCCEED;
+
+ zabbix_log( LOG_LEVEL_WARNING, "In DBget_trigger_by_triggerid [%d]", triggerid);
+ sleep(1);
+ zabbix_log( LOG_LEVEL_WARNING, "In DBget_trigger_by_triggerid [%d] Sizeoftrigger->description [%d]", triggerid,sizeof(trigger->description));
+
+ snprintf(sql,sizeof(sql)-1,"select triggerid,expression,status,priority,value,description from triggers where triggerid=%d", triggerid);
+
+ result = DBselect(sql);
+
+ if(DBnum_rows(result) == 1)
+ {
+ zabbix_log( LOG_LEVEL_WARNING, "Exp [%s][%s]", DBget_field(result,0,1), DBget_field(result,0,5));
+
+ trigger->triggerid=atoi(DBget_field(result,0,0));
+ strscpy(trigger->expression, DBget_field(result,0,1));
+ zabbix_log( LOG_LEVEL_WARNING, "Exp [%s][%s]", DBget_field(result,0,1), trigger->expression);
+
+ trigger->status=atoi(DBget_field(result,0,2));
+ trigger->priority=atoi(DBget_field(result,0,3));
+ trigger->value=atoi(DBget_field(result,0,4));
+ strscpy(trigger->description, DBget_field(result,0,5));
+ zabbix_log( LOG_LEVEL_WARNING, "Desc [%s][%s]", DBget_field(result,0,5), trigger->description);
+ }
+ else
+ {
+ ret = FAIL;
+ }
+
+ DBfree_result(result);
+
+ return ret;
+}
diff --git a/src/zabbix_server/trapper/autoregister.c b/src/zabbix_server/trapper/autoregister.c
index c2daf44d..0fd10007 100644
--- a/src/zabbix_server/trapper/autoregister.c
+++ b/src/zabbix_server/trapper/autoregister.c
@@ -97,3 +97,12 @@ int autoregister(char *server)
return ret;
}
+
+void register_new_host(server, hostid)
+{
+ int hostid;
+
+ hostid = add_new_host(server, 10050, HOST_STATUS_MONITORED, 0, "", 0, HOST_AVAILABLE_UNKNOWN);
+
+
+}