MEnet User Count Howto

Unix User Counts

The MEnet User Count stats are collected on the Unix side from our gfinger server. For information about gfinger, see the GNU Web Site

Our MRTG collector script follows:


#!/usr/local/bin/perl -w

# Spawn a gfinger to obtain raw data from
open(GFINGER, "/usr/local/bin/finger|");

# Throw away first line
;

# zero out data;
undef %userdata;
undef %hostdata;

# Loop on the gfinger data
while (  ) {
    $fingerline = $_;

    # Eliminate root, admin, and ftp users
    next if($fingerline =~ /root/i);
    next if($fingerline =~ /ftp/i);
    # get the username and hostname
    $username=substr($fingerline,0,8);
# below changed by gtk for new finger March 2002
#    $hostname=substr($fingerline,40,8);
    $hostname=substr($fingerline,47,8);
    # Eliminate trailing whitespace
    $hostname=~s/\W.*//;
    $username=~s/\W.*//;
    # Keep track of which machines a user is on by a hash
    if ($userdata{$username}) {
        $userdata{$username}="$userdata{$username},$hostname";
    }
    else {
        $userdata{$username}=$hostname;
    }
    # Keep track of which users are on a machine by a hash
    if ($hostdata{$hostname}) {
        $hostdata{$hostname}="$hostdata{$hostname},$username";
    }
    else {
        $hostdata{$hostname}="$username";
    }
}

# Print out sum:
$totalusers=scalar (keys %userdata);
$totalhosts=scalar (keys %hostdata);

print "$totalhosts\n";
print "$totalusers\n";
print "a while\n";
print "user-count\n";

close(GFINGER);

Windows User Counts

On the Windows side, we use this line in inetd.conf on the Samba version 3.x server:


smbusers        stream  tcp     nowait  nobody  /usr/samba/bin/smbstatus smbstatus -bu
And we use the following MRTG collector:

#! /usr/local/bin/perl -w

use Socket;
use strict 'vars';

my %userdata;
my %wtsuserdata;

my $smbshare = '';
my $machusername = '';
my $groupname = '';
my $smbpid = '';
my $machinename = '';
my $smbline = '';
my @smbusers;
my @junk;


#configuration information

my $port = 2245;      # Set this to the port used by smbusers on the Samba server
my $machine = 'smb.me.umn.edu';
my $iaddr=inet_aton($machine) or die "no host: $machine";
my $paddr=sockaddr_in($port,$iaddr);
my $proto=getprotobyname('tcp');

socket(SMB,PF_INET,SOCK_STREAM,$proto) or die "Cannot open socket";
connect(SMB, $paddr) or die "Cannot contact $machine";

# get smbstatus info from server to obtain raw data
@smbusers=;
close(SMB);

while ($smbline = shift(@smbusers) ) {
    ($smbshare,$machusername,$groupname,$smbpid,$machinename,@junk) = split(/\s+/,$smbline);
    # skip non-data lines
    if ( $machinename && ($smbshare eq $machusername) ) {
        $userdata{$machusername} = '';
        if ( $machinename eq 'nightshade' ) {
            $wtsuserdata{$machusername} = '';
        } elsif ( $machinename eq 'hemlock' ) {
            $wtsuserdata{$machusername} = '';
        }
    }
}

my $totalntusers = scalar (keys %userdata);
my $totalwtsusers = scalar (keys %wtsuserdata);

print "$totalwtsusers\n";
print "$totalntusers\n";
print "a while\n";
print "user-count\n";


Enet MAIN PAGE