diff options
-rw-r--r-- | plugins/check_ssh.c | 62 |
1 files changed, 16 insertions, 46 deletions
diff --git a/plugins/check_ssh.c b/plugins/check_ssh.c index faaead6..3efc2e6 100644 --- a/plugins/check_ssh.c +++ b/plugins/check_ssh.c | |||
@@ -34,7 +34,6 @@ int validate_arguments (void); | |||
34 | void print_help (void); | 34 | void print_help (void); |
35 | void print_usage (void); | 35 | void print_usage (void); |
36 | 36 | ||
37 | char *ssh_resolve (char *hostname); | ||
38 | int ssh_connect (char *haddr, short hport); | 37 | int ssh_connect (char *haddr, short hport); |
39 | 38 | ||
40 | int | 39 | int |
@@ -49,7 +48,7 @@ main (int argc, char **argv) | |||
49 | alarm (socket_timeout); | 48 | alarm (socket_timeout); |
50 | 49 | ||
51 | /* ssh_connect exits if error is found */ | 50 | /* ssh_connect exits if error is found */ |
52 | ssh_connect (ssh_resolve (server_name), port); | 51 | ssh_connect (server_name, port); |
53 | 52 | ||
54 | alarm (0); | 53 | alarm (0); |
55 | 54 | ||
@@ -62,6 +61,7 @@ int | |||
62 | process_arguments (int argc, char **argv) | 61 | process_arguments (int argc, char **argv) |
63 | { | 62 | { |
64 | int c; | 63 | int c; |
64 | char *tmp = NULL; | ||
65 | 65 | ||
66 | #ifdef HAVE_GETOPT_H | 66 | #ifdef HAVE_GETOPT_H |
67 | int option_index = 0; | 67 | int option_index = 0; |
@@ -109,6 +109,8 @@ process_arguments (int argc, char **argv) | |||
109 | socket_timeout = atoi (optarg); | 109 | socket_timeout = atoi (optarg); |
110 | break; | 110 | break; |
111 | case 'H': /* host */ | 111 | case 'H': /* host */ |
112 | if (is_host (optarg) == FALSE) | ||
113 | usage ("Invalid hostname/address\n"); | ||
112 | server_name = optarg; | 114 | server_name = optarg; |
113 | break; | 115 | break; |
114 | case 'p': /* port */ | 116 | case 'p': /* port */ |
@@ -125,9 +127,12 @@ process_arguments (int argc, char **argv) | |||
125 | 127 | ||
126 | c = optind; | 128 | c = optind; |
127 | if (server_name == NULL && argv[c]) { | 129 | if (server_name == NULL && argv[c]) { |
128 | server_name = argv[c++]; | 130 | if (is_host (argv[c])) { |
131 | server_name = argv[c++]; | ||
132 | } | ||
129 | } | 133 | } |
130 | else if (port == -1 && argv[c]) { | 134 | |
135 | if (port == -1 && argv[c]) { | ||
131 | if (is_intpos (argv[c])) { | 136 | if (is_intpos (argv[c])) { |
132 | port = atoi (argv[c++]); | 137 | port = atoi (argv[c++]); |
133 | } | 138 | } |
@@ -153,26 +158,6 @@ validate_arguments (void) | |||
153 | 158 | ||
154 | /************************************************************************ | 159 | /************************************************************************ |
155 | * | 160 | * |
156 | * Resolve hostname into IP address | ||
157 | * | ||
158 | *-----------------------------------------------------------------------*/ | ||
159 | |||
160 | char * | ||
161 | ssh_resolve (char *hostname) | ||
162 | { | ||
163 | struct hostent *host; | ||
164 | |||
165 | host = gethostbyname (hostname); | ||
166 | if (!host) { | ||
167 | herror (hostname); | ||
168 | exit (STATE_CRITICAL); | ||
169 | } | ||
170 | return (host->h_addr); | ||
171 | } | ||
172 | |||
173 | |||
174 | /************************************************************************ | ||
175 | * | ||
176 | * Try to connect to SSH server at specified server and port | 161 | * Try to connect to SSH server at specified server and port |
177 | * | 162 | * |
178 | *-----------------------------------------------------------------------*/ | 163 | *-----------------------------------------------------------------------*/ |
@@ -180,10 +165,8 @@ ssh_resolve (char *hostname) | |||
180 | int | 165 | int |
181 | ssh_connect (char *haddr, short hport) | 166 | ssh_connect (char *haddr, short hport) |
182 | { | 167 | { |
183 | int s; | 168 | int sd; |
184 | struct sockaddr_in addr; | 169 | int result; |
185 | int addrlen; | ||
186 | int len; | ||
187 | char *output = NULL; | 170 | char *output = NULL; |
188 | char *buffer = NULL; | 171 | char *buffer = NULL; |
189 | char *ssh_proto = NULL; | 172 | char *ssh_proto = NULL; |
@@ -192,27 +175,14 @@ ssh_connect (char *haddr, short hport) | |||
192 | 175 | ||
193 | sscanf ("$Revision$", "$Revision: %[0123456789.]", revision); | 176 | sscanf ("$Revision$", "$Revision: %[0123456789.]", revision); |
194 | 177 | ||
195 | addrlen = sizeof (addr); | 178 | result = my_tcp_connect (haddr, hport, &sd); |
196 | memset (&addr, 0, addrlen); | ||
197 | addr.sin_port = htons (hport); | ||
198 | addr.sin_family = AF_INET; | ||
199 | bcopy (haddr, (void *) &addr.sin_addr.s_addr, 4); | ||
200 | 179 | ||
201 | s = socket (AF_INET, SOCK_STREAM, 0); | 180 | if (result != STATE_OK) |
202 | if (!s) { | 181 | return result; |
203 | printf ("socket(): %s for %s:%d\n", strerror (errno), server_name, hport); | ||
204 | exit (STATE_CRITICAL); | ||
205 | } | ||
206 | |||
207 | if (connect (s, (struct sockaddr *) &addr, addrlen)) { | ||
208 | printf ("connect(): %s for %s:%d\n", strerror (errno), server_name, | ||
209 | hport); | ||
210 | exit (STATE_CRITICAL); | ||
211 | } | ||
212 | 182 | ||
213 | output = (char *) malloc (BUFF_SZ + 1); | 183 | output = (char *) malloc (BUFF_SZ + 1); |
214 | memset (output, 0, BUFF_SZ + 1); | 184 | memset (output, 0, BUFF_SZ + 1); |
215 | recv (s, output, BUFF_SZ, 0); | 185 | recv (sd, output, BUFF_SZ, 0); |
216 | if (strncmp (output, "SSH", 3)) { | 186 | if (strncmp (output, "SSH", 3)) { |
217 | printf ("Server answer: %s", output); | 187 | printf ("Server answer: %s", output); |
218 | exit (STATE_CRITICAL); | 188 | exit (STATE_CRITICAL); |
@@ -228,7 +198,7 @@ ssh_connect (char *haddr, short hport) | |||
228 | ("SSH ok - %s (protocol %s)\n", | 198 | ("SSH ok - %s (protocol %s)\n", |
229 | ssh_server, ssh_proto); | 199 | ssh_server, ssh_proto); |
230 | asprintf (&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, revision); | 200 | asprintf (&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, revision); |
231 | send (s, buffer, strlen (buffer), MSG_DONTWAIT); | 201 | send (sd, buffer, strlen (buffer), MSG_DONTWAIT); |
232 | if (verbose) | 202 | if (verbose) |
233 | printf ("%s\n", buffer); | 203 | printf ("%s\n", buffer); |
234 | exit (STATE_OK); | 204 | exit (STATE_OK); |