Chinaunix首页 | 论坛 | 博客
  • 博客访问: 528629
  • 博文数量: 81
  • 博客积分: 8020
  • 博客等级: 中将
  • 技术积分: 1085
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-08 10:36
文章分类

全部博文(81)

文章存档

2010年(3)

2009年(25)

2008年(53)

我的朋友

分类: LINUX

2008-09-12 15:59:07

在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) |
给主人留下些什么吧!~~