[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/