#include <u.h>
#include <libc.h>
#include <thread.h>
#include <bio.h>
#include "collectd.h"
#define MAXUSERS 128
static int
lookup(char *base[], long nel, char *s)
{
long i;
for(i = 0; i < nel; ++i)
if(strcmp(base[i], s) == 0)
return i;
return -1;
}
static ulong
getusers(char *file)
{
int fd;
Dir *dir;
long i, n;
ulong nusers;
char *users[MAXUSERS];
nusers = 0;
fd = open(file, OREAD);
if(fd < 0)
sysfatal("couldn't open %s: %r", file);
n = dirreadall(fd, &dir);
for(i = 0; i < n; ++i)
if(lookup(users, nusers, dir[i].uid) < 0)
users[nusers++] = dir[i].uid;
free(dir);
close(fd);
return nusers;
}
static void
submit(Channel *c, double value)
{
Packet *pp;
pp = palloc();
pp->host = estrdup(hostname);
pp->interval = interval;
pp->time = time(nil);
pp->plugin = estrdup("users");
pp->type = estrdup("users");
addgauge(pp, value);
if(nbsendp(c, pp) < 1)
pfree(pp);
}
void
usersproc(void *arg)
{
char *p;
Channel *c;
/*
* Reporting users doesn't make much sense on terminals;
* skip this plugin for these systems.
*/
p = getenv("service");
if(p && strcmp(p, "terminal") == 0)
exits(nil);
free(p);
c = arg;
for(;;){
snooze();
/*
* There is not a good method for determining the
* number of active users. The following method is
* similar to who(1), though less discerning when it
* comes to checking for broken processes.
*/
submit(c, getusers("/proc"));
}
}
|