aboutsummaryrefslogtreecommitdiff
path: root/contrib/check_ipxping.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/check_ipxping.c')
-rw-r--r--contrib/check_ipxping.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/contrib/check_ipxping.c b/contrib/check_ipxping.c
new file mode 100644
index 00000000..1ba10fe6
--- /dev/null
+++ b/contrib/check_ipxping.c
@@ -0,0 +1,200 @@
+/******************************************************************************************
+ *
+ * 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 "../common/config.h"
+#include "../common/common.h"
+#include "netutils.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;
+ }
+
+
+
+