[Nagiosplug-checkins] nagiosplug/plugins Makefile.am,1.57,1.58 check_tcp.c,1.69,1.70 netutils.c,1.28,1.29 netutils.h,1.14,1.15 utils.h,1.23,1.24

M. Sean Finney seanius at users.sourceforge.net
Tue Oct 25 03:40:36 CEST 2005


Update of /cvsroot/nagiosplug/nagiosplug/plugins
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10788/plugins

Modified Files:
	Makefile.am check_tcp.c netutils.c netutils.h utils.h 
Log Message:
- added code to allow check_tcp (via np_net_connect) work with local
  unix sockets.  some testing would be welcome.  based on idea from
  Alex Samorukov.
- also introduced a check_clamd behavior in check_tcp.


Index: check_tcp.c
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/check_tcp.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -d -r1.69 -r1.70
--- check_tcp.c	19 Oct 2005 20:22:00 -0000	1.69
+++ check_tcp.c	25 Oct 2005 10:38:02 -0000	1.70
@@ -177,6 +177,12 @@
 		QUIT = "QUIT\r\n";
 		PORT = 119;
 	}
+	else if (strncmp(SERVICE, "CLAMD", 5)) {
+		SEND = "PING";
+		EXPECT = "PONG";
+		QUIT = NULL;
+		PORT = 3310;
+	}
 	/* fallthrough check, so it's supposed to use reverse matching */
 	else if (strcmp (SERVICE, "TCP"))
 		usage (_("CRITICAL - Generic check_tcp called with unknown service\n"));
@@ -318,10 +324,14 @@
 	printf(_("%s %s - "), SERVICE, state_text(result));
 
 	if(match == -2 && len && !(flags & FLAG_HIDE_OUTPUT))
-		printf("Unexpected response from host: %s", status);
-	else
-		printf("%.3f second response time on port %d",
-		       elapsed_time, server_port);
+		printf("Unexpected response from host/socket: %s", status);
+	else {
+		printf("%.3f second response time on ", elapsed_time);
+		if(server_address[0] != '/')
+			printf("port %d", server_port);
+		else
+			printf("socket %s", server_address);
+	}
 
 	if (match != -2 && !(flags & FLAG_HIDE_OUTPUT) && len)
 		printf (" [%s]", status);
@@ -431,8 +441,6 @@
 #endif
 			break;
 		case 'H':                 /* hostname */
-			if (is_host (optarg) == FALSE)
-				usage2 (_("Invalid hostname/address"), optarg);
 			server_address = optarg;
 			break;
 		case 'c':                 /* critical */
@@ -542,6 +550,8 @@
 
 	if (server_address == NULL)
 		usage4 (_("You must provide a server address"));
+	else if (is_host (optarg) == FALSE && optarg[0] != '/')
+		usage2 (_("Invalid hostname, address, or socket"), optarg);
 
 	return TRUE;
 }
@@ -555,7 +565,7 @@
 	printf ("Copyright (c) 1999 Ethan Galstad <nagios at nagios.org>\n");
 	printf (COPYRIGHT, copyright, email);
 
-	printf (_("This plugin tests %s connections with the specified host.\n\n"),
+	printf (_("This plugin tests %s connections with the specified host (or unix socket).\n\n"),
 	        SERVICE);
 
 	print_usage ();

Index: Makefile.am
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/Makefile.am,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- Makefile.am	24 Oct 2005 11:10:29 -0000	1.57
+++ Makefile.am	25 Oct 2005 10:38:02 -0000	1.58
@@ -17,7 +17,7 @@
 	urlize @EXTRAS@
 
 check_tcp_programs = check_ftp check_imap check_nntp check_pop \
-	check_udp2 @check_tcp_ssl@
+	check_udp2 check_clamd @check_tcp_ssl@
 
 EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \
 	check_swap check_fping check_ldap check_game check_dig \

Index: netutils.h
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/netutils.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- netutils.h	19 Oct 2005 20:22:00 -0000	1.14
+++ netutils.h	25 Oct 2005 10:38:02 -0000	1.15
@@ -40,6 +40,14 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 
+#ifdef HAVE_SYS_UN_H
+# include <sys/un.h>
+# ifndef UNIX_PATH_MAX
+   /* linux uses this, on sun it's hard-coded at 108 without a define */
+#  define UNIX_PATH_MAX 108
+# endif /* UNIX_PATH_MAX */
+#endif /* HAVE_SYS_UN_H */
+
 RETSIGTYPE socket_timeout_alarm_handler (int) __attribute__((noreturn));
 
 /* process_request and wrapper macros */

Index: utils.h
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/utils.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- utils.h	24 Oct 2005 11:10:29 -0000	1.23
+++ utils.h	25 Oct 2005 10:38:02 -0000	1.24
@@ -139,7 +139,7 @@
 
 #define UT_HOST_PORT "\
  -H, --hostname=ADDRESS\n\
-    Host name or IP Address\n\
+    Host name, IP Address, or unix socket (must be an absolute path)\n\
  -%c, --port=INTEGER\n\
     Port number (default: %s)\n"
 

Index: netutils.c
===================================================================
RCS file: /cvsroot/nagiosplug/nagiosplug/plugins/netutils.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- netutils.c	24 Oct 2005 11:10:29 -0000	1.28
+++ netutils.c	25 Oct 2005 10:38:02 -0000	1.29
@@ -155,42 +155,46 @@
 }
 
 
