Code

Bug from code-clean (Antony Simmonds - 846311)
[nagiosplug.git] / plugins / check_time.c
index b3210bc3e1f85b59319f7d0bcc61a3fb7bffe3ea..0de6718bb05a57a5522d0e07e32fbf48b1a6c559 100644 (file)
@@ -29,51 +29,6 @@ enum {
        TIME_PORT = 37
 };
 
-void
-print_usage (void)
-{
-       printf (_("\
-Usage: %s -H <host_address> [-p port] [-w variance] [-c variance]\n\
-    [-W connect_time] [-C connect_time] [-t timeout]\n"), progname);
-       printf (_(UT_HLP_VRS), progname, progname);
-}
-
-void
-print_help (void)
-{
-       char *myport;
-       asprintf (&myport, "%d", TIME_PORT);
-
-       print_revision (progname, revision);
-
-       printf (_("Copyright (c) 1999 Ethan Galstad\n"));
-       printf (_(COPYRIGHT), copyright, email);
-
-       printf (_("\
-This plugin will check the time on the specified host.\n\n"));
-
-       print_usage ();
-
-       printf (_(UT_HELP_VRSN));
-
-       printf (_(UT_HOST_PORT), 'p', myport);
-
-       printf (_("\
- -w, --warning-variance=INTEGER\n\
-    Time difference (sec.) necessary to result in a warning status\n\
- -c, --critical-variance=INTEGER\n\
-    Time difference (sec.) necessary to result in a critical status\n\
- -W, --warning-connect=INTEGER\n\
-    Response time (sec.) necessary to result in warning status\n\
- -C, --critical-connect=INTEGER\n\
-    Response time (sec.) necessary to result in critical status\n"));
-
-       printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
-
-       support ();
-}
-\f
-
 #define        UNIX_EPOCH 2208988800UL
 
 unsigned long server_time, raw_server_time;
@@ -88,18 +43,22 @@ unsigned long critical_diff = 0;
 int check_critical_diff = FALSE;
 int server_port = TIME_PORT;
 char *server_address = NULL;
-
+int use_udp = FALSE;
 
 int process_arguments (int, char **);
-void print_usage (void);
 void print_help (void);
