diff options
author | M. Sean Finney <seanius@users.sourceforge.net> | 2005-10-25 10:38:02 +0000 |
---|---|---|
committer | M. Sean Finney <seanius@users.sourceforge.net> | 2005-10-25 10:38:02 +0000 |
commit | 16cd0c8151eee652d88b0b6f3aaa5b917cb87e13 (patch) | |
tree | 9587540f51701d62d73670c6c1963f9119c793b5 /plugins | |
parent | ceebd58040b1688749d58dd76963af639cf8c803 (diff) | |
download | monitoring-plugins-16cd0c8151eee652d88b0b6f3aaa5b917cb87e13.tar.gz |
- 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.
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1261 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/Makefile.am | 2 | ||||
-rw-r--r-- | plugins/check_tcp.c | 24 | ||||
-rw-r--r-- | plugins/netutils.c | 64 | ||||
-rw-r--r-- | plugins/netutils.h | 8 | ||||
-rw-r--r-- | plugins/utils.h | 2 |
5 files changed, 69 insertions, 31 deletions
diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 569199d8..4c33ee17 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -17,7 +17,7 @@ libexec_PROGRAMS = check_disk check_dummy check_http check_load \ 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 \ diff --git a/plugins/check_tcp.c b/plugins/check_tcp.c index 1b6513ba..3aef1e7e 100644 --- a/plugins/check_tcp.c +++ b/plugins/check_tcp.c @@ -177,6 +177,12 @@ main (int argc, char **argv) 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 @@ main (int argc, char **argv) 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 @@ process_arguments (int argc, char **argv) #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 @@ process_arguments (int argc, char **argv) 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 @@ print_help (void) printf ("Copyright (c) 1999 Ethan Galstad <nagios@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 (); diff --git a/plugins/netutils.c b/plugins/netutils.c index 08245276..6f3a1510 100644 --- a/plugins/netutils.c +++ b/plugins/netutils.c @@ -155,42 +155,46 @@ process_request (const char *server_address, int server_port, int proto, } -/* 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 @@ np_net_connect (const char *host_name, int port, int *sd, int proto) } close (*sd); - res = res->ai_next; + r = r->ai_next; + } + 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")); } - freeaddrinfo (res0); + result = connect(*sd, (struct sockaddr *)&su, sizeof(su)); + if (result < 0 && errno == ECONNREFUSED) + was_refused = TRUE; } if (result == 0) diff --git a/plugins/netutils.h b/plugins/netutils.h index 9b0557d3..8bc7bd61 100644 --- a/plugins/netutils.h +++ b/plugins/netutils.h @@ -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 */ diff --git a/plugins/utils.h b/plugins/utils.h index ffdb5457..2d976345 100644 --- a/plugins/utils.h +++ b/plugins/utils.h @@ -139,7 +139,7 @@ char *fperfdata (const char *, #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" |