summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authoralex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-04-14 09:56:53 +0000
committeralex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-04-14 09:56:53 +0000
commit3f4975b42affe14f0951f500835dfd3da69eb5ce (patch)
treeedad167770fab45338c3ca7aaf78f982e5edb223 /src
parent0a80c5c1d8605f34a3512f618328127a46d899db (diff)
downloadzabbix-3f4975b42affe14f0951f500835dfd3da69eb5ce.tar.gz
zabbix-3f4975b42affe14f0951f500835dfd3da69eb5ce.tar.xz
zabbix-3f4975b42affe14f0951f500835dfd3da69eb5ce.zip
Support of IP range if discoveru rule definition.
git-svn-id: svn://svn.zabbix.com/trunk@4005 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src')
-rw-r--r--src/libs/zbxcommon/misc.c55
-rw-r--r--src/zabbix_server/actions.c10
-rw-r--r--src/zabbix_server/discoverer/discoverer.c106
3 files changed, 124 insertions, 47 deletions
diff --git a/src/libs/zbxcommon/misc.c b/src/libs/zbxcommon/misc.c
index 6ce99085..5cd23756 100644
--- a/src/libs/zbxcommon/misc.c
+++ b/src/libs/zbxcommon/misc.c
@@ -235,6 +235,61 @@ int calculate_item_nextcheck(zbx_uint64_t itemid, int item_type, int delay, char
/******************************************************************************
* *
+ * Function: int_in_list *
+ * *
+ * Purpose: check if integer matches a list of integers *
+ * *
+ * Parameters: list - integers [i1-i2,i3,i4,i5-i6] (10-25,45,67-699 *
+ * value- value *
+ * *
+ * Return value: FAIL - out of period, SUCCEED - within the period *
+ * *
+ * Author: Alexei Vladishev *
+ * *
+ * Comments: *
+ * *
+ ******************************************************************************/
+int int_in_list(const char *list, int value)
+{
+ char tmp[MAX_STRING_LEN];
+ char *s;
+ int i1,i2;
+ int ret = FAIL;
+
+
+ zabbix_log( LOG_LEVEL_WARNING, "In int_in_list(list:%s,value:%d)", list, value);
+
+ strscpy(tmp,list);
+ s=(char *)strtok(tmp,",");
+ while(s!=NULL)
+ {
+ zabbix_log(LOG_LEVEL_WARNING,"Int [%s]", s);
+ if(sscanf(s,"%d-%d",&i1,&i2) == 2)
+ {
+ if(value>=i1 && value<=i2)
+ {
+ ret = SUCCEED;
+ break;
+ }
+ }
+ else
+ {
+ if(atoi(s) == value)
+ {
+ ret = SUCCEED;
+ break;
+ }
+ }
+ s=(char *)strtok(NULL,",");
+ }
+
+ zabbix_log( LOG_LEVEL_WARNING, "End int_in_list(ret:%s)", ret == SUCCEED?"SUCCEED":"FAIL");
+
+ return ret;
+}
+
+/******************************************************************************
+ * *
* Function: check_time_period *
* *
* Purpose: check if current time is within given period *
diff --git a/src/zabbix_server/actions.c b/src/zabbix_server/actions.c
index 4fd79ff3..845a7556 100644
--- a/src/zabbix_server/actions.c
+++ b/src/zabbix_server/actions.c
@@ -459,15 +459,11 @@ static int check_action_condition(DB_EVENT *event, DB_CONDITION *condition)
{
if(condition->operator == CONDITION_OPERATOR_EQUAL)
{
- if(value_int == atoi(row[0])) ret = SUCCEED;
- }
- else if(condition->operator == CONDITION_OPERATOR_LESS_EQUAL)
- {
- if(atoi(row[0]) <= value_int) ret = SUCCEED;
+ if(int_in_list(row[0], value_int) == SUCCEED) ret = SUCCEED;
}
- else if(condition->operator == CONDITION_OPERATOR_MORE_EQUAL)
+ else if(condition->operator == CONDITION_OPERATOR_NOT_EQUAL)
{
- if(atoi(row[0]) >= value_int) ret = SUCCEED;
+ if(int_in_list(row[0], value_int) == FAIL) ret = SUCCEED;
}
else
{
diff --git a/src/zabbix_server/discoverer/discoverer.c b/src/zabbix_server/discoverer/discoverer.c
index dea06633..4175b7e3 100644
--- a/src/zabbix_server/discoverer/discoverer.c
+++ b/src/zabbix_server/discoverer/discoverer.c
@@ -418,7 +418,7 @@ static int discover_service(zbx_dservice_type_t type, char *ip, int port)
struct sigaction phan;
- zabbix_log(LOG_LEVEL_DEBUG, "In discover_service(ip:%s, port:%d, type:%d)",
+ zabbix_log(LOG_LEVEL_WARNING, "In discover_service(ip:%s, port:%d, type:%d)",
ip,
port,
type);
@@ -484,6 +484,7 @@ static int discover_service(zbx_dservice_type_t type, char *ip, int port)
sigaction(SIGALRM, &phan, NULL);
alarm(10);
+ zabbix_log(LOG_LEVEL_WARNING, "Beforfe process(%s)", key);
if(process(key, 0, &value) == SUCCEED)
{
if(GET_UI64_RESULT(&value))
@@ -493,10 +494,11 @@ static int discover_service(zbx_dservice_type_t type, char *ip, int port)
else ret = FAIL;
}
else ret = FAIL;
+ zabbix_log(LOG_LEVEL_WARNING, "After process(%s)", key);
alarm(0);
}
- zabbix_log(LOG_LEVEL_DEBUG, "End discover_service()");
+ zabbix_log(LOG_LEVEL_WARNING, "End discover_service()");
return ret;
}
@@ -523,7 +525,7 @@ static void process_check(DB_DRULE *rule, DB_DCHECK *check, char *ip)
char tmp[MAX_STRING_LEN];
int first,last;
- zabbix_log(LOG_LEVEL_DEBUG, "In process_check(ip:%s, ports:%s, type:%d)",
+ zabbix_log(LOG_LEVEL_WARNING, "In process_check(ip:%s, ports:%s, type:%d)",
ip,
check->ports,
check->type);
@@ -534,6 +536,7 @@ static void process_check(DB_DRULE *rule, DB_DCHECK *check, char *ip)
s=(char *)strtok(tmp,",");
while(s!=NULL)
{
+ zabbix_log(LOG_LEVEL_WARNING, "s [%s]", s);
c=strchr(s,'-');
if(c == NULL)
{
@@ -557,7 +560,7 @@ static void process_check(DB_DRULE *rule, DB_DCHECK *check, char *ip)
}
- zabbix_log(LOG_LEVEL_DEBUG, "End process_check()");
+ zabbix_log(LOG_LEVEL_WARNING, "End process_check()");
}
/******************************************************************************
@@ -582,38 +585,62 @@ static void process_rule(DB_DRULE *rule)
DB_DCHECK check;
char ip[MAX_STRING_LEN];
- int first,last;
- char *c;
-
- int i;
-
- zabbix_log( LOG_LEVEL_DEBUG, "In process_rule(name:%s)",
- rule->name);
-
+ char ip1[MAX_STRING_LEN];
+ char tmp[MAX_STRING_LEN];
+ int i1,i2,i3,i4,i5;
+ char *s;
+ int first, last, i;
+
+ zabbix_log(LOG_LEVEL_WARNING, "In process_rule(name:%s,range:%s)",
+ rule->name,
+ rule->iprange);
+
+ strscpy(tmp,rule->iprange);
+ s=(char *)strtok(tmp,",");
+ while(s!=NULL)
+ {
+ zabbix_log(LOG_LEVEL_WARNING,"IP [%s]", s);
+ if(sscanf(s,"%d.%d.%d.%d-%d",&i1,&i2,&i3,&i4,&i5) == 5)
+ {
+ zbx_snprintf(ip1,sizeof(ip)-1,"%d.%d.%d",i1,i2,i3);
+ first = i4;
+ last = i5;
+ }
+ else if(sscanf(s,"%d.%d.%d.%d",&i1,&i2,&i3,&i4) == 4)
+ {
+ zbx_snprintf(ip1,sizeof(ip)-1,"%d.%d.%d",i1,i2,i3);
+ first = i4;
+ last = i4;
+ }
+ else
+ {
+ zabbix_log(LOG_LEVEL_WARNING, "Wrong format of IP range [%s]",
+ rule->iprange);
+ break;
+ }
- first=atoi(strrchr(rule->ipfirst,'.')+1);
- last=atoi(strrchr(rule->iplast,'.')+1);
- c = strrchr(rule->ipfirst,'.');
- for(i=first;i<=last;i++)
- {
- c[0] = 0;
- zbx_snprintf(ip,MAX_STRING_LEN-1,"%s.%d",
- rule->ipfirst,
- i);
- result = DBselect("select dcheckid,druleid,type,ports from dchecks where druleid=" ZBX_FS_UI64,
- rule->druleid);
- while((row=DBfetch(result)))
+ for(i=first;i<=last;i++)
{
- ZBX_STR2UINT64(check.dcheckid,row[0]);
- ZBX_STR2UINT64(check.druleid,row[1]);
- check.type = atoi(row[2]);
- check.ports = row[3];
-
- process_check(rule, &check, ip);
+ zabbix_log(LOG_LEVEL_WARNING, "I [%d]", i);
+ zbx_snprintf(ip,sizeof(ip)-1,"%s.%d",
+ ip1,
+ i);
+ result = DBselect("select dcheckid,druleid,type,ports from dchecks where druleid=" ZBX_FS_UI64,
+ rule->druleid);
+ while((row=DBfetch(result)))
+ {
+ ZBX_STR2UINT64(check.dcheckid,row[0]);
+ ZBX_STR2UINT64(check.druleid,row[1]);
+ check.type = atoi(row[2]);
+ check.ports = row[3];
+
+ process_check(rule, &check, ip);
+ }
+ DBfree_result(result);
+ add_host_event(ip);
}
- DBfree_result(result);
- add_host_event(ip);
- c[0] = '.';
+
+ s=(char *)strtok(NULL,",");
}
zabbix_log( LOG_LEVEL_DEBUG, "End process_rule()");
@@ -653,7 +680,7 @@ void main_discoverer_loop(int num)
{
now=time(NULL);
- result = DBselect("select druleid,ipfirst,iplast,delay,nextcheck,name,status from drules where status=%d and nextcheck<=%d and " ZBX_SQL_MOD(druleid,%d) "=%d and" ZBX_COND_NODEID,
+ result = DBselect("select druleid,iprange,delay,nextcheck,name,status from drules where status=%d and nextcheck<=%d and " ZBX_SQL_MOD(druleid,%d) "=%d and" ZBX_COND_NODEID,
DRULE_STATUS_MONITORED,
now,
CONFIG_DISCOVERER_FORKS,
@@ -662,12 +689,11 @@ void main_discoverer_loop(int num)
while((row=DBfetch(result)))
{
ZBX_STR2UINT64(rule.druleid,row[0]);
- rule.ipfirst = row[1];
- rule.iplast = row[2];
- rule.delay = atoi(row[3]);
- rule.nextcheck = atoi(row[4]);
- rule.name = row[5];
- rule.status = atoi(row[6]);
+ rule.iprange = row[1];
+ rule.delay = atoi(row[2]);
+ rule.nextcheck = atoi(row[3]);
+ rule.name = row[4];
+ rule.status = atoi(row[5]);
process_rule(&rule);
}