From 7712d9db24247343235bf2a119c99caee955ffdb Mon Sep 17 00:00:00 2001 From: Subhendu Ghosh Date: Tue, 25 Jun 2002 21:32:54 +0000 Subject: Check if IP address is specified on RBL - Tim Bell git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@60 f882894a-f735-0410-b71e-b25c423dba1c --- contrib/check_rbl.c | 329 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 contrib/check_rbl.c diff --git a/contrib/check_rbl.c b/contrib/check_rbl.c new file mode 100644 index 00000000..5c661135 --- /dev/null +++ b/contrib/check_rbl.c @@ -0,0 +1,329 @@ +/****************************************************************************** +* +* check_rbl.c +* +* Modified by Tim Bell 2002-06-05 +* based on: +* +* * check_dig.c +* * +* * Program: dig plugin for NetSaint +* * License: GPL +* * Copyright (c) 2000 +* * +* * $Id$ +* +*****************************************************************************/ + +#include "config.h" +#include "common.h" +#include "utils.h" +#include "popen.h" +#include "string.h" + +#define PROGNAME "check_rbl" + +int process_arguments(int, char **); +int call_getopt(int, char **); +int validate_arguments(void); +int check_disk(int usp,int free_disk); +void print_help(void); +void print_usage(void); +char *reverse_ipaddr(char *ipaddr); + +char *query_address=NULL; +char *query_address_rev=NULL; +char *dns_server=NULL; +char *rbl_name=NULL; +int verbose=FALSE; + +int main(int argc, char **argv){ + char input_buffer[MAX_INPUT_BUFFER]; + char *command_line=NULL; + char *output=NULL; + int result=STATE_OK; + + /* Set signal handling and alarm */ + if (signal(SIGALRM,popen_timeout_alarm_handler)==SIG_ERR) + usage("Cannot catch SIGALRM\n"); + + if (process_arguments(argc,argv)!=OK) + usage("Could not parse arguments\n"); + + /* reverse the octets in the IP address */ + query_address_rev = reverse_ipaddr(query_address); + + /* build the command to run */ + if (dns_server) { + command_line=ssprintf(command_line,"%s @%s %s.%s", + PATH_TO_DIG,dns_server, + query_address_rev, rbl_name); + } else { + command_line=ssprintf(command_line,"%s %s.%s", + PATH_TO_DIG, + query_address_rev, rbl_name); + } + alarm(timeout_interval); + time(&start_time); + + if (verbose) + printf("%s\n",command_line); + /* run the command */ + child_process=spopen(command_line); + if (child_process==NULL) { + printf("Could not open pipe: %s\n",command_line); + return STATE_UNKNOWN; + } + + child_stderr=fdopen(child_stderr_array[fileno(child_process)],"r"); + if(child_stderr==NULL) + printf("Could not open stderr for %s\n",command_line); + + output=strscpy(output,""); + + while (fgets(input_buffer,MAX_INPUT_BUFFER-1,child_process)) { + + /* the server is responding, we just got the host name... */ + if (strstr(input_buffer,";; ANSWER SECTION:")) { + + /* get the host address */ + if (!fgets(input_buffer,MAX_INPUT_BUFFER-1,child_process)) + break; + + if (strpbrk(input_buffer,"\r\n")) + input_buffer[strcspn(input_buffer,"\r\n")] = '\0'; + + if (strstr(input_buffer,query_address_rev)==input_buffer) { + output=strscpy(output,input_buffer); + /* we found it, which means it's listed! */ + result=STATE_CRITICAL; + } else { + strcpy(output,"Server not RBL listed."); + result=STATE_OK; + } + + continue; + } + + } + + /* + if (result!=STATE_OK) { + strcpy(output,"No ANSWER SECTION found"); + } + */ + + while (fgets(input_buffer,MAX_INPUT_BUFFER-1,child_stderr)) { + /* If we get anything on STDERR, at least set warning */ + result=error_set(result,STATE_WARNING); + printf("%s",input_buffer); + if (!strcmp(output,"")) + strcpy(output,1+index(input_buffer,':')); + } + + (void)fclose(child_stderr); + + /* close the pipe */ + if (spclose(child_process)) { + result=error_set(result,STATE_WARNING); + if (!strcmp(output,"")) + strcpy(output,"nslookup returned error status"); + } + + (void)time(&end_time); + + if (result==STATE_OK) + printf("RBL check okay - not listed.\n"); + else if (result==STATE_WARNING) + printf("RBL WARNING - %s\n",!strcmp(output,"")?" Probably a non-existent host/domain":output); + else if (result==STATE_CRITICAL) + printf("RBL CRITICAL - %s is listed on %s\n",query_address, rbl_name); + else + printf("DNS problem - %s\n",!strcmp(output,"")?" Probably a non-existent host/domain":output); + + return result; +} + +/* reverse the ipaddr */ +char *reverse_ipaddr(char *ipaddr) +{ + static char revip[MAX_HOST_ADDRESS_LENGTH]; + int a, b, c, d; + + if (strlen(ipaddr) >= MAX_HOST_ADDRESS_LENGTH || + sscanf(ipaddr, "%d.%d.%d.%d", &a, &b, &c, &d) != 4) { + usage("IP address invalid or too long"); + } + sprintf(revip, "%d.%d.%d.%d", d, c, b, a); + + return revip; +} + + +/* process command-line arguments */ +int process_arguments(int argc, char **argv) +{ + int c; + + if(argc<2) + return ERROR; + + + c=0; + while((c+=(call_getopt(argc-c,&argv[c])))