diff options
| author | hugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2002-07-18 18:17:14 +0000 |
|---|---|---|
| committer | hugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2002-07-18 18:17:14 +0000 |
| commit | 2bc8e9fcdad98cfc5edea775de1d8860ecebf48e (patch) | |
| tree | d2ce5471d5c66dfbf551c8f7d30dd6fc16c018c1 | |
| parent | 8475723684b40317ac8d43b26fb97d26d2787c15 (diff) | |
- empty result for DBselect is always checked (Alexei)
git-svn-id: svn://svn.zabbix.com/trunk@435 97f52cf1-0a1b-0410-bd0e-c28be96e8082
| -rw-r--r-- | ChangeLog | 2 | ||||
| -rw-r--r-- | include/functions.c | 94 | ||||
| -rw-r--r-- | src/zabbix_sucker/zabbix_sucker.c | 70 |
3 files changed, 117 insertions, 49 deletions
@@ -14,11 +14,11 @@ Hope this helps. Not ready yet: - - some emails are missing - solution for problems with template-based hosts must be proposed Changes for 1.0beta5: + - empty result for DBselect is always checked (Alexei) - fixed send_email(). According to RFC, DATA should be sent with followed EOL (Alexei) - fixed memory leak in main_alerter_loop(). Added DBfree_result(). (Alexei) diff --git a/include/functions.c b/include/functions.c index 8e60911e..4cc57a87 100644 --- a/include/functions.c +++ b/include/functions.c @@ -257,7 +257,8 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch struct sockaddr_in myaddr_in; struct sockaddr_in servaddr_in; - char *OK_250="250 OK"; + char *OK_220="220"; + char *OK_250="250"; zabbix_log( LOG_LEVEL_DEBUG, "SENDING MAIL"); @@ -290,8 +291,25 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); + i=sizeof(struct sockaddr_in); + i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); + if(i == -1) + { + zabbix_log(LOG_LEVEL_ERR, "Error receiving initial infor from SMTP server."); + close(s); + return FAIL; + } + if(strncmp(OK_220,c,strlen(OK_220)) != 0) + { + zabbix_log(LOG_LEVEL_ERR, "No welcome message 220* [%s]", c); + close(s); + return FAIL; + } + if(strlen(smtp_helo) != 0) { + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"HELO %s\n",smtp_helo); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -301,6 +319,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); i=sizeof(struct sockaddr_in); i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); if(i == -1) @@ -311,12 +330,13 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch } if(strncmp(OK_250,c,strlen(OK_250)) != 0) { - zabbix_log(LOG_LEVEL_ERR, "Wrong answer on HELO [%s]", c); + zabbix_log(LOG_LEVEL_ERR, "Wrong answer on HELO [%s]",c); close(s); return FAIL; } } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"MAIL FROM: %s\n",smtp_email); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -325,6 +345,8 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch close(s); return FAIL; } + + memset(c,0,MAX_STRING_LEN+1); i=sizeof(struct sockaddr_in); i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); if(i == -1) @@ -340,6 +362,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"RCPT TO: <%s>\n",mailto); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -348,6 +371,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch close(s); return FAIL; } + memset(c,0,MAX_STRING_LEN+1); i=sizeof(struct sockaddr_in); i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); if(i == -1) @@ -363,6 +387,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"DATA\n"); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -371,6 +396,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch close(s); return FAIL; } + memset(c,0,MAX_STRING_LEN+1); i=sizeof(struct sockaddr_in); i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); if(i == -1) @@ -386,6 +412,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"Subject: %s\n%s",mailsubject, mailbody); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -395,6 +422,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"\n.\n"); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -403,6 +431,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch close(s); return FAIL; } + memset(c,0,MAX_STRING_LEN+1); i=sizeof(struct sockaddr_in); i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); if(i == -1) @@ -418,6 +447,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"\n"); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e ==- 1) @@ -426,6 +456,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch close(s); return FAIL; } + memset(c,0,MAX_STRING_LEN+1); i=sizeof(struct sockaddr_in); i=recvfrom(s,c,MAX_STRING_LEN,0,(struct sockaddr *)&servaddr_in,&i); if(i == -1) @@ -435,6 +466,7 @@ int send_mail(char *smtp_server,char *smtp_helo,char *smtp_email,char *mailto,ch return FAIL; } + memset(c,0,MAX_STRING_LEN+1); sprintf(c,"QUIT\n"); e=sendto(s,c,strlen(c),0,(struct sockaddr *)&servaddr_in,sizeof(struct sockaddr_in)); if(e == -1) @@ -522,6 +554,13 @@ void apply_actions(int triggerid,int good) sprintf(sql,"select actionid,userid,delay,subject,message from actions where triggerid=%d and good=%d and nextcheck<=%d",triggerid,good,now); result = DBselect(sql); + if(DBis_empty(result) == SUCCEED) + { + zabbix_log( LOG_LEVEL_DEBUG, "No actions applied."); + DBfree_result(result); + return; + } + rows = DBnum_rows(result); for(i=0;i<rows;i++) @@ -561,41 +600,48 @@ void update_serv(int serviceid) sprintf(sql,"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++) + if(DBis_empty(result) != SUCCEED) { - serviceupid=atoi(DBget_field(result,i,0)); - algorithm=atoi(DBget_field(result,i,1)); - if(SERVICE_ALGORITHM_NONE == algorithm) + 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) - { - 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++) + } + else if(SERVICE_ALGORITHM_MAX == algorithm) { - if(atoi(DBget_field(result2,j,0))>status) + 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++) { - status=atoi(DBget_field(result2,j,0)); + if(atoi(DBget_field(result2,j,0))>status) + { + status=atoi(DBget_field(result2,j,0)); + } } + sprintf(sql,"update services set status=%d where serviceid=%d",status,atoi(DBget_field(result,i,0))); + DBexecute(sql); + DBfree_result(result2); + } + else + { + zabbix_log( LOG_LEVEL_ERR, "Unknown calculation algorithm of service status [%d]", algorithm); } - sprintf(sql,"update services set status=%d where serviceid=%d",status,atoi(DBget_field(result,i,0))); - DBexecute(sql); - DBfree_result(result2); - } - else - { - zabbix_log( LOG_LEVEL_ERR, "Unknown calculation algorithm of service status [%d]", algorithm); } - } + } DBfree_result(result); sprintf(sql,"select serviceupid from services_links where servicedownid=%d",serviceid); result=DBselect(sql); - for(i=0;i<DBnum_rows(result);i++) + + if(DBis_empty(result) != SUCCEED) { - update_serv(atoi(DBget_field(result,i,0))); + for(i=0;i<DBnum_rows(result);i++) + { + update_serv(atoi(DBget_field(result,i,0))); + } } DBfree_result(result); } diff --git a/src/zabbix_sucker/zabbix_sucker.c b/src/zabbix_sucker/zabbix_sucker.c index 78eff4cb..5d9320fd 100644 --- a/src/zabbix_sucker/zabbix_sucker.c +++ b/src/zabbix_sucker/zabbix_sucker.c @@ -813,6 +813,13 @@ int housekeeping_alerts(int now) sprintf(sql,"select alert_history from config"); result = DBselect(sql); + if(DBis_empty(result) == SUCCEED) + { + zabbix_log( LOG_LEVEL_ERR, "No records in table 'config'."); + DBfree_result(result); + exit (FAIL); + } + alert_history=atoi(DBget_field(result,0,0)); sprintf (sql,"delete from alerts where clock<%d",now-24*3600*alert_history); @@ -830,6 +837,12 @@ int housekeeping_alarms(int now) sprintf(sql,"select alarm_history from config"); result = DBselect(sql); + if(DBis_empty(result) == SUCCEED) + { + zabbix_log( LOG_LEVEL_ERR, "No records in table 'config'."); + DBfree_result(result); + exit (FAIL); + } alarm_history=atoi(DBget_field(result,0,0)); @@ -862,6 +875,12 @@ int main_alerter_loop() sprintf(sql,"select smtp_server,smtp_helo,smtp_email from config"); result = DBselect(sql); + if(DBis_empty(result) == SUCCEED) + { + zabbix_log( LOG_LEVEL_ERR, "No records in table 'config'."); + DBfree_result(result); + exit (FAIL); + } strncpy(smtp_server,DBget_field(result,0,0), MAX_STRING_LEN); strncpy(smtp_helo,DBget_field(result,0,1), MAX_STRING_LEN); strncpy(smtp_email,DBget_field(result,0,2), MAX_STRING_LEN); @@ -870,37 +889,40 @@ int main_alerter_loop() sprintf(sql,"select alertid,type,sendto,subject,message,status,retries from alerts where status=0 and retries<3 order by clock"); result = DBselect(sql); - for(i=0;i<DBnum_rows(result);i++) - { - alert.alertid=atoi(DBget_field(result,i,0)); - alert.type=DBget_field(result,i,1); - alert.sendto=DBget_field(result,i,2); - alert.subject=DBget_field(result,i,3); - alert.message=DBget_field(result,i,4); - alert.status=atoi(DBget_field(result,i,5)); - alert.retries=atoi(DBget_field(result,i,6)); - - if(strcmp(alert.type,ALERT_TYPE_EMAIL)==0) + if(DBis_empty(result) != SUCCEED) + { + for(i=0;i<DBnum_rows(result);i++) { - if(FAIL == send_mail(smtp_server,smtp_helo,smtp_email,alert.sendto,alert.subject,alert.message)) + alert.alertid=atoi(DBget_field(result,i,0)); + alert.type=DBget_field(result,i,1); + alert.sendto=DBget_field(result,i,2); + alert.subject=DBget_field(result,i,3); + alert.message=DBget_field(result,i,4); + alert.status=atoi(DBget_field(result,i,5)); + alert.retries=atoi(DBget_field(result,i,6)); + + if(strcmp(alert.type,ALERT_TYPE_EMAIL)==0) { - zabbix_log( LOG_LEVEL_ERR, "Error sending email to '%s' Subject:'%s'", alert.sendto, alert.subject); - sprintf(sql,"update alerts set retries=retries+1 where alertid=%d", alert.alertid); - DBexecute(sql); + if(FAIL == send_mail(smtp_server,smtp_helo,smtp_email,alert.sendto,alert.subject,alert.message)) + { + zabbix_log( LOG_LEVEL_ERR, "Error sending email to '%s' Subject:'%s'", alert.sendto, alert.subject); + sprintf(sql,"update alerts set retries=retries+1 where alertid=%d", alert.alertid); + DBexecute(sql); + } + else + { + sprintf(sql,"update alerts set status=1 where alertid=%d", alert.alertid); + DBexecute(sql); + } } else { - sprintf(sql,"update alerts set status=1 where alertid=%d", alert.alertid); - DBexecute(sql); + sprintf(sql,"update alerts set retries=3 where alertid=%d", alert.alertid); + DBexecute(sql); + zabbix_log( LOG_LEVEL_ERR, "Unsupported type of alert [%s] Alert ID [%d]", alert.type, alert.alertid ); } } - else - { - sprintf(sql,"update alerts set retries=3 where alertid=%d", alert.alertid); - DBexecute(sql); - zabbix_log( LOG_LEVEL_ERR, "Unsupported type of alert [%s] Alert ID [%d]", alert.type, alert.alertid ); - } - } + } DBfree_result(result); DBclose(); |
