diff options
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/zabbix_server/Makefile.am | 6 | ||||
-rw-r--r-- | src/zabbix_server/Makefile.in | 17 | ||||
-rw-r--r-- | src/zabbix_server/poller/Makefile.am | 4 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_agent.c (renamed from src/zabbix_server/checks_agent.c) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_agent.h (renamed from src/zabbix_server/checks_agent.h) | 1 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_internal.c (renamed from src/zabbix_server/checks_internal.c) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_internal.h (renamed from src/zabbix_server/checks_internal.h) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_simple.c (renamed from src/zabbix_server/checks_simple.c) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_simple.h (renamed from src/zabbix_server/checks_simple.h) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_snmp.c (renamed from src/zabbix_server/checks_snmp.c) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/checks_snmp.h (renamed from src/zabbix_server/checks_snmp.h) | 0 | ||||
-rw-r--r-- | src/zabbix_server/poller/poller.c | 332 | ||||
-rw-r--r-- | src/zabbix_server/poller/poller.h | 31 | ||||
-rw-r--r-- | src/zabbix_server/server.c | 290 |
15 files changed, 385 insertions, 298 deletions
diff --git a/configure.in b/configure.in index 52d8bdc9..d573598d 100644 --- a/configure.in +++ b/configure.in @@ -776,7 +776,7 @@ AC_OUTPUT(Makefile src/Makefile src/libs/Makefile src/libs/zbxlog/Makefile src/l src/libs/zbxdbhigh/Makefile src/libs/zbxemail/Makefile src/libs/zbxsysinfo/Makefile \ src/zabbix_server/pinger/Makefile src/zabbix_server/escalator/Makefile src/zabbix_agent/Makefile \ src/zabbix_server/housekeeper/Makefile src/zabbix_server/alerter/Makefile src/zabbix_server/Makefile \ - src/zabbix_server/trapper/Makefile) + src/zabbix_server/trapper/Makefile src/zabbix_server/poller/Makefile) echo echo "***********************************************************" diff --git a/src/zabbix_server/Makefile.am b/src/zabbix_server/Makefile.am index 32f2d73b..14b0f65f 100644 --- a/src/zabbix_server/Makefile.am +++ b/src/zabbix_server/Makefile.am @@ -1,7 +1,7 @@ -SUBDIRS = alerter escalator housekeeper pinger trapper . +SUBDIRS = alerter escalator housekeeper pinger poller trapper . INCLUDES=-I@top_srcdir@/include @MYSQL_INCLUDE@ bin_PROGRAMS = zabbix_server -zabbix_server_SOURCES = checks_simple.c checks_snmp.c checks_agent.c checks_internal.c expression.c actions.c zlog.c functions.c server.c -zabbix_server_LDADD = ../libs/zbxsysinfo/libzbxsysinfo.a ../libs/zbxlog/libzbxlog.a ../libs/zbxpid/libzbxpid.a ../libs/zbxconf/libzbxconf.a ../libs/zbxdbhigh/libzbxdbhigh.a ../libs/zbxcrypto/libzbxcrypto.a ../libs/zbxnet/libzbxnet.a pinger/libzbxpinger.a escalator/libzbxescalator.a housekeeper/libzbxhousekeeper.a alerter/libzbxalerter.a trapper/libzbxtrapper.a ../libs/zbxemail/libzbxemail.a +zabbix_server_SOURCES = expression.c actions.c zlog.c functions.c server.c +zabbix_server_LDADD = ../libs/zbxsysinfo/libzbxsysinfo.a ../libs/zbxlog/libzbxlog.a ../libs/zbxpid/libzbxpid.a ../libs/zbxconf/libzbxconf.a ../libs/zbxdbhigh/libzbxdbhigh.a ../libs/zbxcrypto/libzbxcrypto.a ../libs/zbxnet/libzbxnet.a pinger/libzbxpinger.a poller/libzbxpoller.a escalator/libzbxescalator.a housekeeper/libzbxhousekeeper.a alerter/libzbxalerter.a trapper/libzbxtrapper.a ../libs/zbxemail/libzbxemail.a zabbix_server_LDFLAGS=@MYSQL_LFLAGS@ @PGSQL_LFLAGS@ diff --git a/src/zabbix_server/Makefile.in b/src/zabbix_server/Makefile.in index 2cb0321f..d782c16d 100644 --- a/src/zabbix_server/Makefile.in +++ b/src/zabbix_server/Makefile.in @@ -76,12 +76,12 @@ SNMP_INCLUDE = @SNMP_INCLUDE@ SNMP_LFLAGS = @SNMP_LFLAGS@ VERSION = @VERSION@ -SUBDIRS = alerter escalator housekeeper pinger trapper . +SUBDIRS = alerter escalator housekeeper pinger poller trapper . INCLUDES = -I@top_srcdir@/include @MYSQL_INCLUDE@ bin_PROGRAMS = zabbix_server -zabbix_server_SOURCES = checks_simple.c checks_snmp.c checks_agent.c checks_internal.c expression.c actions.c zlog.c functions.c server.c -zabbix_server_LDADD = ../libs/zbxsysinfo/libzbxsysinfo.a ../libs/zbxlog/libzbxlog.a ../libs/zbxpid/libzbxpid.a ../libs/zbxconf/libzbxconf.a ../libs/zbxdbhigh/libzbxdbhigh.a ../libs/zbxcrypto/libzbxcrypto.a ../libs/zbxnet/libzbxnet.a pinger/libzbxpinger.a escalator/libzbxescalator.a housekeeper/libzbxhousekeeper.a alerter/libzbxalerter.a trapper/libzbxtrapper.a ../libs/zbxemail/libzbxemail.a +zabbix_server_SOURCES = expression.c actions.c zlog.c functions.c server.c +zabbix_server_LDADD = ../libs/zbxsysinfo/libzbxsysinfo.a ../libs/zbxlog/libzbxlog.a ../libs/zbxpid/libzbxpid.a ../libs/zbxconf/libzbxconf.a ../libs/zbxdbhigh/libzbxdbhigh.a ../libs/zbxcrypto/libzbxcrypto.a ../libs/zbxnet/libzbxnet.a pinger/libzbxpinger.a poller/libzbxpoller.a escalator/libzbxescalator.a housekeeper/libzbxhousekeeper.a alerter/libzbxalerter.a trapper/libzbxtrapper.a ../libs/zbxemail/libzbxemail.a zabbix_server_LDFLAGS = @MYSQL_LFLAGS@ @PGSQL_LFLAGS@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = ../../include/config.h @@ -93,13 +93,13 @@ DEFS = @DEFS@ -I. -I$(srcdir) -I../../include CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ -zabbix_server_OBJECTS = checks_simple.o checks_snmp.o checks_agent.o \ -checks_internal.o expression.o actions.o zlog.o functions.o server.o +zabbix_server_OBJECTS = expression.o actions.o zlog.o functions.o \ +server.o zabbix_server_DEPENDENCIES = ../libs/zbxsysinfo/libzbxsysinfo.a \ ../libs/zbxlog/libzbxlog.a ../libs/zbxpid/libzbxpid.a \ ../libs/zbxconf/libzbxconf.a ../libs/zbxdbhigh/libzbxdbhigh.a \ ../libs/zbxcrypto/libzbxcrypto.a ../libs/zbxnet/libzbxnet.a \ -pinger/libzbxpinger.a escalator/libzbxescalator.a \ +pinger/libzbxpinger.a poller/libzbxpoller.a escalator/libzbxescalator.a \ housekeeper/libzbxhousekeeper.a alerter/libzbxalerter.a \ trapper/libzbxtrapper.a ../libs/zbxemail/libzbxemail.a CFLAGS = @CFLAGS@ @@ -113,9 +113,8 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) TAR = tar GZIP_ENV = --best -DEP_FILES = .deps/actions.P .deps/checks_agent.P \ -.deps/checks_internal.P .deps/checks_simple.P .deps/checks_snmp.P \ -.deps/expression.P .deps/functions.P .deps/server.P .deps/zlog.P +DEP_FILES = .deps/actions.P .deps/expression.P .deps/functions.P \ +.deps/server.P .deps/zlog.P SOURCES = $(zabbix_server_SOURCES) OBJECTS = $(zabbix_server_OBJECTS) diff --git a/src/zabbix_server/poller/Makefile.am b/src/zabbix_server/poller/Makefile.am new file mode 100644 index 00000000..3b342616 --- /dev/null +++ b/src/zabbix_server/poller/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS=. +INCLUDES=-I@top_srcdir@/include @MYSQL_INCLUDE@ +lib_LIBRARIES=libzbxpoller.a +libzbxpoller_a_SOURCES=checks_agent.c checks_internal.c checks_simple.c checks_snmp.c poller.c diff --git a/src/zabbix_server/checks_agent.c b/src/zabbix_server/poller/checks_agent.c index d279e1e4..d279e1e4 100644 --- a/src/zabbix_server/checks_agent.c +++ b/src/zabbix_server/poller/checks_agent.c diff --git a/src/zabbix_server/checks_agent.h b/src/zabbix_server/poller/checks_agent.h index 0d7bae18..2a7e9584 100644 --- a/src/zabbix_server/checks_agent.h +++ b/src/zabbix_server/poller/checks_agent.h @@ -38,7 +38,6 @@ #include "common.h" #include "db.h" #include "log.h" -#include "expression.h" extern int CONFIG_NOTIMEWAIT; diff --git a/src/zabbix_server/checks_internal.c b/src/zabbix_server/poller/checks_internal.c index a76a6f35..a76a6f35 100644 --- a/src/zabbix_server/checks_internal.c +++ b/src/zabbix_server/poller/checks_internal.c diff --git a/src/zabbix_server/checks_internal.h b/src/zabbix_server/poller/checks_internal.h index 469076bd..469076bd 100644 --- a/src/zabbix_server/checks_internal.h +++ b/src/zabbix_server/poller/checks_internal.h diff --git a/src/zabbix_server/checks_simple.c b/src/zabbix_server/poller/checks_simple.c index 8c687a48..8c687a48 100644 --- a/src/zabbix_server/checks_simple.c +++ b/src/zabbix_server/poller/checks_simple.c diff --git a/src/zabbix_server/checks_simple.h b/src/zabbix_server/poller/checks_simple.h index bb63ae3a..bb63ae3a 100644 --- a/src/zabbix_server/checks_simple.h +++ b/src/zabbix_server/poller/checks_simple.h diff --git a/src/zabbix_server/checks_snmp.c b/src/zabbix_server/poller/checks_snmp.c index 1d8c5bb3..1d8c5bb3 100644 --- a/src/zabbix_server/checks_snmp.c +++ b/src/zabbix_server/poller/checks_snmp.c diff --git a/src/zabbix_server/checks_snmp.h b/src/zabbix_server/poller/checks_snmp.h index 05269998..05269998 100644 --- a/src/zabbix_server/checks_snmp.h +++ b/src/zabbix_server/poller/checks_snmp.h diff --git a/src/zabbix_server/poller/poller.c b/src/zabbix_server/poller/poller.c new file mode 100644 index 00000000..caf4af64 --- /dev/null +++ b/src/zabbix_server/poller/poller.c @@ -0,0 +1,332 @@ +/* +** 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 "config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> + +#include <string.h> + + +/* Required for getpwuid */ +#include <pwd.h> + +#include <signal.h> +#include <errno.h> + +#include <time.h> +/* getopt() */ +#include <unistd.h> + +#include "cfg.h" +#include "pid.h" +#include "db.h" +#include "log.h" +#include "zlog.h" + +#include "common.h" +#include "../functions.h" +#include "../expression.h" +#include "poller.h" + +#include "checks_agent.h" +#include "checks_internal.h" +#include "checks_simple.h" +#include "checks_snmp.h" + +int get_value(double *result,char *result_str,DB_ITEM *item, char *error, int max_error_len) +{ + int res=FAIL; + + struct sigaction phan; + + phan.sa_handler = &signal_handler; + sigemptyset(&phan.sa_mask); + phan.sa_flags = 0; + sigaction(SIGALRM, &phan, NULL); + + alarm(CONFIG_TIMEOUT); + + if(item->type == ITEM_TYPE_ZABBIX) + { + res=get_value_agent(result,result_str,item,error,max_error_len); + } + else if( (item->type == ITEM_TYPE_SNMPv1) || (item->type == ITEM_TYPE_SNMPv2c)) + { +#ifdef HAVE_SNMP + res=get_value_snmp(result,result_str,item,error, max_error_len); +#else + zabbix_log(LOG_LEVEL_WARNING, "Support of SNMP parameters was no compiled in"); + zabbix_syslog("Support of SNMP parameters was no compiled in. Cannot process [%s:%s]", item->host, item->key); + res=NOTSUPPORTED; +#endif + } + else if(item->type == ITEM_TYPE_SIMPLE) + { + res=get_value_simple(result,result_str,item,error,max_error_len); + } + else if(item->type == ITEM_TYPE_INTERNAL) + { + res=get_value_internal(result,result_str,item,error,max_error_len); + } + else + { + zabbix_log(LOG_LEVEL_WARNING, "Not supported item type:%d",item->type); + zabbix_syslog("Not supported item type:%d",item->type); + res=NOTSUPPORTED; + } + alarm(0); + /* Delete EOL characters from result string */ + delete_reol(result_str); + return res; +} + +static int get_minnextcheck(int now) +{ + char sql[MAX_STRING_LEN]; + + DB_RESULT *result; + + int res; + +/* Host status 0 == MONITORED + 1 == NOT MONITORED + 2 == UNREACHABLE */ + snprintf(sql,sizeof(sql)-1,"select count(*),min(nextcheck) from items i,hosts h where ((h.status=%d and h.available!=%d) or (h.status=%d and h.available=%d and h.disable_until<%d)) and h.hostid=i.hostid and i.status=%d and i.type not in (%d,%d) and i.itemid%%%d=%d and i.key_ not in ('%s','%s','%s','%s')", HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE,HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, now, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE, CONFIG_SUCKERD_FORKS-5,server_num-5,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY,SERVER_ZABBIXLOG_KEY); + result = DBselect(sql); + + if( DBnum_rows(result) == 0) + { + zabbix_log(LOG_LEVEL_DEBUG, "No items to update for minnextcheck."); + res = FAIL; + } + else + { + if( atoi(DBget_field(result,0,0)) == 0) + { + res = FAIL; + } + else + { + res = atoi(DBget_field(result,0,1)); + } + } + DBfree_result(result); + + return res; +} + +/* Update special host's item - "status" */ +static void update_key_status(int hostid,int host_status) +{ + char sql[MAX_STRING_LEN]; + char value_str[MAX_STRING_LEN]; + + DB_ITEM item; + DB_RESULT *result; + + zabbix_log(LOG_LEVEL_DEBUG, "In update_key_status()"); + + snprintf(sql,sizeof(sql)-1,"select i.itemid,i.key_,h.host,h.port,i.delay,i.description,i.nextcheck,i.type,i.snmp_community,i.snmp_oid,h.useip,h.ip,i.history,i.lastvalue,i.prevvalue,i.hostid,h.status,i.value_type,h.network_errors,i.snmp_port,i.delta,i.prevorgvalue,i.lastclock,i.units,i.multiplier,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authpassphrase,i.snmpv3_privpassphrase,i.formula,h.available from items i,hosts h where h.hostid=i.hostid and h.hostid=%d and i.key_='%s'", hostid,SERVER_STATUS_KEY); + result = DBselect(sql); + + if( DBnum_rows(result) == 0) + { + zabbix_log( LOG_LEVEL_DEBUG, "No items to update."); + } + else + { + DBget_item_from_db(&item,result,0); + + snprintf(value_str,sizeof(value_str)-1,"%d",host_status); + + process_new_value(&item,value_str); + update_triggers(item.itemid); + } + + DBfree_result(result); +} + +int get_values(void) +{ + double value; + char value_str[MAX_STRING_LEN]; + char sql[MAX_STRING_LEN]; + + char error[MAX_STRING_LEN]; + + DB_RESULT *result; + + int i; + int now; + int res; + DB_ITEM item; + + error[0]=0; + + now = time(NULL); + + snprintf(sql,sizeof(sql)-1,"select i.itemid,i.key_,h.host,h.port,i.delay,i.description,i.nextcheck,i.type,i.snmp_community,i.snmp_oid,h.useip,h.ip,i.history,i.lastvalue,i.prevvalue,i.hostid,h.status,i.value_type,h.network_errors,i.snmp_port,i.delta,i.prevorgvalue,i.lastclock,i.units,i.multiplier,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authpassphrase,i.snmpv3_privpassphrase,i.formula,h.available from items i,hosts h where i.nextcheck<=%d and i.status=%d and i.type not in (%d,%d) and ((h.status=%d and h.available!=%d) or (h.status=%d and h.available=%d and h.disable_until<=%d)) and h.hostid=i.hostid and i.itemid%%%d=%d and i.key_ not in ('%s','%s','%s','%s') order by i.nextcheck", now, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE, HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, now, CONFIG_SUCKERD_FORKS-5,server_num-5,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY,SERVER_ZABBIXLOG_KEY); + result = DBselect(sql); + + for(i=0;i<DBnum_rows(result);i++) + { + DBget_item_from_db(&item,result, i); + + res = get_value(&value,value_str,&item,error,sizeof(error)); + zabbix_log( LOG_LEVEL_DEBUG, "GOT VALUE [%s]", value_str ); + + if(res == SUCCEED ) + { + process_new_value(&item,value_str); + + if(item.host_network_errors>0) + { + snprintf(sql,sizeof(sql)-1,"update hosts set network_errors=0,error='' where hostid=%d and network_errors>0", item.hostid); + DBexecute(sql); + } + +/* if(HOST_STATUS_UNREACHABLE == item.host_status)*/ + if(HOST_AVAILABLE_TRUE != item.host_available) + { + item.host_available=HOST_AVAILABLE_TRUE; + zabbix_log( LOG_LEVEL_WARNING, "Enabling host [%s]", item.host ); + zabbix_syslog("Enabling host [%s]", item.host ); + DBupdate_host_availability(item.hostid,HOST_AVAILABLE_TRUE,now,error); + update_key_status(item.hostid,HOST_STATUS_MONITORED); + +/* Why this break??? Trigger needs to be updated anyway! + break;*/ + } + update_triggers(item.itemid); + } + else if(res == NOTSUPPORTED) + { + zabbix_log( LOG_LEVEL_WARNING, "Parameter [%s] is not supported by agent on host [%s]", item.key, item.host ); + zabbix_syslog("Parameter [%s] is not supported by agent on host [%s]", item.key, item.host ); + DBupdate_item_status_to_notsupported(item.itemid, error); +/* if(HOST_STATUS_UNREACHABLE == item.host_status)*/ + if(HOST_AVAILABLE_TRUE != item.host_available) + { + item.host_available=HOST_AVAILABLE_TRUE; + zabbix_log( LOG_LEVEL_WARNING, "Enabling host [%s]", item.host ); + zabbix_syslog("Enabling host [%s]", item.host ); + DBupdate_host_availability(item.hostid,HOST_AVAILABLE_TRUE,now,error); + update_key_status(item.hostid,HOST_STATUS_MONITORED); + + break; + } + } + else if(res == NETWORK_ERROR) + { + item.host_network_errors++; + if(item.host_network_errors>=3) + { + zabbix_log( LOG_LEVEL_WARNING, "Host [%s] will be checked after [%d] seconds", item.host, DELAY_ON_NETWORK_FAILURE ); + zabbix_syslog("Host [%s] will be checked after [%d] seconds", item.host, DELAY_ON_NETWORK_FAILURE ); + DBupdate_host_availability(item.hostid,HOST_AVAILABLE_FALSE,now,error); + update_key_status(item.hostid,HOST_AVAILABLE_FALSE); + + snprintf(sql,sizeof(sql)-1,"update hosts set network_errors=3 where hostid=%d", item.hostid); + DBexecute(sql); + } + else + { + snprintf(sql,sizeof(sql)-1,"update hosts set network_errors=%d where hostid=%d", item.host_network_errors, item.hostid); + DBexecute(sql); + } + + break; + } +/* Possibly, other logic required? */ + else if(res == AGENT_ERROR) + { + zabbix_log( LOG_LEVEL_WARNING, "Getting value of [%s] from host [%s] failed (ZBX_ERROR)", item.key, item.host ); + zabbix_syslog("Getting value of [%s] from host [%s] failed (ZBX_ERROR)", item.key, item.host ); + zabbix_log( LOG_LEVEL_WARNING, "The value is not stored in database."); + + break; + } + else + { + zabbix_log( LOG_LEVEL_WARNING, "Getting value of [%s] from host [%s] failed", item.key, item.host ); + zabbix_syslog("Getting value of [%s] from host [%s] failed", item.key, item.host ); + zabbix_log( LOG_LEVEL_WARNING, "The value is not stored in database."); + } + } + + DBfree_result(result); + return SUCCEED; +} + +int main_poller_loop() +{ + int now; + int nextcheck,sleeptime; + + DBconnect(); + + for(;;) + { +#ifdef HAVE_FUNCTION_SETPROCTITLE + setproctitle("poller [getting values]"); +#endif + now=time(NULL); + get_values(); + + zabbix_log( LOG_LEVEL_DEBUG, "Spent %d seconds while updating values", (int)time(NULL)-now ); + + nextcheck=get_minnextcheck(now); + zabbix_log( LOG_LEVEL_DEBUG, "Nextcheck:%d Time:%d", nextcheck, (int)time(NULL) ); + + if( FAIL == nextcheck) + { + sleeptime=SUCKER_DELAY; + } + else + { + sleeptime=nextcheck-time(NULL); + if(sleeptime<0) + { + sleeptime=0; + } + } + if(sleeptime>0) + { + if(sleeptime > SUCKER_DELAY) + { + sleeptime = SUCKER_DELAY; + } + zabbix_log( LOG_LEVEL_DEBUG, "Sleeping for %d seconds", + sleeptime ); +#ifdef HAVE_FUNCTION_SETPROCTITLE + setproctitle("poller [sleeping for %d seconds]", + sleeptime); +#endif + sleep( sleeptime ); + } + else + { + zabbix_log( LOG_LEVEL_DEBUG, "No sleeping" ); + } + } +} + diff --git a/src/zabbix_server/poller/poller.h b/src/zabbix_server/poller/poller.h new file mode 100644 index 00000000..8d865ce6 --- /dev/null +++ b/src/zabbix_server/poller/poller.h @@ -0,0 +1,31 @@ +/* +** 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. +**/ + +#ifndef ZABBIX_POLLER_H +#define ZABBIX_POLLER_H + +extern void signal_handler(int); +extern int server_num; + +extern int CONFIG_TIMEOUT; +extern int CONFIG_SUCKERD_FORKS; + +int main_escalator_loop(); + +#endif diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index 0ce0c267..ee3bd635 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -36,6 +36,10 @@ /* getopt() */ #include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> + #include "cfg.h" #include "pid.h" #include "db.h" @@ -49,17 +53,13 @@ #include "alerter/alerter.h" #include "escalator/escalator.h" #include "pinger/pinger.h" +#include "poller/poller.h" #include "housekeeper/housekeeper.h" #include "trapper/trapper.h" -#include "checks_agent.h" -#include "checks_internal.h" -#include "checks_simple.h" -#include "checks_snmp.h" - #define LISTENQ 1024 -static pid_t *pids=NULL; +pid_t *pids=NULL; static int server_num=0; @@ -275,119 +275,6 @@ void init_config(void) } } -int get_value(double *result,char *result_str,DB_ITEM *item, char *error, int max_error_len) -{ - int res=FAIL; - - struct sigaction phan; - - phan.sa_handler = &signal_handler; - sigemptyset(&phan.sa_mask); - phan.sa_flags = 0; - sigaction(SIGALRM, &phan, NULL); - - alarm(CONFIG_TIMEOUT); - - if(item->type == ITEM_TYPE_ZABBIX) - { - res=get_value_agent(result,result_str,item,error,max_error_len); - } - else if( (item->type == ITEM_TYPE_SNMPv1) || (item->type == ITEM_TYPE_SNMPv2c)) - { -#ifdef HAVE_SNMP - res=get_value_snmp(result,result_str,item,error, max_error_len); -#else - zabbix_log(LOG_LEVEL_WARNING, "Support of SNMP parameters was no compiled in"); - zabbix_syslog("Support of SNMP parameters was no compiled in. Cannot process [%s:%s]", item->host, item->key); - res=NOTSUPPORTED; -#endif - } - else if(item->type == ITEM_TYPE_SIMPLE) - { - res=get_value_simple(result,result_str,item,error,max_error_len); - } - else if(item->type == ITEM_TYPE_INTERNAL) - { - res=get_value_internal(result,result_str,item,error,max_error_len); - } - else - { - zabbix_log(LOG_LEVEL_WARNING, "Not supported item type:%d",item->type); - zabbix_syslog("Not supported item type:%d",item->type); - res=NOTSUPPORTED; - } - alarm(0); - /* Delete EOL characters from result string */ - delete_reol(result_str); - return res; -} - -int get_minnextcheck(int now) -{ - char sql[MAX_STRING_LEN]; - - DB_RESULT *result; - - int res; - -/* Host status 0 == MONITORED - 1 == NOT MONITORED - 2 == UNREACHABLE */ - snprintf(sql,sizeof(sql)-1,"select count(*),min(nextcheck) from items i,hosts h where ((h.status=%d and h.available!=%d) or (h.status=%d and h.available=%d and h.disable_until<%d)) and h.hostid=i.hostid and i.status=%d and i.type not in (%d,%d) and i.itemid%%%d=%d and i.key_ not in ('%s','%s','%s','%s')", HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE,HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, now, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE, CONFIG_SUCKERD_FORKS-5,server_num-5,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY,SERVER_ZABBIXLOG_KEY); - result = DBselect(sql); - - if( DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "No items to update for minnextcheck."); - res = FAIL; - } - else - { - if( atoi(DBget_field(result,0,0)) == 0) - { - res = FAIL; - } - else - { - res = atoi(DBget_field(result,0,1)); - } - } - DBfree_result(result); - - return res; -} - -/* Update special host's item - "status" */ -void update_key_status(int hostid,int host_status) -{ - char sql[MAX_STRING_LEN]; - char value_str[MAX_STRING_LEN]; - - DB_ITEM item; - DB_RESULT *result; - - zabbix_log(LOG_LEVEL_DEBUG, "In update_key_status()"); - - snprintf(sql,sizeof(sql)-1,"select i.itemid,i.key_,h.host,h.port,i.delay,i.description,i.nextcheck,i.type,i.snmp_community,i.snmp_oid,h.useip,h.ip,i.history,i.lastvalue,i.prevvalue,i.hostid,h.status,i.value_type,h.network_errors,i.snmp_port,i.delta,i.prevorgvalue,i.lastclock,i.units,i.multiplier,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authpassphrase,i.snmpv3_privpassphrase,i.formula,h.available from items i,hosts h where h.hostid=i.hostid and h.hostid=%d and i.key_='%s'", hostid,SERVER_STATUS_KEY); - result = DBselect(sql); - - if( DBnum_rows(result) == 0) - { - zabbix_log( LOG_LEVEL_DEBUG, "No items to update."); - } - else - { - DBget_item_from_db(&item,result,0); - - snprintf(value_str,sizeof(value_str)-1,"%d",host_status); - - process_new_value(&item,value_str); - update_triggers(item.itemid); - } - - DBfree_result(result); -} - void trend(void) { char sql[MAX_STRING_LEN]; @@ -413,118 +300,6 @@ void trend(void) DBfree_result(result2); } -int get_values(void) -{ - double value; - char value_str[MAX_STRING_LEN]; - char sql[MAX_STRING_LEN]; - - char error[MAX_STRING_LEN]; - - DB_RESULT *result; - - int i; - int now; - int res; - DB_ITEM item; - - error[0]=0; - - now = time(NULL); - - snprintf(sql,sizeof(sql)-1,"select i.itemid,i.key_,h.host,h.port,i.delay,i.description,i.nextcheck,i.type,i.snmp_community,i.snmp_oid,h.useip,h.ip,i.history,i.lastvalue,i.prevvalue,i.hostid,h.status,i.value_type,h.network_errors,i.snmp_port,i.delta,i.prevorgvalue,i.lastclock,i.units,i.multiplier,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authpassphrase,i.snmpv3_privpassphrase,i.formula,h.available from items i,hosts h where i.nextcheck<=%d and i.status=%d and i.type not in (%d,%d) and ((h.status=%d and h.available!=%d) or (h.status=%d and h.available=%d and h.disable_until<=%d)) and h.hostid=i.hostid and i.itemid%%%d=%d and i.key_ not in ('%s','%s','%s','%s') order by i.nextcheck", now, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE, HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, HOST_STATUS_MONITORED, HOST_AVAILABLE_FALSE, now, CONFIG_SUCKERD_FORKS-5,server_num-5,SERVER_STATUS_KEY, SERVER_ICMPPING_KEY, SERVER_ICMPPINGSEC_KEY,SERVER_ZABBIXLOG_KEY); - result = DBselect(sql); - - for(i=0;i<DBnum_rows(result);i++) - { - DBget_item_from_db(&item,result, i); - - res = get_value(&value,value_str,&item,error,sizeof(error)); - zabbix_log( LOG_LEVEL_DEBUG, "GOT VALUE [%s]", value_str ); - - if(res == SUCCEED ) - { - process_new_value(&item,value_str); - - if(item.host_network_errors>0) - { - snprintf(sql,sizeof(sql)-1,"update hosts set network_errors=0,error='' where hostid=%d and network_errors>0", item.hostid); - DBexecute(sql); - } - -/* if(HOST_STATUS_UNREACHABLE == item.host_status)*/ - if(HOST_AVAILABLE_TRUE != item.host_available) - { - item.host_available=HOST_AVAILABLE_TRUE; - zabbix_log( LOG_LEVEL_WARNING, "Enabling host [%s]", item.host ); - zabbix_syslog("Enabling host [%s]", item.host ); - DBupdate_host_availability(item.hostid,HOST_AVAILABLE_TRUE,now,error); - update_key_status(item.hostid,HOST_STATUS_MONITORED); - -/* Why this break??? Trigger needs to be updated anyway! - break;*/ - } - update_triggers(item.itemid); - } - else if(res == NOTSUPPORTED) - { - zabbix_log( LOG_LEVEL_WARNING, "Parameter [%s] is not supported by agent on host [%s]", item.key, item.host ); - zabbix_syslog("Parameter [%s] is not supported by agent on host [%s]", item.key, item.host ); - DBupdate_item_status_to_notsupported(item.itemid, error); -/* if(HOST_STATUS_UNREACHABLE == item.host_status)*/ - if(HOST_AVAILABLE_TRUE != item.host_available) - { - item.host_available=HOST_AVAILABLE_TRUE; - zabbix_log( LOG_LEVEL_WARNING, "Enabling host [%s]", item.host ); - zabbix_syslog("Enabling host [%s]", item.host ); - DBupdate_host_availability(item.hostid,HOST_AVAILABLE_TRUE,now,error); - update_key_status(item.hostid,HOST_STATUS_MONITORED); - - break; - } - } - else if(res == NETWORK_ERROR) - { - item.host_network_errors++; - if(item.host_network_errors>=3) - { - zabbix_log( LOG_LEVEL_WARNING, "Host [%s] will be checked after [%d] seconds", item.host, DELAY_ON_NETWORK_FAILURE ); - zabbix_syslog("Host [%s] will be checked after [%d] seconds", item.host, DELAY_ON_NETWORK_FAILURE ); - DBupdate_host_availability(item.hostid,HOST_AVAILABLE_FALSE,now,error); - update_key_status(item.hostid,HOST_AVAILABLE_FALSE); - - snprintf(sql,sizeof(sql)-1,"update hosts set network_errors=3 where hostid=%d", item.hostid); - DBexecute(sql); - } - else - { - snprintf(sql,sizeof(sql)-1,"update hosts set network_errors=%d where hostid=%d", item.host_network_errors, item.hostid); - DBexecute(sql); - } - - break; - } -/* Possibly, other logic required? */ - else if(res == AGENT_ERROR) - { - zabbix_log( LOG_LEVEL_WARNING, "Getting value of [%s] from host [%s] failed (ZBX_ERROR)", item.key, item.host ); - zabbix_syslog("Getting value of [%s] from host [%s] failed (ZBX_ERROR)", item.key, item.host ); - zabbix_log( LOG_LEVEL_WARNING, "The value is not stored in database."); - - break; - } - else - { - zabbix_log( LOG_LEVEL_WARNING, "Getting value of [%s] from host [%s] failed", item.key, item.host ); - zabbix_syslog("Getting value of [%s] from host [%s] failed", item.key, item.host ); - zabbix_log( LOG_LEVEL_WARNING, "The value is not stored in database."); - } - } - - DBfree_result(result); - return SUCCEED; -} - int main_nodata_loop() { char sql[MAX_STRING_LEN]; @@ -574,59 +349,6 @@ int main_nodata_loop() } } -int main_poller_loop() -{ - int now; - int nextcheck,sleeptime; - - DBconnect(); - - for(;;) - { -#ifdef HAVE_FUNCTION_SETPROCTITLE - setproctitle("poller [getting values]"); -#endif - now=time(NULL); - get_values(); - - zabbix_log( LOG_LEVEL_DEBUG, "Spent %d seconds while updating values", (int)time(NULL)-now ); - - nextcheck=get_minnextcheck(now); - zabbix_log( LOG_LEVEL_DEBUG, "Nextcheck:%d Time:%d", nextcheck, (int)time(NULL) ); - - if( FAIL == nextcheck) - { - sleeptime=SUCKER_DELAY; - } - else - { - sleeptime=nextcheck-time(NULL); - if(sleeptime<0) - { - sleeptime=0; - } - } - if(sleeptime>0) - { - if(sleeptime > SUCKER_DELAY) - { - sleeptime = SUCKER_DELAY; - } - zabbix_log( LOG_LEVEL_DEBUG, "Sleeping for %d seconds", - sleeptime ); -#ifdef HAVE_FUNCTION_SETPROCTITLE - setproctitle("poller [sleeping for %d seconds]", - sleeptime); -#endif - sleep( sleeptime ); - } - else - { - zabbix_log( LOG_LEVEL_DEBUG, "No sleeping" ); - } - } -} - int tcp_listen(const char *host, int port, socklen_t *addrlenp) { int sockfd; |