diff options
Diffstat (limited to 'plugins/check_users.c')
-rw-r--r-- | plugins/check_users.c | 68 |
1 files changed, 18 insertions, 50 deletions
diff --git a/plugins/check_users.c b/plugins/check_users.c index 8368612a..c581fb29 100644 --- a/plugins/check_users.c +++ b/plugins/check_users.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * Nagios check_users plugin | 3 | * Nagios check_users plugin |
4 | * | 4 | * |
5 | * License: GPL | 5 | * License: GPL |
6 | * Copyright (c) 2000-2007 Nagios Plugins Development Team | 6 | * Copyright (c) 2000-2012 Nagios Plugins Development Team |
7 | * | 7 | * |
8 | * Description: | 8 | * Description: |
9 | * | 9 | * |
@@ -35,8 +35,8 @@ const char *copyright = "2000-2007"; | |||
35 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; | 35 | const char *email = "nagiosplug-devel@lists.sourceforge.net"; |
36 | 36 | ||
37 | #include "common.h" | 37 | #include "common.h" |
38 | #include "popen.h" | ||
39 | #include "utils.h" | 38 | #include "utils.h" |
39 | #include <utmpx.h> | ||
40 | 40 | ||
41 | #define possibly_set(a,b) ((a) == 0 ? (b) : 0) | 41 | #define possibly_set(a,b) ((a) == 0 ? (b) : 0) |
42 | 42 | ||
@@ -52,58 +52,33 @@ main (int argc, char **argv) | |||
52 | { | 52 | { |
53 | int users = -1; | 53 | int users = -1; |
54 | int result = STATE_UNKNOWN; | 54 | int result = STATE_UNKNOWN; |
55 | char input_buffer[MAX_INPUT_BUFFER]; | ||
56 | char *perf; | 55 | char *perf; |
56 | struct utmpx *putmpx; | ||
57 | 57 | ||
58 | setlocale (LC_ALL, ""); | 58 | setlocale (LC_ALL, ""); |
59 | bindtextdomain (PACKAGE, LOCALEDIR); | 59 | bindtextdomain (PACKAGE, LOCALEDIR); |
60 | textdomain (PACKAGE); | 60 | textdomain (PACKAGE); |
61 | 61 | ||
62 | perf = strdup(""); | 62 | perf = strdup (""); |
63 | 63 | ||
64 | /* Parse extra opts if any */ | 64 | /* Parse extra opts if any */ |
65 | argv=np_extra_opts (&argc, argv, progname); | 65 | argv = np_extra_opts (&argc, argv, progname); |
66 | 66 | ||
67 | if (process_arguments (argc, argv) == ERROR) | 67 | if (process_arguments (argc, argv) == ERROR) |
68 | usage4 (_("Could not parse arguments")); | 68 | usage4 (_("Could not parse arguments")); |
69 | 69 | ||
70 | /* run the command */ | ||
71 | child_process = spopen (WHO_COMMAND); | ||
72 | if (child_process == NULL) { | ||
73 | printf (_("Could not open pipe: %s\n"), WHO_COMMAND); | ||
74 | return STATE_UNKNOWN; | ||
75 | } | ||
76 | |||
77 | child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); | ||
78 | if (child_stderr == NULL) | ||
79 | printf (_("Could not open stderr for %s\n"), WHO_COMMAND); | ||
80 | |||
81 | users = 0; | 70 | users = 0; |
82 | 71 | ||
83 | while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { | 72 | /* get currently logged users from utmpx */ |
73 | setutxent (); | ||
84 | 74 | ||
85 | /* increment 'users' on all lines except total user count */ | 75 | while ((putmpx = getutxent ()) != NULL) |
86 | if (input_buffer[0] != '#') { | 76 | if (putmpx->ut_type == USER_PROCESS) |
87 | users++; | 77 | users++; |
88 | continue; | ||
89 | } | ||
90 | |||
91 | /* get total logged in users */ | ||
92 | if (sscanf (input_buffer, _("# users=%d"), &users) == 1) | ||
93 | break; | ||
94 | |||
95 | } | ||
96 | 78 | ||
97 | /* check STDERR */ | 79 | endutxent (); |
98 | if (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) | ||
99 | result = possibly_set (result, STATE_UNKNOWN); | ||
100 | (void) fclose (child_stderr); | ||
101 | 80 | ||
102 | /* close the pipe */ | 81 | /* check the user count against warning and critical thresholds */ |
103 | if (spclose (child_process)) | ||
104 | result = possibly_set (result, STATE_UNKNOWN); | ||
105 | |||
106 | /* else check the user count against warning and critical thresholds */ | ||
107 | if (users > cusers) | 82 | if (users > cusers) |
108 | result = STATE_CRITICAL; | 83 | result = STATE_CRITICAL; |
109 | else if (users > wusers) | 84 | else if (users > wusers) |
@@ -114,7 +89,7 @@ main (int argc, char **argv) | |||
114 | if (result == STATE_UNKNOWN) | 89 | if (result == STATE_UNKNOWN) |
115 | printf ("%s\n", _("Unable to read output")); | 90 | printf ("%s\n", _("Unable to read output")); |
116 | else { | 91 | else { |
117 | asprintf(&perf, "%s", perfdata ("users", users, "", | 92 | xasprintf (&perf, "%s", perfdata ("users", users, "", |
118 | TRUE, wusers, | 93 | TRUE, wusers, |
119 | TRUE, cusers, | 94 | TRUE, cusers, |
120 | TRUE, 0, | 95 | TRUE, 0, |
@@ -126,14 +101,11 @@ main (int argc, char **argv) | |||
126 | return result; | 101 | return result; |
127 | } | 102 | } |
128 | 103 | ||
129 | |||
130 | |||
131 | /* process command-line arguments */ | 104 | /* process command-line arguments */ |
132 | int | 105 | int |
133 | process_arguments (int argc, char **argv) | 106 | process_arguments (int argc, char **argv) |
134 | { | 107 | { |
135 | int c; | 108 | int c; |
136 | |||
137 | int option = 0; | 109 | int option = 0; |
138 | static struct option longopts[] = { | 110 | static struct option longopts[] = { |
139 | {"critical", required_argument, 0, 'c'}, | 111 | {"critical", required_argument, 0, 'c'}, |
@@ -183,7 +155,6 @@ process_arguments (int argc, char **argv) | |||
183 | else | 155 | else |
184 | wusers = atoi (argv[c++]); | 156 | wusers = atoi (argv[c++]); |
185 | } | 157 | } |
186 | |||
187 | if (cusers == -1 && argc > c) { | 158 | if (cusers == -1 && argc > c) { |
188 | if (is_intnonneg (argv[c]) == FALSE) | 159 | if (is_intnonneg (argv[c]) == FALSE) |
189 | usage4 (_("Warning threshold must be a positive integer")); | 160 | usage4 (_("Warning threshold must be a positive integer")); |
@@ -194,8 +165,6 @@ process_arguments (int argc, char **argv) | |||
194 | return OK; | 165 | return OK; |
195 | } | 166 | } |
196 | 167 | ||
197 | |||
198 | |||
199 | void | 168 | void |
200 | print_help (void) | 169 | print_help (void) |
201 | { | 170 | { |
@@ -205,9 +174,9 @@ print_help (void) | |||
205 | printf (COPYRIGHT, copyright, email); | 174 | printf (COPYRIGHT, copyright, email); |
206 | 175 | ||
207 | printf ("%s\n", _("This plugin checks the number of users currently logged in on the local")); | 176 | printf ("%s\n", _("This plugin checks the number of users currently logged in on the local")); |
208 | printf ("%s\n", _("system and generates an error if the number exceeds the thresholds specified.")); | 177 | printf ("%s\n", _("system and generates an error if the number exceeds the thresholds specified.")); |
209 | 178 | ||
210 | printf ("\n\n"); | 179 | printf ("\n\n"); |
211 | 180 | ||
212 | print_usage (); | 181 | print_usage (); |
213 | 182 | ||
@@ -215,17 +184,16 @@ print_help (void) | |||
215 | printf (UT_EXTRA_OPTS); | 184 | printf (UT_EXTRA_OPTS); |
216 | 185 | ||
217 | printf (" %s\n", "-w, --warning=INTEGER"); | 186 | printf (" %s\n", "-w, --warning=INTEGER"); |
218 | printf (" %s\n", _("Set WARNING status if more than INTEGER users are logged in")); | 187 | printf (" %s\n", _("Set WARNING status if more than INTEGER users are logged in")); |
219 | printf (" %s\n", "-c, --critical=INTEGER"); | 188 | printf (" %s\n", "-c, --critical=INTEGER"); |
220 | printf (" %s\n", _("Set CRITICAL status if more than INTEGER users are logged in")); | 189 | printf (" %s\n", _("Set CRITICAL status if more than INTEGER users are logged in")); |
221 | 190 | ||
222 | printf (UT_SUPPORT); | 191 | printf (UT_SUPPORT); |
223 | } | 192 | } |
224 | 193 | ||
225 | |||
226 | void | 194 | void |
227 | print_usage (void) | 195 | print_usage (void) |
228 | { | 196 | { |
229 | printf ("%s\n", _("Usage:")); | 197 | printf ("%s\n", _("Usage:")); |
230 | printf ("%s -w <users> -c <users>\n", progname); | 198 | printf ("%s -w <users> -c <users>\n", progname); |
231 | } | 199 | } |