[nagiosplug] check_users: improve performance

"Nagios Plugin Development" <[email protected]> Thu, 7 Jun 2012 08:50:09 +0000
Newsgroups gmane.network.nagios.plugins.cvs
Message-ID <[email protected]>
    Module: nagiosplug
    Branch: master
    Commit: 3e622f3a47bc7d31f22513a79892c3c52febd2d3
    Author: M. Remy <[email protected]>
 Committer: Holger Weiss <[email protected]>
      Date: Tue Apr 17 22:15:15 2012 +0200
       URL: http://nagiosplug.git.sf.net/git/gitweb.cgi?p=nagiosplug/nagiosplug;a=commit;h=3e622f3

check_users: improve performance

This patch use the utxent function family to collect the user data. It improve the check speed.
Need a system conforming to POSIX.1-2001.

---

 plugins/Makefile.am   |    2 +-
 plugins/check_users.c |   38 ++++++++------------------------------
 2 files changed, 9 insertions(+), 31 deletions(-)

diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 36a28b0..3a2afc1 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -101,7 +101,7 @@ check_tcp_LDADD = $(SSLOBJS) $(NETLIBS) $(SSLLIBS)
 check_time_LDADD = $(NETLIBS)
 check_ntp_time_LDADD = $(NETLIBS) $(MATHLIBS)
 check_ups_LDADD = $(NETLIBS)
-check_users_LDADD = $(BASEOBJS) popen.o
+check_users_LDADD = $(BASEOBJS)
 check_by_ssh_LDADD = $(NETLIBS)
 check_ide_smart_LDADD = $(BASEOBJS)
 negate_LDADD = $(BASEOBJS)
diff --git a/plugins/check_users.c b/plugins/check_users.c
index 8368612..fb8bcca 100644
--- a/plugins/check_users.c
+++ b/plugins/check_users.c
@@ -35,8 +35,8 @@ const char *copyright = "2000-2007";
 const char *email = "[email protected]";
 
 #include "common.h"
-#include "popen.h"
 #include "utils.h"
+#include <utmpx.h>
 
 #define possibly_set(a,b) ((a) == 0 ? (b) : 0)
 
@@ -54,6 +54,7 @@ main (int argc, char **argv)
 	int result = STATE_UNKNOWN;
 	char input_buffer[MAX_INPUT_BUFFER];
 	char *perf;
+	struct utmpx *putmpx;
 
 	setlocale (LC_ALL, "");
 	bindtextdomain (PACKAGE, LOCALEDIR);
@@ -67,43 +68,20 @@ main (int argc, char **argv)
 	if (process_arguments (argc, argv) == ERROR)
 		usage4 (_("Could not parse arguments"));
 
-	/* 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);
-
 	users = 0;
 
-	while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
+	/* get currently logged users from utmpx */
+	setutxent();
 
-		/* increment 'users' on all lines except total user count */
-		if (input_buffer[0] != '#') {
+	while( (putmpx=getutxent()) ) {
+		if( (putmpx->ut_type==USER_PROCESS) ) {
 			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);
+	endutxent();
 
-	/* else check the user count against warning and critical thresholds */
+	/* check the user count against warning and critical thresholds */
 	if (users > cusers)
 		result = STATE_CRITICAL;
 	else if (users > wusers)


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/