diff options
| author | hugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2005-06-09 20:04:00 +0000 |
|---|---|---|
| committer | hugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2005-06-09 20:04:00 +0000 |
| commit | ec4e0a7ac29a651c98490487b27069bddaed4e92 (patch) | |
| tree | b4f1f3ab92822abd722a8a08b82fc165395ac921 /include | |
| parent | 515bb79a40246c8364cd8d7bef88337d6d6b1d79 (diff) | |
Minor changes.
git-svn-id: svn://svn.zabbix.com/trunk@1851 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'include')
| -rw-r--r-- | include/functions.c | 1198 | ||||
| -rw-r--r-- | include/functions.h | 36 | ||||
| -rw-r--r-- | include/sysinfo.h | 134 |
3 files changed, 134 insertions, 1234 deletions
diff --git a/include/functions.c b/include/functions.c deleted file mode 100644 index fa6862a9..00000000 --- a/include/functions.c +++ /dev/null @@ -1,1198 +0,0 @@ -/* -** 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 <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <netinet/in.h> -#include <netdb.h> - -#include <signal.h> - -#include <string.h> - -#include <time.h> - -#include <sys/socket.h> -#include <errno.h> - -/* Functions: pow(), round() */ -#include <math.h> - -#include "common.h" -#include "db.h" -#include "log.h" -#include "zlog.h" -#include "security.h" - -#include "functions.h" - -/* Delete trailing zeroes */ -/* 10.0100 -> 10.01, 10. -> 10 */ -void del_zeroes(char *s) -{ - int i; - - if(strchr(s,'.')!=NULL) - { - for(i=strlen(s)-1;;i--) - { - if(s[i]=='0') - { - s[i]=0; - } - else if(s[i]=='.') - { - s[i]=0; - break; - } - else - { - break; - } - } - } -} - -/* Calculate nextcheck for items. - Old algorithm: now+delay - New one: preserve period over time, If delay==5, nextcheck = 0,5,10,15,20... -*/ -int calculate_item_nextcheck(int nextcheck, int delay, int now) -{ - int i; - - i=delay*(int)(now/delay); - - while(i<=now) i+=delay; - - return i; -} - -/* - * Evaluate function COUNT - */ -int evaluate_COUNT(char *value,DB_ITEM *item,int parameter) -{ - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int now; - int res = SUCCEED; - - if(item->value_type != ITEM_VALUE_TYPE_FLOAT) - { - return FAIL; - } - - now=time(NULL); - - snprintf(sql,sizeof(sql)-1,"select count(value) from history where clock>%d and itemid=%d",now-parameter,item->itemid); - - result = DBselect(sql); - if(DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for COUNT is empty" ); - res = FAIL; - } - else - { - strcpy(value,DBget_field(result,0,0)); - } - DBfree_result(result); - - return res; -} - -/* - * Evaluate function SUM - */ -int evaluate_SUM(char *value,DB_ITEM *item,int parameter) -{ - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int now; - int res = SUCCEED; - - if(item->value_type != ITEM_VALUE_TYPE_FLOAT) - { - return FAIL; - } - - now=time(NULL); - - snprintf(sql,sizeof(sql)-1,"select sum(value) from history where clock>%d and itemid=%d",now-parameter,item->itemid); - - result = DBselect(sql); - if(DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for SUM is empty" ); - res = FAIL; - } - else - { - strcpy(value,DBget_field(result,0,0)); - } - DBfree_result(result); - - return res; -} - -/* - * Evaluate function AVG - */ -int evaluate_AVG(char *value,DB_ITEM *item,int parameter) -{ - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int now; - int res = SUCCEED; - - if(item->value_type != ITEM_VALUE_TYPE_FLOAT) - { - return FAIL; - } - - now=time(NULL); - - snprintf(sql,sizeof(sql)-1,"select avg(value) from history where clock>%d and itemid=%d",now-parameter,item->itemid); - - result = DBselect(sql); - if(DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for AVG is empty" ); - res = FAIL; - } - else - { - strcpy(value,DBget_field(result,0,0)); - del_zeroes(value); - } - DBfree_result(result); - - return res; -} - -/* - * Evaluate function MIN - */ -int evaluate_MIN(char *value,DB_ITEM *item,int parameter) -{ - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int now; - int res = SUCCEED; - - if(item->value_type != ITEM_VALUE_TYPE_FLOAT) - { - return FAIL; - } - - now=time(NULL); - - snprintf(sql,sizeof(sql)-1,"select min(value) from history where clock>%d and itemid=%d",now-parameter,item->itemid); - - result = DBselect(sql); - if(DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for MIN is empty" ); - res = FAIL; - } - else - { - strcpy(value,DBget_field(result,0,0)); - del_zeroes(value); - } - DBfree_result(result); - - return res; -} - -/* - * Evaluate function MAX - */ -int evaluate_MAX(char *value,DB_ITEM *item,int parameter) -{ - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int now; - int res = SUCCEED; - - if(item->value_type != ITEM_VALUE_TYPE_FLOAT) - { - return FAIL; - } - - now=time(NULL); - - snprintf(sql,sizeof(sql)-1,"select max(value) from history where clock>%d and itemid=%d",now-parameter,item->itemid); - - result = DBselect(sql); - if(DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for MAX is empty" ); - res = FAIL; - } - else - { - strcpy(value,DBget_field(result,0,0)); - del_zeroes(value); - } - DBfree_result(result); - - return res; -} - -/* - * Evaluate function DELTA - */ -int evaluate_DELTA(char *value,DB_ITEM *item,int parameter) -{ - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int now; - int res = SUCCEED; - - if(item->value_type != ITEM_VALUE_TYPE_FLOAT) - { - return FAIL; - } - - now=time(NULL); - - snprintf(sql,sizeof(sql)-1,"select max(value)-min(value) from history where clock>%d and itemid=%d",now-parameter,item->itemid); - - result = DBselect(sql); - if(DBnum_rows(result) == 0) - { - zabbix_log(LOG_LEVEL_DEBUG, "Result for DELTA is empty" ); - res = FAIL; - } - else - { - strcpy(value,DBget_field(result,0,0)); - del_zeroes(value); - } - DBfree_result(result); - - return res; -} - -/* - * Evaluate function (avg,min,max,prev,last,diff,str,change,abschange,delta,time,date) - */ -int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter, int flag) -{ - int ret = SUCCEED; - time_t now; - struct tm *tm; - - float value_float; - float value_float_abs; - char suffix[MAX_STRING_LEN]; - - int day; - - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() Function [%s] flag [%d]",function,flag); - - if(strcmp(function,"last")==0) - { - if(item->lastvalue_null==1) - { - ret = FAIL; - } - else - { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) - { - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 1"); - snprintf(value,MAX_STRING_LEN-1,"%f",item->lastvalue); - del_zeroes(value); - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 2 value [%s]", value); - } - else - { -/* *value=strdup(item->lastvalue_str);*/ - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 3 [%s] [%s]",value,item->lastvalue_str); - strcpy(value,item->lastvalue_str); - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 4"); - } - } - } - else if(strcmp(function,"prev")==0) - { - if(item->prevvalue_null==1) - { - ret = FAIL; - } - else - { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) - { - snprintf(value,MAX_STRING_LEN-1,"%f",item->prevvalue); - del_zeroes(value); - } - else - { - strcpy(value,item->prevvalue_str); - } - } - } - else if(strcmp(function,"min")==0) - { - ret = evaluate_MIN(value,item,atoi(parameter)); - } - else if(strcmp(function,"max")==0) - { - ret = evaluate_MAX(value,item,atoi(parameter)); - } - else if(strcmp(function,"avg")==0) - { - ret = evaluate_AVG(value,item,atoi(parameter)); - } - else if(strcmp(function,"sum")==0) - { - ret = evaluate_SUM(value,item,atoi(parameter)); - } - else if(strcmp(function,"count")==0) - { - ret = evaluate_COUNT(value,item,atoi(parameter)); - } - else if(strcmp(function,"delta")==0) - { - ret = evaluate_DELTA(value,item,atoi(parameter)); - } - else if(strcmp(function,"nodata")==0) - { - strcpy(value,"0"); - } - else if(strcmp(function,"date")==0) - { - now=time(NULL); - tm=localtime(&now); - snprintf(value,MAX_STRING_LEN-1,"%.4d%.2d%.2d",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday); - } - else if(strcmp(function,"dayofweek")==0) - { - now=time(NULL); - tm=localtime(&now); - /* The number of days since Sunday, in the range 0 to 6. */ - day=tm->tm_wday; - if(0 == day) day=7; - snprintf(value,MAX_STRING_LEN-1,"%d", day); - } - else if(strcmp(function,"time")==0) - { - now=time(NULL); - tm=localtime(&now); - snprintf(value,MAX_STRING_LEN-1,"%.2d%.2d%.2d",tm->tm_hour,tm->tm_min,tm->tm_sec); - } - else if(strcmp(function,"abschange")==0) - { - if((item->lastvalue_null==1)||(item->prevvalue_null==1)) - { - ret = FAIL; - } - else - { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) - { - snprintf(value,MAX_STRING_LEN-1,"%f",(float)abs(item->lastvalue-item->prevvalue)); - del_zeroes(value); - } - else - { - if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) - { - strcpy(value,"0"); - } - else - { - strcpy(value,"1"); - } - } - } - } - else if(strcmp(function,"change")==0) - { - if((item->lastvalue_null==1)||(item->prevvalue_null==1)) - { - ret = FAIL; - } - else - { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) - { - snprintf(value,MAX_STRING_LEN-1,"%f",item->lastvalue-item->prevvalue); - del_zeroes(value); - } - else - { - if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) - { - strcpy(value,"0"); - } - else - { - strcpy(value,"1"); - } - } - } - } - else if(strcmp(function,"diff")==0) - { - if((item->lastvalue_null==1)||(item->prevvalue_null==1)) - { - ret = FAIL; - } - else - { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) - { - if(cmp_double(item->lastvalue, item->prevvalue) == 0) - { - strcpy(value,"0"); - } - else - { - strcpy(value,"1"); - } - } - else - { - if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) - { - strcpy(value,"0"); - } - else - { - strcpy(value,"1"); - } - } - } - } - else if(strcmp(function,"str")==0) - { - if(item->value_type==ITEM_VALUE_TYPE_STR) - { - if(strstr(item->lastvalue_str, parameter) == NULL) - { - strcpy(value,"0"); - } - else - { - strcpy(value,"1"); - } - - } - else - { - ret = FAIL; - } - } - else if(strcmp(function,"now")==0) - { - now=time(NULL); - snprintf(value,MAX_STRING_LEN-1,"%d",(int)now); - } - else - { - zabbix_log( LOG_LEVEL_WARNING, "Unsupported function:%s",function); - zabbix_syslog("Unsupported function:%s",function); - ret = FAIL; - } - - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() pre-7"); - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 7 Formula [%s]", item->formula); - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 7 Value [%s]", value); - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 7 Units [%s]", item->units); - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 7 Value [%s] Units [%s] Formula [%s]", value, item->units, item->formula); - - /* Add suffix: 1000000 -> 1 MB */ - if( (EVALUATE_FUNCTION_SUFFIX == flag) && (ITEM_VALUE_TYPE_FLOAT == item->value_type) && - (SUCCEED == ret) && strlen(item->units)>0) - { - value_float=atof(value); - /* Custom multiplier? */ -/* - if(item->multiplier == 1) - { - value_float=value_float*atof(item->formula); - }*/ - - value_float_abs=abs(value_float); - - if(value_float_abs<1024) - { - strscpy(suffix,""); - } - else if(value_float_abs<1024*1024) - { - strscpy(suffix,"K"); - value_float=value_float/1024; - } - else if(value_float_abs<1024*1024*1024) - { - strscpy(suffix,"M"); - value_float=value_float/(1024*1024); - } - else - { - strscpy(suffix,"G"); - value_float=value_float/(1024*1024*1024); - } - zabbix_log( LOG_LEVEL_DEBUG, "Value [%s] [%f] Suffix [%s] Units [%s]",value,value_float,suffix,item->units); -// if(cmp_double((double)round(value_float), value_float) == 0) - if(cmp_double((int)(value_float+0.5), value_float) == 0) - { - snprintf(value, MAX_STRING_LEN-1, "%.0f %s%s", value_float, suffix, item->units); - } - else - { - snprintf(value, MAX_STRING_LEN-1, "%.2f %s%s", value_float, suffix, item->units); - } - } - - zabbix_log( LOG_LEVEL_DEBUG, "End of evaluate_FUNCTION. Result [%s]",value); - return ret; -} - -/* - * Re-calculate values of functions related to given ITEM - */ -void update_functions(DB_ITEM *item) -{ - DB_FUNCTION function; - DB_RESULT *result; - char sql[MAX_STRING_LEN]; - char value[MAX_STRING_LEN]; - char value_esc[MAX_STRING_LEN]; - int ret=SUCCEED; - int i; - - zabbix_log( LOG_LEVEL_DEBUG, "In update_functions(%d)",item->itemid); - - snprintf(sql,sizeof(sql)-1,"select function,parameter,itemid from functions where itemid=%d group by 1,2,3 order by 1,2,3",item->itemid); - - result = DBselect(sql); - - for(i=0;i<DBnum_rows(result);i++) - { - function.function=DBget_field(result,i,0); - function.parameter=DBget_field(result,i,1); - function.itemid=atoi(DBget_field(result,i,2)); - - zabbix_log( LOG_LEVEL_DEBUG, "ItemId:%d Evaluating %s(%d)\n",function.itemid,function.function,function.parameter); - - ret = evaluate_FUNCTION(value,item,function.function,function.parameter, EVALUATE_FUNCTION_NORMAL); - if( FAIL == ret) - { - zabbix_log( LOG_LEVEL_DEBUG, "Evaluation failed for function:%s\n",function.function); - continue; - } - zabbix_log( LOG_LEVEL_DEBUG, "Result of evaluate_FUNCTION [%s]\n",value); - if (ret == SUCCEED) - { - DBescape_string(value,value_esc,MAX_STRING_LEN); - snprintf(sql,sizeof(sql)-1,"update functions set lastvalue='%s' where itemid=%d and function='%s' and parameter='%s'", value_esc, function.itemid, function.function, function.parameter ); - DBexecute(sql); - } - } - - DBfree_result(result); -} - -/* - * Recursive function! - */ -void update_serv(int serviceid) -{ - char sql[MAX_STRING_LEN]; - int i; - int status; - int serviceupid, algorithm; - int now; - - DB_RESULT *result,*result2; - - snprintf(sql,sizeof(sql)-1,"select l.serviceupid,s.algorithm from services_links l,services s where s.serviceid=l.serviceupid and l.servicedownid=%d",serviceid); - result=DBselect(sql); - status=0; - for(i=0;i<DBnum_rows(result);i++) - { - serviceupid=atoi(DBget_field(result,i,0)); - algorithm=atoi(DBget_field(result,i,1)); - if(SERVICE_ALGORITHM_NONE == algorithm) - { -/* Do nothing */ - } - else if((SERVICE_ALGORITHM_MAX == algorithm) - || - (SERVICE_ALGORITHM_MIN == algorithm)) - { - /* Why it was so complex ? - sprintf(sql,"select status from services s,services_links l where l.serviceupid=%d and s.serviceid=l.servicedownid",serviceupid); - result2=DBselect(sql); - for(j=0;j<DBnum_rows(result2);j++) - { - if(atoi(DBget_field(result2,j,0))>status) - { - status=atoi(DBget_field(result2,j,0)); - } - } - DBfree_result(result2);*/ - - if(SERVICE_ALGORITHM_MAX == algorithm) - { - snprintf(sql,sizeof(sql)-1,"select count(*),max(status) from services s,services_links l where l.serviceupid=%d and s.serviceid=l.servicedownid",serviceupid); - } - /* MIN otherwise */ - else - { - snprintf(sql,sizeof(sql)-1,"select count(*),min(status) from services s,services_links l where l.serviceupid=%d and s.serviceid=l.servicedownid",serviceupid); - } - result2=DBselect(sql); - if(atoi(DBget_field(result2,0,0))!=0) - { - status=atoi(DBget_field(result2,0,1)); - } - DBfree_result(result2); - - now=time(NULL); - DBadd_service_alarm(atoi(DBget_field(result,i,0)),status,now); - snprintf(sql,sizeof(sql)-1,"update services set status=%d where serviceid=%d",status,atoi(DBget_field(result,i,0))); - DBexecute(sql); - } - else - { - zabbix_log( LOG_LEVEL_ERR, "Unknown calculation algorithm of service status [%d]", algorithm); - zabbix_syslog("Unknown calculation algorithm of service status [%d]", algorithm); - } - } - DBfree_result(result); - - snprintf(sql,sizeof(sql)-1,"select serviceupid from services_links where servicedownid=%d",serviceid); - result=DBselect(sql); - - for(i=0;i<DBnum_rows(result);i++) - { - update_serv(atoi(DBget_field(result,i,0))); - } - DBfree_result(result); -} - -void update_services(int triggerid, int status) -{ - char sql[MAX_STRING_LEN]; - int i; - - DB_RESULT *result; - - snprintf(sql,sizeof(sql)-1,"update services set status=%d where triggerid=%d",status,triggerid); - DBexecute(sql); - - - snprintf(sql,sizeof(sql)-1,"select serviceid from services where triggerid=%d", triggerid); - result = DBselect(sql); - - for(i=0;i<DBnum_rows(result);i++) - { - update_serv(atoi(DBget_field(result,i,0))); - } - - DBfree_result(result); - return; -} - -/* -* Re-calculate values of triggers -*/ -void update_triggers(int itemid) -{ - char sql[MAX_STRING_LEN]; - char exp[MAX_STRING_LEN]; - int exp_value; - int now; - DB_TRIGGER trigger; - DB_RESULT *result; - - int i; - - zabbix_log( LOG_LEVEL_DEBUG, "In update_triggers [%d]", itemid); - -/* Does not work for PostgreSQL */ -/* sprintf(sql,"select t.triggerid,t.expression,t.status,t.dep_level,t.priority,t.value from triggers t,functions f,items i where i.status<>3 and i.itemid=f.itemid and t.status=%d and f.triggerid=t.triggerid and f.itemid=%d group by t.triggerid,t.expression,t.dep_level",TRIGGER_STATUS_ENABLED,sucker_num);*/ -/* Is it correct SQL? */ - snprintf(sql,sizeof(sql)-1,"select distinct t.triggerid,t.expression,t.status,t.dep_level,t.priority,t.value,t.description from triggers t,functions f,items i where i.status<>%d and i.itemid=f.itemid and t.status=%d and f.triggerid=t.triggerid and f.itemid=%d",ITEM_STATUS_NOTSUPPORTED, TRIGGER_STATUS_ENABLED, itemid); - - result = DBselect(sql); - - for(i=0;i<DBnum_rows(result);i++) - { - trigger.triggerid=atoi(DBget_field(result,i,0)); - trigger.expression=DBget_field(result,i,1); - trigger.status=atoi(DBget_field(result,i,2)); - trigger.priority=atoi(DBget_field(result,i,4)); - - trigger.value=atoi(DBget_field(result,i,5)); - trigger.description=DBget_field(result,i,6); - strscpy(exp, trigger.expression); - if( evaluate_expression(&exp_value, exp) != 0 ) - { - zabbix_log( LOG_LEVEL_WARNING, "Expression [%s] cannot be evaluated.",trigger.expression); - zabbix_syslog("Expression [%s] cannot be evaluated.",trigger.expression); - continue; - } - -/* Oprimise a little bit */ -/* trigger.prevvalue=DBget_prev_trigger_value(trigger.triggerid);*/ - - zabbix_log( LOG_LEVEL_DEBUG, "exp_value trigger.value trigger.prevvalue [%d] [%d] [%d]", exp_value, trigger.value, trigger.prevvalue); - - now = time(NULL); - DBupdate_trigger_value(&trigger, exp_value, now); - -/* if(TRIGGER_VALUE_TRUE == exp_value) - { - if(trigger.value != TRIGGER_VALUE_TRUE) - { - now = time(NULL); - DBupdate_trigger_value(trigger.triggerid,TRIGGER_VALUE_TRUE,now); - } - if((trigger.value == TRIGGER_VALUE_FALSE) - || - ( - (trigger.value == TRIGGER_VALUE_UNKNOWN) && - (trigger.prevvalue == TRIGGER_VALUE_FALSE) - )) - { - apply_actions(&trigger,1); - - snprintf(sql,sizeof(sql)-1,"update actions set nextcheck=0 where triggerid=%d and good=0",trigger.triggerid); - DBexecute(sql); - - update_services(trigger.triggerid, trigger.priority); - } - } - - if(TRIGGER_VALUE_FALSE == exp_value) - { - if(trigger.value != TRIGGER_VALUE_FALSE) - { - now = time(NULL); - DBupdate_trigger_value(trigger.triggerid,TRIGGER_VALUE_FALSE,now); - } - if((trigger.value == TRIGGER_VALUE_TRUE) - || - ( - (trigger.value == TRIGGER_VALUE_UNKNOWN) && - (trigger.prevvalue == TRIGGER_VALUE_TRUE) - )) - { - apply_actions(&trigger,0); - - snprintf(sql,sizeof(sql)-1,"update actions set nextcheck=0 where triggerid=%d and good=1",trigger.triggerid); - DBexecute(sql); - - update_services(trigger.triggerid, 0); - } - }*/ - } - DBfree_result(result); -} - -/* - The fuction is used to evaluate macros for email notifications -*/ -int get_lastvalue(char *value,char *host,char *key,char *function,char *parameter) -{ - DB_ITEM item; - DB_RESULT *result; - - char sql[MAX_STRING_LEN]; - int res; - - zabbix_log(LOG_LEVEL_DEBUG, "In get_lastvalue()" ); - - 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.host='%s' and h.hostid=i.hostid and i.key_='%s'", host, key ); - result = DBselect(sql); - - if(DBnum_rows(result) == 0) - { - DBfree_result(result); - zabbix_log(LOG_LEVEL_WARNING, "Query [%s] returned empty result", sql ); - zabbix_syslog("Query [%s] returned empty result", sql ); - return FAIL; - } - - DBget_item_from_db(&item,result, 0); - -/* item.itemid=atoi(DBget_field(result,0,0)); - s=DBget_field(result,0,1); - if(s==NULL) - { - item.prevvalue_null=1; - } - else - { - item.prevvalue_null=0; - item.prevvalue_str=s; - item.prevvalue=atof(s); - } - s=DBget_field(result,0,2); - if(s==NULL) - { - item.lastvalue_null=1; - } - else - { - item.lastvalue_null=0; - item.lastvalue_str=s; - item.lastvalue=atof(s); - } - item.value_type=atoi(DBget_field(result,0,3)); - - item.multiplier=atoi(DBget_field(result,0,4)); - item.units=DBget_field(result,0,5); -*/ - - zabbix_log(LOG_LEVEL_DEBUG, "Itemid:%d", item.itemid ); - - zabbix_log(LOG_LEVEL_DEBUG, "Before evaluate_FUNCTION()" ); - - res = evaluate_FUNCTION(value,&item,function,parameter, EVALUATE_FUNCTION_SUFFIX); - -/* Cannot call DBfree_result until evaluate_FUNC */ - DBfree_result(result); - return res; -} - -/* For zabbix_trapper(d) */ -int send_list_of_active_checks(int sockfd, char *host) -{ - char sql[MAX_STRING_LEN]; - char s[MAX_STRING_LEN]; - DB_RESULT *result; - - int i; - - zabbix_log( LOG_LEVEL_DEBUG, "In send_list_of_active_checks()"); - - snprintf(sql,sizeof(sql)-1,"select i.key_,i.delay,i.lastlogsize from items i,hosts h where i.hostid=h.hostid and h.status=%d and i.status=%d and i.type=%d and h.host='%s'", HOST_STATUS_MONITORED, ITEM_STATUS_ACTIVE, ITEM_TYPE_ZABBIX_ACTIVE, host); - - result = DBselect(sql); - - for(i=0;i<DBnum_rows(result);i++) - { - snprintf(s,sizeof(s)-1,"%s:%s:%s\n",DBget_field(result,i,0),DBget_field(result,i,1),DBget_field(result,i,2)); - zabbix_log( LOG_LEVEL_DEBUG, "Sending [%s]", s); - if( write(sockfd,s,strlen(s)) == -1 ) - { - switch (errno) - { - case EINTR: - zabbix_log( LOG_LEVEL_WARNING, "Timeout while sending list of active checks"); - break; - default: - zabbix_log( LOG_LEVEL_WARNING, "Error while sending list of active checks [%s]", strerror(errno)); - } - close(sockfd); - return FAIL; - } - } - DBfree_result(result); - - snprintf(s,sizeof(s)-1,"%s\n","ZBX_EOF"); - zabbix_log( LOG_LEVEL_DEBUG, "Sending [%s]", s); - if( write(sockfd,s,strlen(s)) == -1 ) - { - switch (errno) - { - case EINTR: - zabbix_log( LOG_LEVEL_WARNING, "Timeout while sending list of active checks"); - break; - default: - zabbix_log( LOG_LEVEL_WARNING, "Error while sending list of active checks [%s]", strerror(errno)); - } - close(sockfd); - return FAIL; - } - - return SUCCEED; -} - -/* For zabbix_trapper(d) */ -/* int process_data(char *server,char *key, double value)*/ -int process_data(int sockfd,char *server,char *key,char *value) -{ - char sql[MAX_STRING_LEN]; - - DB_RESULT *result; - DB_ITEM item; - char *s; - char lastlogsize[MAX_STRING_LEN]; - - zabbix_log( LOG_LEVEL_DEBUG, "In process_data()"); - - 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.value_type,i.trapper_hosts,i.delta,i.units,i.multiplier,i.formula from items i,hosts h where h.status=%d and h.hostid=i.hostid and h.host='%s' and i.key_='%s' and i.status=%d and i.type in (%d,%d)", HOST_STATUS_MONITORED, server, key, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE); - result = DBselect(sql); - - if(DBnum_rows(result) == 0) - { - DBfree_result(result); - return FAIL; - } - - item.itemid=atoi(DBget_field(result,0,0)); - item.key=DBget_field(result,0,1); - item.host=DBget_field(result,0,2); - item.type=atoi(DBget_field(result,0,7)); - item.trapper_hosts=DBget_field(result,0,16); - - if( (item.type==ITEM_TYPE_ZABBIX_ACTIVE) && (check_security(sockfd,item.trapper_hosts,1) == FAIL)) - { - DBfree_result(result); - return FAIL; - } - - zabbix_log( LOG_LEVEL_DEBUG, "Processing [%s]", value); - - if(strcmp(value,"ZBX_NOTSUPPORTED") ==0) - { - zabbix_log( LOG_LEVEL_WARNING, "Active parameter [%s] is not supported by agent on host [%s]", item.key, item.host ); - zabbix_syslog("Active parameter [%s] is not supported by agent on host [%s]", item.key, item.host ); - DBupdate_item_status_to_notsupported(item.itemid, "Not supported by agent"); - } - - item.port=atoi(DBget_field(result,0,3)); - item.delay=atoi(DBget_field(result,0,4)); - item.description=DBget_field(result,0,5); - item.nextcheck=atoi(DBget_field(result,0,6)); - item.snmp_community=DBget_field(result,0,8); - item.snmp_oid=DBget_field(result,0,9); - item.useip=atoi(DBget_field(result,0,10)); - item.ip=DBget_field(result,0,11); - item.history=atoi(DBget_field(result,0,12)); - s=DBget_field(result,0,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,0,14); - if(s==NULL) - { - item.prevvalue_null=1; - } - else - { - item.prevvalue_null=0; - item.prevvalue_str=s; - item.prevvalue=atof(s); - } - item.value_type=atoi(DBget_field(result,0,15)); - item.delta=atoi(DBget_field(result,0,17)); - item.units=DBget_field(result,0,18); - item.multiplier=atoi(DBget_field(result,0,19)); - item.formula=DBget_field(result,0,20); - - s=value; - if(strncmp(item.key,"log[",4)==0) - { - s=strchr(value,':'); - if(s == NULL) - { - zabbix_log(LOG_LEVEL_WARNING, "Wrong value received for item [%s:%s]", item.host, item.key); - DBfree_result(result); - return FAIL; - } - s++; - - strncpy(lastlogsize, value, s-value-1); - lastlogsize[s-value-1]=0; - - item.lastlogsize=atoi(lastlogsize); - zabbix_log(LOG_LEVEL_DEBUG, "Value [%s] S [%s] Lastlogsize [%s] [%d]", value, s, lastlogsize, s-value-1); - } - - process_new_value(&item,s); - - update_triggers(item.itemid); - - DBfree_result(result); - - return SUCCEED; -} - -void process_new_value(DB_ITEM *item,char *value) -{ - int now; - char sql[MAX_STRING_LEN]; - char value_esc[MAX_STRING_LEN]; - char value_str[MAX_STRING_LEN]; - double value_double; - double multiplier; - char *e; - - now = time(NULL); - - strscpy(value_str, value); - - zabbix_log( LOG_LEVEL_DEBUG, "In process_new_value()"); - value_double=strtod(value_str,&e); - - if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (item->multiplier == ITEM_MULTIPLIER_USE)) - { - multiplier = strtod(item->formula,&e); - value_double = value_double * multiplier; - snprintf(value_str,sizeof(value_str)-1,"%f",value_double); - } - - if(item->history>0) - { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) - { - /* Should we store delta or original value? */ - if(item->delta == ITEM_STORE_AS_IS) - { - DBadd_history(item->itemid,value_double,now); - } - /* Delta as speed of change */ - else if(item->delta == ITEM_STORE_SPEED_PER_SECOND) - { - /* Save delta */ - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) ) - { - DBadd_history(item->itemid, (value_double - item->prevorgvalue)/(now-item->lastclock), now); - } - } - /* Real delta: simple difference between values */ - else if(item->delta == ITEM_STORE_SIMPLE_CHANGE) - { - /* Save delta */ - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) ) - { - DBadd_history(item->itemid, (value_double - item->prevorgvalue), now); - } - } - else - { - zabbix_log(LOG_LEVEL_ERR, "Value not stored for itemid [%d]. Unknown delta [%d]", item->itemid, item->delta); - zabbix_syslog("Value not stored for itemid [%d]. Unknown delta [%d]", item->itemid, item->delta); - return; - } - } - else if(item->value_type==ITEM_VALUE_TYPE_STR) - { - DBadd_history_str(item->itemid,value_str,now); - } - else if(item->value_type==ITEM_VALUE_TYPE_LOG) - { - DBadd_history_log(item->itemid,value_str,now); - snprintf(sql,sizeof(sql)-1,"update items set lastlogsize=%d where itemid=%d",item->lastlogsize,item->itemid); - DBexecute(sql); - } - else - { - zabbix_log(LOG_LEVEL_ERR, "Unknown value type [%d] for itemid [%d]", item->value_type,item->itemid); - } - } - - if(item->delta == ITEM_STORE_AS_IS) - { - if((item->prevvalue_null == 1) || (strcmp(value_str,item->lastvalue_str) != 0) || (strcmp(item->prevvalue_str,item->lastvalue_str) != 0) ) - { - DBescape_string(value_str,value_esc,MAX_STRING_LEN); -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=%d",now+item->delay,value_esc,now,item->itemid);*/ - snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=%d",calculate_item_nextcheck(item->nextcheck,item->delay,now),value_esc,now,item->itemid); - item->prevvalue=item->lastvalue; - item->lastvalue=value_double; - item->prevvalue_str=item->lastvalue_str; - /* Risky !!!*/ - item->lastvalue_str=value_str; - item->prevvalue_null=item->lastvalue_null; - item->lastvalue_null=0; - } - else - { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,lastclock=%d where itemid=%d",now+item->delay,now,item->itemid);*/ - snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,lastclock=%d where itemid=%d",calculate_item_nextcheck(item->nextcheck,item->delay,now),now,item->itemid); - } - } - /* Logic for delta as speed of change */ - else if(item->delta == ITEM_STORE_SPEED_PER_SECOND) - { - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) ) - { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=%d",now+item->delay,value_double,(value_double - item->prevorgvalue)/(now-item->lastclock),now,item->itemid);*/ - snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=%d",calculate_item_nextcheck(item->nextcheck,item->delay,now),value_double,(value_double - item->prevorgvalue)/(now-item->lastclock),now,item->itemid); - } - else - { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=%d",now+item->delay,value_double,now,item->itemid);*/ - snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=%d",calculate_item_nextcheck(item->nextcheck,item->delay,now),value_double,now,item->itemid); - } - - item->prevvalue=item->lastvalue; - item->lastvalue=(value_double - item->prevorgvalue)/(now-item->lastclock); - item->prevvalue_str=item->lastvalue_str; - /* Risky !!!*/ - item->lastvalue_str=value_str; - item->prevvalue_null=item->lastvalue_null; - item->lastvalue_null=0; - } - /* Real delta: simple difference between values */ - else if(item->delta == ITEM_STORE_SIMPLE_CHANGE) - { - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) ) - { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=%d",now+item->delay,value_double,(value_double - item->prevorgvalue),now,item->itemid);*/ - snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=%d",calculate_item_nextcheck(item->nextcheck,item->delay,now),value_double,(value_double - item->prevorgvalue),now,item->itemid); - } - else - { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=%d",now+item->delay,value_double,now,item->itemid);*/ - snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=%d",calculate_item_nextcheck(item->nextcheck,item->delay,now),value_double,now,item->itemid); - } - - item->prevvalue=item->lastvalue; - item->lastvalue=(value_double - item->prevorgvalue); - item->prevvalue_str=item->lastvalue_str; - /* Risky !!!*/ - item->lastvalue_str=value_str; - item->prevvalue_null=item->lastvalue_null; - item->lastvalue_null=0; - } - DBexecute(sql); - - update_functions( item ); -} diff --git a/include/functions.h b/include/functions.h deleted file mode 100644 index 1949bb5a..00000000 --- a/include/functions.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -** 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_FUNCTIONS_H -#define ZABBIX_FUNCTIONS_H - -#include "common.h" -#include "db.h" - -#define EVALUATE_FUNCTION_NORMAL 0 -#define EVALUATE_FUNCTION_SUFFIX 1 - -void update_triggers (int itemid); -int get_lastvalue(char *value,char *host,char *key,char *function,char *parameter); -int process_data(int sockfd,char *server,char *key, char *value); -void process_new_value(DB_ITEM *item,char *value); -int send_list_of_active_checks(int sockfd, char *host); - -#endif diff --git a/include/sysinfo.h b/include/sysinfo.h new file mode 100644 index 00000000..4e5cc40e --- /dev/null +++ b/include/sysinfo.h @@ -0,0 +1,134 @@ +/* +** 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_SYSINFO_H +#define ZABBIX_SYSINFO_H + +/* #define TEST_PARAMETERS */ + +#define SYSINFO_RET_OK 0 +#define SYSINFO_RET_FAIL 1 +#define SYSINFO_RET_TIMEOUT 2 + +#define COMMAND struct command_type +COMMAND +{ + char *key; + int (*function)(); + int (*function_str)(); + char *parameter; +}; + + + +void process(char *command, char *value); +void init_metrics(); + +void add_user_parameter(char *key,char *command); +void test_parameters(void); +int getPROC(char *file,int lineno,int fieldno, double *value); + +int BUFFERSMEM(const char *cmd, const char *parameter,double *value); +int CACHEDMEM(const char *cmd, const char *parameter,double *value); +int CKSUM(const char *cmd, const char *filename,double *value); + +int CPUIDLE1(const char *cmd, const char *parameter,double *value); +int CPUIDLE5(const char *cmd, const char *parameter,double *value); +int CPUIDLE15(const char *cmd, const char *parameter,double *value); +int CPUUSER1(const char *cmd, const char *parameter,double *value); +int CPUUSER5(const char *cmd, const char *parameter,double *value); +int CPUUSER15(const char *cmd, const char *parameter,double *value); +int CPUNICE1(const char *cmd, const char *parameter,double *value); +int CPUNICE5(const char *cmd, const char *parameter,double *value); +int CPUNICE15(const char *cmd, const char *parameter,double *value); +int CPUSYSTEM1(const char *cmd, const char *parameter,double *value); +int CPUSYSTEM5(const char *cmd, const char *parameter,double *value); +int CPUSYSTEM15(const char *cmd, const char *parameter,double *value); + +int FILESIZE(const char *cmd, const char *filename,double *value); +int DISKTOTAL(const char *cmd, const char *mountPoint,double *value); +int DISKFREE(const char *cmd, const char *mountPoint,double *value); +int DISKUSED(const char *cmd, const char *mountPoint,double *value); +int DISKFREE_PERC(const char *cmd, const char *mountPoint,double *value); +int DISKUSED_PERC(const char *cmd, const char *mountPoint,double *value); + +int DISK_IO(const char *cmd, const char *parameter,double *value); +int DISK_RIO(const char *cmd, const char *parameter,double *value); +int DISK_WIO(const char *cmd, const char *parameter,double *value); +int DISK_RBLK(const char *cmd, const char *parameter,double *value); +int DISK_WBLK(const char *cmd, const char *parameter,double *value); +int FREEMEM(const char *cmd, const char *parameter,double *value); + +int INODEFREE(const char *cmd, const char *mountPoint,double *value); +int INODEFREE_PERC(const char *cmd, const char *mountPoint,double *value); +int INODETOTAL(const char *cmd, const char *mountPoint,double *value); + +int ISFILE(const char *cmd, const char *filename,double *value); + +int KERNEL_MAXFILES(const char *cmd, const char *parameter,double *value); +int KERNEL_MAXPROC(const char *cmd, const char *parameter,double *value); +int NETLOADIN1(const char *cmd, const char *parameter,double *value); +int NETLOADIN5(const char *cmd, const char *parameter,double *value); +int NETLOADIN15(const char *cmd, const char *parameter,double *value); +int NETLOADOUT1(const char *cmd, const char *parameter,double *value); +int NETLOADOUT5(const char *cmd, const char *parameter,double *value); +int NETLOADOUT15(const char *cmd, const char *parameter,double *value); +int DISKREADOPS1(const char *cmd, const char *parameter,double *value); +int DISKREADOPS5(const char *cmd, const char *parameter,double *value); +int DISKREADOPS15(const char *cmd, const char *parameter,double *value); +int DISKREADBLKS1(const char *cmd, const char *parameter,double *value); +int DISKREADBLKS5(const char *cmd, const char *parameter,double *value); +int DISKREADBLKS15(const char *cmd, const char *parameter,double *value); +int DISKWRITEOPS1(const char *cmd, const char *parameter,double *value); +int DISKWRITEOPS5(const char *cmd, const char *parameter,double *value); +int DISKWRITEOPS15(const char *cmd, const char *parameter,double *value); +int DISKWRITEBLKS1(const char *cmd, const char *parameter,double *value); +int DISKWRITEBLKS5(const char *cmd, const char *parameter,double *value); +int DISKWRITEBLKS15(const char *cmd, const char *parameter,double *value); +int PING(const char *cmd, const char *parameter,double *value); +int SHAREDMEM(const char *cmd, const char *parameter,double *value); +int TOTALMEM(const char *cmd, const char *parameter,double *value); +int PROCCNT(const char *cmd, const char *parameter,double *value); +int PROCCOUNT(const char *cmd, const char *parameter,double *value); +int PROCLOAD(const char *cmd, const char *parameter,double *value); +int PROCLOAD5(const char *cmd, const char *parameter,double *value); +int PROCLOAD15(const char *cmd, const char *parameter,double *value); + +int SENSOR_TEMP1(const char *cmd, const char *parameter,double *value); +int SENSOR_TEMP2(const char *cmd, const char *parameter,double *value); +int SENSOR_TEMP3(const char *cmd, const char *parameter,double *value); + +int SWAPFREE(const char *cmd, const char *parameter,double *value); +int SWAPTOTAL(const char *cmd, const char *parameter,double *value); +int UPTIME(const char *cmd, const char *parameter,double *value); + +int TCP_LISTEN(const char *cmd, const char *porthex,double *value); + +int EXECUTE(const char *cmd, const char *command,double *value); +int EXECUTE_STR(const char *cmd, const char *command, const char *parameter, char **value); +int STRVERSION(const char *cmd, const char *command,char **value); + +int MD5SUM(const char *cmd, const char *filename, char **value); + +int CHECK_SERVICE(const char *cmd, const char *service,double *value); +int CHECK_SERVICE_PERF(const char *cmd, const char *service,double *value); +int CHECK_PORT(const char *cmd, const char *ip_and_port,double *value); + +#endif |
