Code

semicolon needed where praogname define was replced
[nagiosplug.git] / plugins / check_ssh.c
1 /*
2 * check_ssh.c
3
4 * Made by (Remi PAULMIER)
5 * Login   <remi@sinfomic.fr>
6
7 * Started on  Fri Jul  9 09:18:23 1999 Remi PAULMIER
8 * Update Thu Jul 22 12:50:04 1999 remi paulmier
9 * $Id$
10 *
11 */
13 #include "config.h"
14 #include "common.h"
15 #include "netutils.h"
16 #include "utils.h"
18 const char *progname = "check_ssh";
19 #define REVISION "$Revision$"
21 #ifndef MSG_DONTWAIT
22 #define MSG_DONTWAIT 0
23 #endif
25 #define SSH_DFL_PORT    22
26 #define BUFF_SZ         256
28 short port = -1;
29 char *server_name = NULL;
30 int verbose = FALSE;
32 int process_arguments (int, char **);
33 int validate_arguments (void);
34 void print_help (void);
35 void print_usage (void);
37 char *ssh_resolve (char *hostname);
38 int ssh_connect (char *haddr, short hport);
40 int
41 main (int argc, char **argv)
42 {
44         if (process_arguments (argc, argv) == ERROR)
45                 usage ("Could not parse arguments\n");
47         /* initialize alarm signal handling */
48         signal (SIGALRM, socket_timeout_alarm_handler);
49         alarm (socket_timeout);
51         /* ssh_connect exits if error is found */
52         ssh_connect (ssh_resolve (server_name), port);
54         alarm (0);
56         return (STATE_OK);
57 }
60 /* process command-line arguments */
61 int
62 process_arguments (int argc, char **argv)
63 {
64         int c;
66 #ifdef HAVE_GETOPT_H
67         int option_index = 0;
68         static struct option long_options[] = {
69                 {"version", no_argument, 0, 'V'},
70                 {"help", no_argument, 0, 'h'},
71                 {"verbose", no_argument, 0, 'v'},
72                 {"timeout", required_argument, 0, 't'},
73                 {"host", required_argument, 0, 'H'},
74                 {0, 0, 0, 0}
75         };
76 #endif
78         if (argc < 2)
79                 return ERROR;
81         for (c = 1; c < argc; c++)
82                 if (strcmp ("-to", argv[c]) == 0)
83                         strcpy (argv[c], "-t");
85         while (1) {
86 #ifdef HAVE_GETOPT_H
87                 c = getopt_long (argc, argv, "+Vhvt:H:p:", long_options, &option_index);
88 #else
89                 c = getopt (argc, argv, "+Vhvt:H:p:");
90 #endif
91                 if (c == -1 || c == EOF)
92                         break;
94                 switch (c) {
95                 case '?':                                                                       /* help */
96                         usage ("");
97                 case 'V':                                                                       /* version */
98                         print_revision (progname, REVISION);
99                         exit (STATE_OK);
100                 case 'h':                                                                       /* help */
101                         print_help ();
102                         exit (STATE_OK);
103                 case 'v':                                                                       /* verose */
104                         verbose = TRUE;
105                         break;
106                 case 't':                                                                       /* timeout period */
107                         if (!is_integer (optarg))
108                                 usage ("Timeout Interval must be an integer!\n\n");
109                         socket_timeout = atoi (optarg);
110                         break;
111                 case 'H':                                                                       /* host */
112                         server_name = optarg;
113                         break;
114                 case 'p':                                                                       /* port */
115                         if (is_intpos (optarg)) {
116                                 port = atoi (optarg);
117                         }
118                         else {
119                                 printf ("Port number nust be a positive integer: %s\n", optarg);
120                                 usage ("");
121                         }
122                 }
124         }
126         c = optind;
127         if (server_name == NULL && argv[c]) {
128                 server_name = argv[c++];
129         }
130         else if (port == -1 && argv[c]) {
131                 if (is_intpos (argv[c])) {
132                         port = atoi (argv[c++]);
133                 }
134                 else {
135                         print_usage ();
136                         exit (STATE_UNKNOWN);
137                 }
138         }
140         return validate_arguments ();
143 int
144 validate_arguments (void)
146         if (server_name == NULL)
147                 return ERROR;
148         if (port == -1)                                                         /* funky, but allows -p to override stray integer in args */
149                 port = SSH_DFL_PORT;
150         return OK;
154 /************************************************************************
156 * Resolve hostname into IP address
158 *-----------------------------------------------------------------------*/
160 char *
161 ssh_resolve (char *hostname)
163         struct hostent *host;
165         host = gethostbyname (hostname);
166         if (!host) {
167                 herror (hostname);
168                 exit (STATE_CRITICAL);
169         }
170         return (host->h_addr);
174 /************************************************************************
176 * Try to connect to SSH server at specified server and port
178 *-----------------------------------------------------------------------*/
180 int
181 ssh_connect (char *haddr, short hport)
183         int s;
184         struct sockaddr_in addr;
185         int addrlen;
186         int len;
187         char *output = NULL;
188         char *buffer = NULL;
189         char *ssh_proto = NULL;
190         char *ssh_server = NULL;
191         char revision[20];
193         sscanf ("$Revision$", "$Revision: %[0123456789.]", revision);
195         addrlen = sizeof (addr);
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);
201         s = socket (AF_INET, SOCK_STREAM, 0);
202         if (!s) {
203                 printf ("socket(): %s for %s:%d\n", strerror (errno), server_name, hport);
204                 exit (STATE_CRITICAL);
205         }
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         }
213         output = (char *) malloc (BUFF_SZ + 1);
214         memset (output, 0, BUFF_SZ + 1);
215         recv (s, output, BUFF_SZ, 0);
216         if (strncmp (output, "SSH", 3)) {
217                 printf ("Server answer: %s", output);
218                 exit (STATE_CRITICAL);
219         }
220         else {
221                 strip (output);
222                 if (verbose)
223                         printf ("%s\n", output);
224                 ssh_proto = output + 4;
225                 ssh_server = ssh_proto + strspn (ssh_proto, "-0123456789. ");
226                 ssh_proto[strspn (ssh_proto, "0123456789. ")] = 0;
227                 printf
228                         ("SSH ok - %s (protocol %s)\n",
229                          ssh_server, ssh_proto);
230                 asprintf (&buffer, "SSH-%s-check_ssh_%s\r\n", ssh_proto, revision);
231                 send (s, buffer, strlen (buffer), MSG_DONTWAIT);
232                 if (verbose)
233                         printf ("%s\n", buffer);
234                 exit (STATE_OK);
235         }
238 void
239 print_help (void)
241         print_revision (progname, REVISION);
242         printf ("Copyright (c) 1999 Remi Paulmier (remi@sinfomic.fr)\n\n");
243         print_usage ();
244         printf ("by default, port is %d\n", SSH_DFL_PORT);
247 void
248 print_usage (void)
250         printf
251                 ("Usage:\n"
252                  " %s -t [timeout] -p [port] <host>\n"
253                  " %s -V prints version info\n"
254                  " %s -h prints more detailed help\n", progname, progname, progname);
257 /* end of check_ssh.c */