-/* opens a tcp or udp connection to a remote host */
+/* opens a tcp or udp connection to a remote host or local socket */
 int
 np_net_connect (const char *host_name, int port, int *sd, int proto)
 {
 	struct addrinfo hints;
-	struct addrinfo *res, *res0;
+	struct addrinfo *r, *res;
+	struct sockaddr_un su;
 	char port_str[6];
-	int result;
+	int socktype, result;
 
-	memset (&hints, 0, sizeof (hints));
-	hints.ai_family = address_family;
-	hints.ai_protocol = proto;
-	hints.ai_socktype = (proto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM;
+	socktype = (proto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM;
 
-	snprintf (port_str, sizeof (port_str), "%d", port);
-	result = getaddrinfo (host_name, port_str, &hints, &res0);
+	/* as long as it doesn't start with a '/', it's assumed a host or ip */
+	if(host_name[0] != '/'){
+		memset (&hints, 0, sizeof (hints));
+		hints.ai_family = address_family;
+		hints.ai_protocol = proto;
+		hints.ai_socktype = socktype;
 
-	if (result != 0) {
-		printf ("%s\n", gai_strerror (result));
-		return STATE_UNKNOWN;
-	}
-	else {
-		res = res0;
-		while (res) {
+		snprintf (port_str, sizeof (port_str), "%d", port);
+		result = getaddrinfo (host_name, port_str, &hints, &res);
+
+		if (result != 0) {
+			printf ("%s\n", gai_strerror (result));
+			return STATE_UNKNOWN;
+		}
+
+		r = res;
+		while (r) {
 			/* attempt to create a socket */
-			*sd = socket (res->ai_family, (proto == IPPROTO_UDP) ?
-			              SOCK_DGRAM : SOCK_STREAM, res->ai_protocol);
+			*sd = socket (r->ai_family, socktype, r->ai_protocol);
 
 			if (*sd < 0) {
 				printf (_("Socket creation failed\n"));
-				freeaddrinfo (res);
+				freeaddrinfo (r);
 				return STATE_UNKNOWN;
 			}
 
 			/* attempt to open a connection */
-			result = connect (*sd, res->ai_addr, res->ai_addrlen);
+			result = connect (*sd, r->ai_addr, r->ai_addrlen);
 
 			if (result == 0) {
 				was_refused = FALSE;
@@ -206,9 +210,25 @@
 			}
 
 			close (*sd);
-			res = res->ai_next;
+			r = r->ai_next;
 		}
-		freeaddrinfo (res0);
+		freeaddrinfo (res);
+	} 
+	/* else the hostname is interpreted as a path to a unix socket */
+	else {
+		if(strlen(host_name) >= UNIX_PATH_MAX){
+			die(_("Supplied path too long unix domain socket"));
+		}
+		memset(&su, 0, sizeof(su));
+		su.sun_family = AF_UNIX;
+		strncpy(su.sun_path, host_name, UNIX_PATH_MAX);
+		*sd = socket(PF_UNIX, SOCK_STREAM, 0);
+		if(sd < 0){
+			die(_("Socket creation failed"));
+		}
+		result = connect(*sd, (struct sockaddr *)&su, sizeof(su));
+		if (result < 0 && errno == ECONNREFUSED)
+			was_refused = TRUE;
 	}
 
 	if (result == 0)





More information about the Commits mailing list