在nagios的被动检测中,nagios服务器需要启动nsca守护进程,客户端需要使用send_nsca将检测结果发送到nagios的nsca守护进程。这种方法服务器和客户端都需要安装相应的程序,现在我提供一种替代nsca的方法。
原理是:
借鉴了nsca守护进程的方法,将状态信息写到nagios的命令管道中,nagios会自动处理写入管道内的信息。
以下我用c写了一个cgi程序,客户端可以使用get的方法将检测的结果发送到nagios。以下为代码(provider.c):
#include
#include
#include
#include
#include
#include
#include
#include
#define FIFO_FILE "/var/nagios/rw/nagios.cmd" //根据nagios的配置,填写正确的路径
int ReplaceStr(char *sSrc, char *sMatchStr, char *sReplaceStr); //字符串替代函数,从网上搜到的,呵呵
int main(void)
{
FILE *fp;
char *data;
char pre_str[] = "PROCESS_SERVICE_CHECK_RESULT";
char host_name[30],svc_desc[30],return_code[2],plugin_output[1024],insert_str[1200];
int timestamp;
bzero(host_name,30);bzero(svc_desc,30);bzero(return_code,2);
bzero(plugin_output,1024);bzero(insert_str,1200);
printf("Content-Type:text/html\n\n");
// printf("\n"); //不输出html代码
// printf("\nWindows Provider Receiver\n\n");
// printf("\n");
data = getenv("QUERY_STRING");
if( sscanf(data,"host_name=%[^&]&svc_desc=%[^&]&return_code=%[^&]&plugin_output=%s",
host_name,svc_desc,return_code,plugin_output) != 4 ){
printf("parameter not enough!\n");
}else{
ReplaceStr(plugin_output,"%20"," "); //把%20替换为空格
ReplaceStr(plugin_output,"%7C","|"); //把%7C替换为|
timestamp = time((time_t*)NULL);
sprintf(insert_str,"[%d] %s;%s;%s;%s;%s",
timestamp,pre_str,host_name,svc_desc,return_code,plugin_output);
if ((fp = fopen(FIFO_FILE, "w")) == NULL) {
printf("fopen error.\n");
return 1;
}
if (fputs(insert_str, fp) == EOF) {
printf("write fifo error.\n");
return 1;
}
fclose(fp);
printf("success\n");
}
// printf("
\n");
// printf("\n");
return 0;
}
int ReplaceStr(char *sSrc, char *sMatchStr, char *sReplaceStr)
{
int StringLen;
char caNewString[2048];
char *FindPos = strstr(sSrc, sMatchStr);
if( (!FindPos) || (!sMatchStr) )
return -1;
while( FindPos )
{
memset(caNewString, 0, sizeof(caNewString));
StringLen = FindPos - sSrc;
strncpy(caNewString, sSrc, StringLen);
strcat(caNewString, sReplaceStr);
strcat(caNewString, FindPos + strlen(sMatchStr));
strcpy(sSrc, caNewString);
FindPos = strstr(sSrc, sMatchStr);
}
return 0;
}
使用方法:
gcc -o provider provider.c
然后将provider放到apache的cgi-bin目录下,注意不要放到nagios的cgi-bin目录下,否则会出现认证的提示。
客户端发送的get请求的格式是:
- All tests passed successfully in 0.923 seconds
阅读(2219) | 评论(0) | 转发(0) |