-
+void print_usage (void);
 
 int
 main (int argc, char **argv)
 {
        int sd;
        int result;
+       time_t conntime;
+
+       setlocale (LC_ALL, "");
+       bindtextdomain (PACKAGE, LOCALEDIR);
+       textdomain (PACKAGE);
 
        if (process_arguments (argc, argv) != OK)
                usage (_("Invalid command arguments supplied\n"));
@@ -112,18 +71,38 @@ main (int argc, char **argv)
        time (&start_time);
 
        /* try to connect to the host at the given port number */
-       if (my_tcp_connect (server_address, server_port, &sd) != STATE_OK) {
+       if (use_udp) {
+               result = my_udp_connect (server_address, server_port, &sd);
+       } else {
+               result = my_tcp_connect (server_address, server_port, &sd);
+       }
+
+       if (result != STATE_OK) {
                if (check_critical_time == TRUE)
                        result = STATE_CRITICAL;
                else if (check_warning_time == TRUE)
                        result = STATE_WARNING;
                else
                        result = STATE_UNKNOWN;
-               terminate (result,
+               die (result,
                           _("TIME UNKNOWN - could not connect to server %s, port %d\n"),
                           server_address, server_port);
        }
 
+       if (use_udp) {
+               if (send (sd, "", 0, 0) < 0) {
+                       if (check_critical_time == TRUE)
+                               result = STATE_CRITICAL;
+                       else if (check_warning_time == TRUE)
+                               result = STATE_WARNING;
+                       else
+                               result = STATE_UNKNOWN;
+                       die (result, 
+                         _("TIME UNKNOWN - could not send UDP request to server %s, port %d\n"),
+                         server_address, server_port);
+               }
+       }
+
        /* watch for the connection string */
        result = recv (sd, (void *)&raw_server_time, sizeof (raw_server_time), 0);
 
@@ -142,21 +121,26 @@ main (int argc, char **argv)
                        result = STATE_WARNING;
                else
                        result = STATE_UNKNOWN;
-               terminate (result,
+               die (result,
                                                         _("TIME UNKNOWN - no data on recv() from server %s, port %d\n"),
                                                         server_address, server_port);
        }
 
        result = STATE_OK;
 
-       if (check_critical_time == TRUE && (end_time - start_time) > critical_time)
+       conntime = (end_time - start_time);
+       if (check_critical_time == TRUE && conntime > critical_time)
                result = STATE_CRITICAL;
-       else if (check_warning_time == TRUE
-                                        && (end_time - start_time) > warning_time) result = STATE_WARNING;
+       else if (check_warning_time == TRUE && conntime > warning_time)
+               result = STATE_WARNING;
 
        if (result != STATE_OK)
-               terminate (result, _("TIME %s - %d second response time\n"),
-                                                        state_text (result), (int) (end_time - start_time));
+               die (result, _("TIME %s - %d second response time|%s\n"),
+                    state_text (result), (int)conntime,
+                    perfdata ("time", (long)conntime, "s",
+                              check_warning_time, (long)warning_time,
+                              check_critical_time, (long)critical_time,
+                              TRUE, 0, FALSE, 0));
 
        server_time = ntohl (raw_server_time) - UNIX_EPOCH;
        if (server_time > (unsigned long)end_time)
@@ -169,8 +153,16 @@ main (int argc, char **argv)
        else if (check_warning_diff == TRUE && diff_time > (time_t)warning_diff)
                result = STATE_WARNING;
 
-       printf (_("TIME %s - %lu second time difference\n"), state_text (result),
-                                       diff_time);
+       printf (_("TIME %s - %lu second time difference|%s %s\n"),
+               state_text (result), diff_time,
+               perfdata ("time", (long)conntime, "s",
+                         check_warning_time, (long)warning_time,
+                         check_critical_time, (long)critical_time,
+                         TRUE, 0, FALSE, 0),
+               perfdata ("offset", (long)diff_time, "s",
+                         check_warning_diff, (long)warning_diff,
+                         check_critical_diff, (long)critical_diff,
+                         TRUE, 0, FALSE, 0));
        return result;
 }
 
@@ -185,14 +177,15 @@ process_arguments (int argc, char **argv)
 {
        int c;
 
-       int option_index = 0;
-       static struct option long_options[] = {
+       int option = 0;
+       static struct option longopts[] = {
                {"hostname", required_argument, 0, 'H'},
                {"warning-variance", required_argument, 0, 'w'},
                {"critical-variance", required_argument, 0, 'c'},
                {"warning-connect", required_argument, 0, 'W'},
                {"critical-connect", required_argument, 0, 'C'},
                {"port", required_argument, 0, 'p'},
+               {"udp", no_argument, 0, 'u'},
                {"timeout", required_argument, 0, 't'},
                {"version", no_argument, 0, 'V'},
                {"help", no_argument, 0, 'h'},
@@ -216,8 +209,8 @@ process_arguments (int argc, char **argv)
        }
 
        while (1) {
-               c = getopt_long (argc, argv, "hVH:w:c:W:C:p:t:", long_options,
-                                                                        &option_index);
+               c = getopt_long (argc, argv, "hVH:w:c:W:C:p:t:u", longopts,
+                                                                        &option);
 
                if (c == -1 || c == EOF)
                        break;
@@ -276,25 +269,31 @@ process_arguments (int argc, char **argv)
                case 'W':                                                                       /* warning-connect */
                        if (!is_intnonneg (optarg))
                                usage (_("Warning threshold must be a nonnegative integer\n"));
-                       warning_time = atoi (optarg);
+                       else
+                               warning_time = atoi (optarg);
                        check_warning_time = TRUE;
                        break;
                case 'C':                                                                       /* critical-connect */
                        if (!is_intnonneg (optarg))
                                usage (_("Critical threshold must be a nonnegative integer\n"));
-                       critical_time = atoi (optarg);
+                       else
+                               critical_time = atoi (optarg);
                        check_critical_time = TRUE;
                        break;
                case 'p':                                                                       /* port */
                        if (!is_intnonneg (optarg))
                                usage (_("Server port must be a nonnegative integer\n"));
-                       server_port = atoi (optarg);
+                       else
+                               server_port = atoi (optarg);
                        break;
                case 't':                                                                       /* timeout */
                        if (!is_intnonneg (optarg))
                                usage (_("Timeout interval must be a nonnegative integer\n"));
-                       socket_timeout = atoi (optarg);
+                       else
+                               socket_timeout = atoi (optarg);
                        break;
+               case 'u':                                                                       /* udp */
+                       use_udp = TRUE;
                }
        }
 
@@ -312,3 +311,57 @@ process_arguments (int argc, char **argv)
 
        return OK;
 }
+
+
+
+
+
+\f
+void
+print_help (void)
+{
+       char *myport;
+       asprintf (&myport, "%d", TIME_PORT);
+
+       print_revision (progname, revision);
+
+       printf (_("Copyright (c) 1999 Ethan Galstad\n"));
+       printf (_(COPYRIGHT), copyright, email);
+
+       printf (_("\
+This plugin will check the time on the specified host.\n\n"));
+
+       print_usage ();
+
+       printf (_(UT_HELP_VRSN));
+
+       printf (_(UT_HOST_PORT), 'p', myport);
+
+       printf (_("\
+ -u, --udp\n\
+    Use UDP to connect, not TCP\n\
+ -w, --warning-variance=INTEGER\n\
+    Time difference (sec.) necessary to result in a warning status\n\
+ -c, --critical-variance=INTEGER\n\
+    Time difference (sec.) necessary to result in a critical status\n\
+ -W, --warning-connect=INTEGER\n\
+    Response time (sec.) necessary to result in warning status\n\
+ -C, --critical-connect=INTEGER\n\
+    Response time (sec.) necessary to result in critical status\n"));
+
+       printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
+
+       printf (_(UT_SUPPORT));
+}
+
+
+
+
+void
+print_usage (void)
+{
+       printf (_("\
+Usage: %s -H <host_address> [-p port] [-u] [-w variance] [-c variance]\n\
+    [-W connect_time] [-C connect_time] [-t timeout]\n"), progname);
+       printf (_(UT_HLP_VRS), progname, progname);
+}