File: users.in

package info (click to toggle)
munin 2.0.76-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 7,064 kB
  • sloc: perl: 11,684; java: 1,924; sh: 1,632; makefile: 636; javascript: 365; python: 267
file content (117 lines) | stat: -rw-r--r-- 2,485 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!@@PERL@@ -w
# -*- perl -*-

use strict;
use warnings;

=head1 NAME

users - Munin plugin to monitor the number of users logged in to a Unix box.

=head1 APPLICABLE SYSTEMS

Should work on any Unix that has the L<who>(1) command.

=head1 CONFIGURATION

None needed

=head1 INTERPRETATION

The plugin simply runs the L<who>(1) command and counts the number of
users logged in by different methods (tty, pty, X, etc).

=head1 BUGS

Logins or sessions that are not registered in C</var/run/utmp> as part
of the session setup will not be counted (this is a feature, not a
bug).

Only tested extensively on Linux.

=head1 MAGIC MARKERS

  #%# family=auto
  #%# capabilities=autoconf

=head1 AUTHOR

Copyright (C) 2004-2008.

Original version by Michael Kaiser tools (at) micha (dot) de.
Modified and made more generic by Nicolai Langfeldt, 2006

=head1 LICENSE

GPLv2

=cut

use Munin::Plugin;

if ( defined($ARGV[0])) {
    if ($ARGV[0] eq 'autoconf') {
	print "yes\n";
	exit 0;
    }

    if ( $ARGV[0] eq "config" ) {
	print "graph_title Logged in users\n";
	print "graph_args --base 1000 -l 0\n";
	print "graph_vlabel Users\n";
	print "graph_scale no\n";
	print "graph_category system\n";
	print "graph_printf %3.0lf\n";
	print "tty.label tty\n";
	print "tty.draw AREASTACK\n";
	print "tty.colour 00FF00\n";
	print "pty.label pty\n";
	print "pty.draw AREASTACK\n";
        print "pty.colour 0000FF\n";
	print "pts.label pts\n";
	print "pts.draw AREASTACK\n";
	print "pts.colour 00FFFF\n";
	print "X.label X displays\n";
	print "X.draw AREASTACK\n";
	print "X.info Users logged in on an X display\n";
	print "X.colour 000000\n";
	print "other.label Other users\n";
	print "other.info Users logged in by indeterminate method\n";
	print "other.colour FF0000\n";
	foreach my $field (qw(tty pty pts X other)) {
		print_thresholds($field);
	}
	exit 0;
    }
}

my $tty = 0;
my $pty = 0;
my $pts = 0;
my $X   = 0;
my $unc = 0;  # Unclassified

open (WHO,"who |");

foreach (<WHO>) {
    (undef,$_,undef) = split /[\/ ]+/;
    $tty++,next if /ttyv?/; # Linux virtual console tty (on some hosts)
    $pty++,next if /pty|ttyp/;
    $pts++,next if /pts/;
    $tty++,next if /tty/;   # Regular tty

    $X++,next if (/:\d+/); # Linux style X screen
    $X++,next if (/X[0-9a-fA-F]*/); # Solaris style (ifi.uio.no only?)

    $unc++;
}

close (WHO);

print "tty.value $tty\n";
print "pty.value $pty\n";
print "pts.value $pts\n";
print "X.value $X\n";
print "other.value $unc\n";

# vim:syntax=perl