diff options
-rw-r--r-- | include/common.h | 1 | ||||
-rw-r--r-- | include/functions.c | 3 | ||||
-rw-r--r-- | misc/conf/zabbix_server.conf | 2 | ||||
-rw-r--r-- | src/zabbix_agent/active.c | 151 | ||||
-rw-r--r-- | src/zabbix_agent/active.h | 8 | ||||
-rw-r--r-- | src/zabbix_server/trapper.c | 1 |
6 files changed, 92 insertions, 74 deletions
diff --git a/include/common.h b/include/common.h index 06dc974a..7cb3d9e0 100644 --- a/include/common.h +++ b/include/common.h @@ -46,6 +46,7 @@ #else #define MAX_STRING_LEN 4096 #endif +#define MAX_BUF_LEN 65000 /* Item types */ #define ITEM_TYPE_ZABBIX 0 diff --git a/include/functions.c b/include/functions.c index d434d090..c10bad26 100644 --- a/include/functions.c +++ b/include/functions.c @@ -2237,7 +2237,7 @@ int send_list_of_active_checks(int sockfd) } DBfree_result(result); - snprintf(s,sizeof(s)-1,"%s\n","ZBX_EOF:ZBX_EOF:ZBX_EOF:ZBX_EOF:ZBX_EOF"); + snprintf(s,sizeof(s)-1,"%s\n","ZBX_EOF"); zabbix_log( LOG_LEVEL_WARNING, "Sending [%s]", s); if( write(sockfd,s,strlen(s)) == -1 ) { @@ -2252,6 +2252,7 @@ int send_list_of_active_checks(int sockfd) close(sockfd); return FAIL; } + return SUCCEED; } diff --git a/misc/conf/zabbix_server.conf b/misc/conf/zabbix_server.conf index e299ac48..1a17fbce 100644 --- a/misc/conf/zabbix_server.conf +++ b/misc/conf/zabbix_server.conf @@ -94,4 +94,4 @@ DBUser=root # Get rid of sockets in TIME_WAIT state # This will set socket option SO_LINGER -NoTimeWait=1 +# NoTimeWait=1 diff --git a/src/zabbix_agent/active.c b/src/zabbix_agent/active.c index dfa3ed52..c58745a4 100644 --- a/src/zabbix_agent/active.c +++ b/src/zabbix_agent/active.c @@ -57,18 +57,69 @@ #include "stats.h" #include "active.h" +METRIC *metrics=NULL; + +void add_check(char *key, int refresh) +{ + + int i; + + for(i=0;;i++) + { + if(metrics[i].key == NULL) + { + + metrics[i].key=strdup(key); + metrics[i].refresh=refresh; + metrics[i].status=ITEM_STATUS_ACTIVE; + + metrics=realloc(metrics,(i+2)*sizeof(METRIC)); + metrics[i+1].key=NULL; + break; + } + } +} + +/* Parse list of active checks received from server */ +int parse_list_of_checks(char *str) +{ + char *line; + char *key, *refresh; + char *s1, *s2; + + metrics=malloc(sizeof(METRIC)); + metrics[0].key=NULL; + + line=(char *)strtok_r(str,"\n",&s1); + while(line!=NULL) + { + zabbix_log( LOG_LEVEL_WARNING, "Parsed [%s]", line); + + if(strcmp(line,"ZBX_EOF")==0) break; + + key=(char *)strtok_r(line,":",&s2); + zabbix_log( LOG_LEVEL_WARNING, "Key [%s]", key); + refresh=(char *)strtok_r(NULL,":",&s2); + zabbix_log( LOG_LEVEL_WARNING, "Refresh [%s]", refresh); + + add_check(key, atoi(refresh)); + + line=(char *)strtok_r(NULL,"\n",&s1); + } + + return SUCCEED; +} + int get_active_checks(char *server, int port, char *error, int max_error_len) { int s; int len; - char c[MAX_STRING_LEN]; + char c[MAX_BUF_LEN]; struct hostent *hp; struct sockaddr_in servaddr_in; - struct linger ling; - zabbix_log( LOG_LEVEL_WARNING, "get_active_checks: host[%s] port[%d]", server, port); servaddr_in.sin_family=AF_INET; @@ -87,15 +138,6 @@ int get_active_checks(char *server, int port, char *error, int max_error_len) s=socket(AF_INET,SOCK_STREAM,0); -/* if(CONFIG_NOTIMEWAIT == 1) - { - ling.l_onoff=1; - ling.l_linger=0; - if(setsockopt(s,SOL_SOCKET,SO_LINGER,&ling,sizeof(ling))==-1) - { - zabbix_log(LOG_LEVEL_WARNING, "Cannot setsockopt SO_LINGER [%s]", strerror(errno)); - } - }*/ if(s == -1) { zabbix_log(LOG_LEVEL_WARNING, "Cannot create socket [%s]", @@ -145,47 +187,31 @@ int get_active_checks(char *server, int port, char *error, int max_error_len) memset(c,0,MAX_STRING_LEN); - for(;;) + zabbix_log(LOG_LEVEL_WARNING, "Reading"); + len=read(s,c,MAX_BUF_LEN-1); + if(len == -1) { - zabbix_log(LOG_LEVEL_WARNING, "Reading"); - len=read(s,c,MAX_STRING_LEN); - if(len == -1) + switch (errno) { - switch (errno) - { - case EINTR: - zabbix_log( LOG_LEVEL_WARNING, "Timeout while receiving data from [%s]",server ); - snprintf(error,max_error_len-1,"Timeout while receiving data from [%s]",server); - break; - case ECONNRESET: - zabbix_log( LOG_LEVEL_WARNING, "Connection reset by peer."); - snprintf(error,max_error_len-1,"Connection reset by peer."); - close(s); - return NETWORK_ERROR; - default: + case EINTR: + zabbix_log( LOG_LEVEL_WARNING, "Timeout while receiving data from [%s]",server ); + snprintf(error,max_error_len-1,"Timeout while receiving data from [%s]",server); + break; + case ECONNRESET: + zabbix_log( LOG_LEVEL_WARNING, "Connection reset by peer."); + snprintf(error,max_error_len-1,"Connection reset by peer."); + close(s); + return NETWORK_ERROR; + default: zabbix_log( LOG_LEVEL_WARNING, "Error while receiving data from [%s] [%s]",server, strerror(errno)); snprintf(error,max_error_len-1,"Error while receiving data from [%s] [%s]",server, strerror(errno)); - } - close(s); - return FAIL; - } - else - { - if(len>0) - { - c[len-1]=0; - } - zabbix_log(LOG_LEVEL_WARNING, "Read [%s]", c); - if(strcmp(c,"ZBX_EOF") == 0) - { - zabbix_log( LOG_LEVEL_WARNING, "Received ZBX_EOF]"); -/* No more checks. End of file. */ - break; - } - // Add new check to the list - // add_new_check(c); - } + } + close(s); + return FAIL; } + zabbix_log(LOG_LEVEL_WARNING, "Read [%s]", c); + + parse_list_of_checks(c); if( close(s)!=0 ) { @@ -288,35 +314,20 @@ int send_value(char *server,int port,char *shortname,char *value) void process_active_checks() { char value[MAX_STRING_LEN]; - char *metrics[]={ - "diskfree[/]", - "disktotal[/]", - "diskused[/]", - "inodefree[/]", - "inodetotal[/]", - "memory[buffers]", - "memory[shared]", - "memory[cached]", - "memory[total]", - "system[procload]", - "system[procload5]", - "system[procload15]", - "swap[free]", - "swap[total]", - "version[zabbix_agent]", - NULL}; int i; char shortname[MAX_STRING_LEN]; - i=0; - while(metrics[i]!=NULL) + for(i=0;;i++) { - process(metrics[i], value); - snprintf(shortname, MAX_STRING_LEN-1,"%s:%s","a0",metrics[i]); + if(metrics[i].key == NULL) break; + + process(metrics[i].key, value); + + snprintf(shortname, MAX_STRING_LEN-1,"%s:%s","a0",metrics[i].key); + zabbix_log( LOG_LEVEL_WARNING, "%s",shortname); send_value("127.0.0.1",10051,shortname,value); - i++; } } diff --git a/src/zabbix_agent/active.h b/src/zabbix_agent/active.h index 4e293862..f4c71c2b 100644 --- a/src/zabbix_agent/active.h +++ b/src/zabbix_agent/active.h @@ -20,7 +20,13 @@ #ifndef ZABBIX_ACTIVE_H #define ZABBIX_ACTIVE_H -extern int CONFIG_NOTIMEWAIT; +#define METRIC struct metric_type +METRIC +{ + char *key; + int refresh; + int status; +}; pid_t child_active_make(int i,char *server, int port); diff --git a/src/zabbix_server/trapper.c b/src/zabbix_server/trapper.c index 43408c69..0e7f91d0 100644 --- a/src/zabbix_server/trapper.c +++ b/src/zabbix_server/trapper.c @@ -72,7 +72,6 @@ int process_trap(int sockfd,char *s) if(strcmp(s,"ZBX_GET_ACTIVE_CHECKS") == 0) { ret=send_list_of_active_checks(sockfd); - ret=send_list_of_active_checks(sockfd); } /* Process information sent by zabbix_sender */ else |