diff options
author | hugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2005-04-30 21:31:12 +0000 |
---|---|---|
committer | hugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2005-04-30 21:31:12 +0000 |
commit | 7d54eb242f408269546d2e9c48ee23ce4f58f5bf (patch) | |
tree | cd9f91213ba48b38d7cc5327f8fc001f10721f46 /src/zabbix_agent | |
parent | 0125f92acb37efba54980b577d8d157aeca250b8 (diff) | |
download | zabbix-7d54eb242f408269546d2e9c48ee23ce4f58f5bf.tar.gz zabbix-7d54eb242f408269546d2e9c48ee23ce4f58f5bf.tar.xz zabbix-7d54eb242f408269546d2e9c48ee23ce4f58f5bf.zip |
More support for active checks.
git-svn-id: svn://svn.zabbix.com/trunk@1738 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/zabbix_agent')
-rw-r--r-- | src/zabbix_agent/active.c | 151 | ||||
-rw-r--r-- | src/zabbix_agent/active.h | 8 |
2 files changed, 88 insertions, 71 deletions
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); |