Explorar el Código

check_users: Use utmpx(5) only if available

For systems that don't provide an utmpx(5) interface, restore the code
that was replaced in commit 3e622f3a47bc7d31f22513a79892c3c52febd2d3.
Holger Weiss hace 12 años
padre
commit
92849a1a87
Se han modificado 3 ficheros con 52 adiciones y 1 borrados
  1. 4 0
      configure.in
  2. 4 0
      plugins/Makefile.am
  3. 44 1
      plugins/check_users.c

+ 4 - 0
configure.in

@@ -316,6 +316,10 @@ AS_IF([test "x$with_ldap" != "xno"], [
   LIBS="$_SAVEDLIBS"
   LIBS="$_SAVEDLIBS"
 ])
 ])
 
 
+dnl Check for headers used by check_users
+AC_CHECK_HEADERS(utmpx.h)
+AM_CONDITIONAL([HAVE_UTMPX], [test "$ac_cv_header_utmpx_h" = "yes"])
+
 dnl Check for headers used by check_ide_smart
 dnl Check for headers used by check_ide_smart
 case $host in
 case $host in
   *linux*)
   *linux*)

+ 4 - 0
plugins/Makefile.am

@@ -112,6 +112,10 @@ check_ide_smart_LDADD = $(BASEOBJS)
 negate_LDADD = $(BASEOBJS)
 negate_LDADD = $(BASEOBJS)
 urlize_LDADD = $(BASEOBJS)
 urlize_LDADD = $(BASEOBJS)
 
 
+if !HAVE_UTMPX
+check_users_LDADD += popen.o
+endif
+
 ##############################################################################
 ##############################################################################
 # secondary dependencies
 # secondary dependencies
 
 

+ 44 - 1
plugins/check_users.c

@@ -36,7 +36,12 @@ const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
 
 #include "common.h"
 #include "common.h"
 #include "utils.h"
 #include "utils.h"
-#include <utmpx.h>
+
+#if HAVE_UTMPX_H
+# include <utmpx.h>
+#else
+# include "popen.h"
+#endif
 
 
 #define possibly_set(a,b) ((a) == 0 ? (b) : 0)
 #define possibly_set(a,b) ((a) == 0 ? (b) : 0)
 
 
@@ -53,7 +58,11 @@ main (int argc, char **argv)
 	int users = -1;
 	int users = -1;
 	int result = STATE_UNKNOWN;
 	int result = STATE_UNKNOWN;
 	char *perf;
 	char *perf;
+#if HAVE_UTMPX_H
 	struct utmpx *putmpx;
 	struct utmpx *putmpx;
+#else
+	char input_buffer[MAX_INPUT_BUFFER];
+#endif
 
 
 	setlocale (LC_ALL, "");
 	setlocale (LC_ALL, "");
 	bindtextdomain (PACKAGE, LOCALEDIR);
 	bindtextdomain (PACKAGE, LOCALEDIR);
@@ -69,6 +78,7 @@ main (int argc, char **argv)
 
 
 	users = 0;
 	users = 0;
 
 
+#if HAVE_UTMPX_H
 	/* get currently logged users from utmpx */
 	/* get currently logged users from utmpx */
 	setutxent ();
 	setutxent ();
 
 
@@ -77,6 +87,39 @@ main (int argc, char **argv)
 			users++;
 			users++;
 
 
 	endutxent ();
 	endutxent ();
+#else
+	/* run the command */
+	child_process = spopen (WHO_COMMAND);
+	if (child_process == NULL) {
+		printf (_("Could not open pipe: %s\n"), WHO_COMMAND);
+		return STATE_UNKNOWN;
+	}
+
+	child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
+	if (child_stderr == NULL)
+		printf (_("Could not open stderr for %s\n"), WHO_COMMAND);
+
+	while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
+		/* increment 'users' on all lines except total user count */
+		if (input_buffer[0] != '#') {
+			users++;
+			continue;
+		}
+
+		/* get total logged in users */
+		if (sscanf (input_buffer, _("# users=%d"), &users) == 1)
+			break;
+	}
+
+	/* check STDERR */
+	if (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr))
+		result = possibly_set (result, STATE_UNKNOWN);
+	(void) fclose (child_stderr);
+
+	/* close the pipe */
+	if (spclose (child_process))
+		result = possibly_set (result, STATE_UNKNOWN);
+#endif
 
 
 	/* check the user count against warning and critical thresholds */
 	/* check the user count against warning and critical thresholds */
 	if (users > cusers)
 	if (users > cusers)