summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.in2
-rw-r--r--src/zabbix_server/Makefile.am6
-rw-r--r--src/zabbix_server/Makefile.in17
-rw-r--r--src/zabbix_server/poller/Makefile.am4
-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.c332
-rw-r--r--src/zabbix_server/poller/poller.h31
-rw-r--r--src/zabbix_server/server.c290
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;