1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
/******************************************************************************************
*
* CHECK_IPXPING.C
*
* Program: IPX ping plugin for Nagios
* License: GPL
* Copyright (c) 1999 Ethan Galstad (nagios@nagios.org)
*
* Last Modified: 09-24-1999
*
* Command line: CHECK_IPXPING <dest_network> <dest_address> <wrtt> <crtt>
*
* Description:
*
* This plugin will use the /usr/bin/ipxping command to ping the specified host using the
* IPX protocol. Note: Linux users must have IPX support compiled into the kernerl and
* must have IPX configured correctly in order for this plugin to work.
* If the round trip time value is above the <wrtt> level, a STATE_WARNING is
* returned. If it exceeds the <crtt> level, a STATE_CRITICAL is returned.
*
*
*
* IMPORTANT!!
*
* This plugin will only work with the ipxping command that has been ported to Linux.
* The version for Sun takes different command line arguments and differs in its output.
*
*****************************************************************************************/
#include "config.h"
#include "common.h"
#include "netutils.h"
#include "popen.h"
/* this should be moved out to the configure script! */
#define IPXPING_COMMAND "/tmp/ipxping/ipxping"
/* these should be moved to the common header file */
#define MAX_IPXNET_ADDRESS_LENGTH 12
#define MAX_IPXHOST_ADDRESS_LENGTH 18
int socket_timeout=DEFAULT_SOCKET_TIMEOUT;
char dest_network[MAX_IPXNET_ADDRESS_LENGTH];
char dest_address[MAX_IPXHOST_ADDRESS_LENGTH];
int wrtt;
int crtt;
int process_arguments(int,char **);
FILE * spopen(const char *);
int spclose(FILE *);
int main(int argc, char **argv){
char command_line[MAX_INPUT_BUFFER];
int rtt;
int bytes_returned;
int result=STATE_OK;
FILE *fp;
char input_buffer[MAX_INPUT_BUFFER];
char *substr;
int current_line;
if(process_arguments(argc,argv)!=OK){
printf("Incorrect arguments supplied\n");
printf("\n");
printf("IPX ping plugin for Nagios\n");
printf("Copyright (c) 1999 Ethan Galstad (nagios@nagios.org)\n");
printf("Last Modified: 09-24-1999\n");
printf("License: GPL\n");
printf("\n");
printf("Usage: %s <dest_network> <dest_address> <wrtt> <crtt> [-to to_sec]\n",argv[0]);
printf("\n");
printf("Options:\n");
printf(" <dest_network> = IPX network that the remote host lies on. (Hex Format - 00:00:00:00)\n");
printf(" <dest_address> = MAC address of the remote host. (Hex Format - 00:00:00:00:00:00)\n");
printf(" <wrtt> = Round trip time in milliseconds necessary to result in a WARNING state\n");
printf(" <crtt> = Round trip time in milliseconds necessary to result in a CRITICAL state\n");
printf(" [to_sec] = Seconds before we should timeout waiting for ping result. Default = %d sec\n",DEFAULT_SOCKET_TIMEOUT);
printf("\n");
printf("Notes:\n");
printf("This plugin will use the /usr/bin/ipxping command to ping the specified host using\n");
printf("the IPX protocol. IPX support must be compiled into the kernel and your host must\n");
printf("be correctly configured to use IPX before this plugin will work! An RPM package of\n");
printf("the ipxping binary can be found at...\n");
printf("http://www.rpmfind.net/linux/RPM/contrib/libc5/i386/ipxping-0.0-2.i386.shtml\n");
printf("\n");
return STATE_UNKNOWN;
}
/* create the command line to use... */
sprintf(command_line,"%s %s %s",IPXPING_COMMAND,dest_network,dest_address);
/* initialize alarm signal handling */
signal(SIGALRM,socket_timeout_alarm_handler);
/* set socket timeout */
alarm(socket_timeout);
/* run the command */
fp = spopen(command_line);
if(fp==NULL){
printf("Unable to open pipe: %s",command_line);
return STATE_UNKNOWN;
}
current_line=0;
while(fgets(input_buffer,MAX_INPUT_BUFFER-1,fp)){
current_line++;
/* skip the first line of the output */
if(current_line==1)
continue;
/* we didn't get the "is alive" */
if(current_line==2 && !strstr(input_buffer,"is alive"))
result=STATE_CRITICAL;
/* get the round trip time */
if(current_line==3){
substr=strtok(input_buffer,":");
substr=strtok(NULL,"\n");
rtt=atoi(substr);
}
/* get the number of bytes returned */
if(current_line==4 && strstr(input_buffer,"bytes returned")){
bytes_returned=atoi(input_buffer);
}
}
/* close the pipe */
spclose(fp);
/* reset the alarm */
alarm(0);
if(current_line==1 || result==STATE_CRITICAL)
printf("IPX Ping problem - No response from host\n");
else{
if(rtt>crtt)
result=STATE_CRITICAL;
else if(rtt>wrtt)
result=STATE_WARNING;
printf("IPX Ping %s - RTT = %d ms, %d bytes returned from %s %s\n",(result==STATE_OK)?"ok":"problem",rtt,bytes_returned,dest_network,dest_address);
}
return result;
}
/* process all arguments passed on the command line */
int process_arguments(int argc, char **argv){
int x;
/* no options were supplied */
if(argc<5)
return ERROR;
/* get the destination network address */
strncpy(dest_network,argv[1],sizeof(dest_network)-1);
dest_network[sizeof(dest_network)-1]='\x0';
/* get the destination host address */
strncpy(dest_address,argv[2],sizeof(dest_address)-1);
dest_address[sizeof(dest_address)-1]='\x0';
/* get the round trip time variables */
wrtt=atoi(argv[3]);
crtt=atoi(argv[4]);
/* process remaining arguments */
for(x=6;x<=argc;x++){
/* we got the timeout to use */
if(!strcmp(argv[x-1],"-to")){
if(x<argc){
socket_timeout=atoi(argv[x]);
if(socket_timeout<=0)
return ERROR;
x++;
}
else
return ERROR;
}
/* else we got something else... */
else
return ERROR;
}
return OK;
}
|