summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2002-07-18 18:17:14 +0000
committerhugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2002-07-18 18:17:14 +0000
commit2bc8e9fcdad98cfc5edea775de1d8860ecebf48e (patch)
treed2ce5471d5c66dfbf551c8f7d30dd6fc16c018c1
parent8475723684b40317ac8d43b26fb97d26d2787c15 (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--ChangeLog2
-rw-r--r--include/functions.c94
-rw-r--r--src/zabbix_sucker/zabbix_sucker.c70
3 files changed, 117 insertions, 49 deletions
diff --git a/ChangeLog b/ChangeLog
index b41e477f..dda43a45 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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();