Example #1
0
void initMemory( struct SensorModul* sm ) {

	long i = sysconf( _SC_PAGESIZE );

	pageshift = 0;
	while( (i >>= 1) > 0 )
		pageshift++;

	/* calculate an amount to shift to K values */
	/* remember that log base 2 of 1024 is 10 (i.e.: 2^10 = 1024) */
	pageshift -= 10;

	/* now determine which pageshift function is appropriate for the 
	result (have to because x << y is undefined for y < 0) */
	if( pageshift > 0 ) {
		/* this is the most likely */
		p_pagetok = pagetok_left;
	} else if( pageshift == 0 ) {
		p_pagetok = pagetok_none;
	} else {
		p_pagetok = pagetok_right;
		pageshift = -pageshift;
	}

#ifdef HAVE_KSTAT
	registerMonitor( "mem/physical/free", "integer",
					printMemFree, printMemFreeInfo, sm );
	registerMonitor( "mem/physical/used", "integer",
					printMemUsed, printMemUsedInfo, sm );
#endif
	registerMonitor( "mem/swap/free", "integer",
					printSwapFree, printSwapFreeInfo, sm );
	registerMonitor( "mem/swap/used", "integer",
					printSwapUsed, printSwapUsedInfo, sm );
}
Example #2
0
void initLoadAvg(struct SensorModul *sm)
{
#ifdef HAVE_KSTAT
    registerMonitor("cpu/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm);
    registerMonitor("cpu/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm);
    registerMonitor("cpu/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm);
#endif
}
Example #3
0
void initLoadAvg(struct SensorModul* sm ) {
	registerMonitor( "cpu/loadavg1", "float",
					printLoadAvg1, printLoadAvg1Info, sm );
	registerMonitor( "cpu/loadavg5", "float",
					printLoadAvg5, printLoadAvg5Info, sm );
	registerMonitor( "cpu/loadavg15", "float",
					printLoadAvg15, printLoadAvg15Info, sm );
}
Example #4
0
void initCpuInfo(struct SensorModul *sm)
{
    /* Total CPU load */
    registerMonitor("cpu/user", "integer", printCPUUser, printCPUUserInfo, sm);
    registerMonitor("cpu/nice", "integer", printCPUNice, printCPUNiceInfo, sm);
    registerMonitor("cpu/sys", "integer", printCPUSys, printCPUSysInfo, sm);
    registerMonitor("cpu/idle", "integer", printCPUIdle, printCPUIdleInfo, sm);
    registerMonitor("cpu/interrupt", "integer", printCPUInterrupt, printCPUInterruptInfo, sm);

    updateCpuInfo();
}
Example #5
0
void initLoadAvg( struct SensorModul* sm )
{
  if ( updateLoadAvg() < 0 ) {
    LoadAvgOK = -1;
    return;
  } else
    LoadAvgOK = 1;

  registerMonitor( "cpu/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm );
  registerMonitor( "cpu/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm );
  registerMonitor( "cpu/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm );
}
Example #6
0
void initCpuInfo(struct SensorModul *sm)
{
    /* Total CPU load */
    registerMonitor("cpu/user", "integer", printCPUUser, printCPUUserInfo, sm);
    registerMonitor("cpu/nice", "integer", printCPUNice, printCPUNiceInfo, sm);
    registerMonitor("cpu/sys", "integer", printCPUSys, printCPUSysInfo, sm);
    registerMonitor("cpu/idle", "integer", printCPUIdle, printCPUIdleInfo, sm);
    kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open");
    kvm_nlist(kd, my_nlist);
    cp_time_offset = my_nlist[0].n_value;

    updateCpuInfo();
}
Example #7
0
void
initApm(struct SensorModul* sm)
{
	if ((ApmFD = open(APMDEV, O_RDONLY)) < 0)
		return;

	if (updateApm() < 0)
		return;

	registerMonitor("apm/batterycharge", "integer", printApmBatFill,
					printApmBatFillInfo, sm);
	registerMonitor("apm/remainingtime", "integer", printApmBatTime,
					printApmBatTimeInfo, sm);
}
Example #8
0
void initLoadAvg(struct SensorModul* sm)
{
    if (updateLoadAvg() < 0)
        return;

    registerMonitor("cpu/system/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm);
    registerMonitor("cpu/system/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm);
    registerMonitor("cpu/system/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm);

    /* Monitor names changed from kde3 => kde4. Remain compatible with legacy requests when possible. */
    registerLegacyMonitor("cpu/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm);
    registerLegacyMonitor("cpu/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm);
    registerLegacyMonitor("cpu/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm);
}
Example #9
0
void initLogFile(struct SensorModul* sm)
{
    char monitor[1024];
    ConfigLogFile *entry;

    registerCommand("logfile_register", registerLogFile);
    registerCommand("logfile_unregister", unregisterLogFile);
    registerCommand("logfile_registered", printRegistered);

    for (entry = first_ctnr(LogFileList); entry; entry = next_ctnr(LogFileList))
    {
        FILE* fp;

        /* register the log file if we can actually read the file. */
        if ((fp = fopen(entry->path, "r")) != NULL)
        {
            fclose(fp);
            snprintf(monitor, 1024, "logfiles/%s", entry->name);
            registerMonitor(monitor, "logfile", printLogFile,
                            printLogFileInfo, sm);
        }
    }

    LogFiles = new_ctnr();
}
Example #10
0
void initAcpiFan(struct SensorModul *sm)
{

  char th_ref[ ACPIFILENAMELENGTHMAX ];
  DIR *d = NULL;
  struct dirent *de;

  d = opendir(FAN_DIR);
  if (d == NULL) {
/*	  print_error( "Directory \'" THERMAL_ZONE_DIR
		"\' does not exist or is not readable.\n"
	  "Load the ACPI thermal kernel module or compile it into your kernel.\n" );
*/
	  AcpiFans = -1;
	  return;
  }

  AcpiFans = 0;
  while ( (de = readdir(d)) != NULL ) {
	  if ( ( strcmp( de->d_name, "." ) == 0 )
			  || ( strcmp( de->d_name, ".." ) == 0 ) ) {
		  continue;
	  }

	  AcpiFans++;
	  snprintf(th_ref, sizeof(th_ref), 
			  "acpi/fan/%s/state", de->d_name);
	  registerMonitor(th_ref, "integer", printFanState,
			  printFanStateInfo, sm);
  }

  return;
}
Example #11
0
void initLoadAvg( struct SensorModul* sm )
{
    if ( updateLoadAvg() < 0 ) {
        LoadAvgOK = -1;
        return;
    } else
        LoadAvgOK = 1;

    registerMonitor( "cpu/system/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm );
    registerMonitor( "cpu/system/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm );
    registerMonitor( "cpu/system/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm );

    /* Register some legacy monitors. These will be hidden from the module list. */
    registerLegacyMonitor( "cpu/loadavg1", "float", printLoadAvg1, printLoadAvg1Info, sm );
    registerLegacyMonitor( "cpu/loadavg5", "float", printLoadAvg5, printLoadAvg5Info, sm );
    registerLegacyMonitor( "cpu/loadavg15", "float", printLoadAvg15, printLoadAvg15Info, sm );
}
Example #12
0
static void processCpuInfo(void)
{
    char format[32];
    char tag[32];
    char value[256];
    char *cibp = CpuInfoBuf;
    int cpuId = 0;

    if(!CpuInfoOK)
        return;

    sprintf(format, "%%%d[^:]: %%%d[^\n]\n", (int)sizeof(tag) - 1, (int)sizeof(value) - 1);

    while(sscanf(cibp, format, tag, value) == 2)
    {
        char *p;
        tag[sizeof(tag) - 1] = '\0';
        value[sizeof(value) - 1] = '\0';
        /* remove trailing whitespaces */
        p = tag + strlen(tag) - 1;
        /* remove trailing whitespaces */
        while((*p == ' ' || *p == '\t') && p > tag)
            *p-- = '\0';

        if(strcmp(tag, "processor") == 0)
        {
            if(sscanf(value, "%d", &cpuId) == 1)
            {
                if(cpuId >= CPUs)
                {
                    char cmdName[24];
                    if(Clocks)
                        free(Clocks);
                    CPUs = cpuId + 1;
                    Clocks = malloc(CPUs * sizeof(float));
                    snprintf(cmdName, sizeof(cmdName) - 1, "cpu%d/clock", cpuId);
                    registerMonitor(cmdName, "float", printCPUxClock, printCPUxClockInfo, CpuInfoSM);
                }
            }
        }
        else if(strcmp(tag, "cpu MHz") == 0)
            sscanf(value, "%f", &Clocks[cpuId]);

        /* Move cibp to begining of next line, if there is one. */
        cibp = strchr(cibp, '\n');
        if(cibp)
            cibp++;
        else
            cibp = CpuInfoBuf + strlen(CpuInfoBuf);
    }

    Dirty = 0;
}
Example #13
0
void initNetDev(struct SensorModul* sm)
{
	int i;
	char monitor[1024];
	gettimeofday(&old_tv, (struct timezone *)0);

	NetDevSM = sm;

	updateNetDev();
	
	for (i = 0; i < NetDevCnt; i++) {
		/* init data */
		NetDevsOld[i] = NetDevs[i];

		/* register monitors */
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/data", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/packets", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/errors", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/drops", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/receiver/multicast", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevRecBytes, printNetDevRecBytesInfo, NetDevSM);

		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/data", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/packets", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/errors", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/multicast", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
		snprintf(monitor, sizeof(monitor), "network/interfaces/%s/transmitter/collisions", NetDevs[i].name);
		registerMonitor(monitor, "integer", printNetDevSentBytes, printNetDevSentBytesInfo, NetDevSM);
	}
}
Example #14
0
void initAcpiBattery( struct SensorModul* sm )
{
  DIR *d;
  struct dirent *de;
  char s[ ACPIFILENAMELENGTHMAX ];

  if ( ( d = opendir( "/proc/acpi/battery" ) ) == NULL ) {
	AcpiBatteryNum = -1;
    return;
  } else {
	AcpiBatteryNum = 0;
    while ( ( de = readdir( d ) ) )
      if ( ( strcmp( de->d_name, "." ) != 0 ) && ( strcmp( de->d_name, ".." ) != 0 ) ) {
		  strncpy( AcpiBatteryNames[ AcpiBatteryNum ], de->d_name, 8 );
		  snprintf( s, sizeof( s ), "acpi/battery/%d/batterycharge", AcpiBatteryNum );
		  registerMonitor( s, "integer", printAcpiBatFill, printAcpiBatFillInfo, sm );
		  snprintf( s, sizeof( s ), "acpi/battery/%d/batteryusage", AcpiBatteryNum );
		  registerMonitor( s, "integer", printAcpiBatUsage, printAcpiBatUsageInfo, sm);
		  AcpiBatteryCharge[ AcpiBatteryNum ] = 0;
		  AcpiBatteryNum++;
	  }
  }
}
Example #15
0
void initProcessList( struct SensorModul* sm ) {

	if( (procdir = opendir( PROCDIR )) == NULL ) {
		print_error( "cannot open \"%s\" for reading\n", PROCDIR );
		return;
	}
	pagesz=getpagesize();
	ProcessList = new_ctnr();
	updateProcessList();

	/*
	 *  register the supported monitors & commands
	 */
	registerMonitor( "pscount", "integer",
				printProcessCount, printProcessCountInfo, sm );
	registerMonitor( "ps", "table",
				printProcessList, printProcessListInfo, sm );

	if (!RunAsDaemon)
	{
		registerCommand("kill", killProcess);
		registerCommand("setpriority", setPriority);
	}
}
Example #16
0
void initMemory(struct SensorModul *sm)
{
    /**
      Make sure that /proc/meminfo exists and is readable. If not we do
      not register any monitors for memory.
     */
    if(updateMemory() < 0)
        return;

    registerMonitor("mem/physical/free", "integer", printMFree, printMFreeInfo, sm);
    registerMonitor("mem/physical/used", "integer", printUsed, printUsedInfo, sm);
    registerMonitor("mem/physical/application", "integer", printAppl, printApplInfo, sm);
    registerMonitor("mem/physical/buf", "integer", printBuffers, printBuffersInfo, sm);
    registerMonitor("mem/physical/cached", "integer", printCached, printCachedInfo, sm);
    registerMonitor("mem/swap/used", "integer", printSwapUsed, printSwapUsedInfo, sm);
    registerMonitor("mem/swap/free", "integer", printSwapFree, printSwapFreeInfo, sm);
}
Example #17
0
static int initStatDisk( char* tag, char* buf, const char* label,
			const char* shortLabel, int idx, cmdExecutor ex, cmdExecutor iq )
{
	char sensorName[ 128 ];
	
	gettimeofday( &lastSampling, 0 );
	
	if ( strcmp( label, tag ) == 0 ) {
		unsigned int i;
		buf = buf + strlen( label ) + 1;
		
		for ( i = 0; i < DiskCount; ++i ) {
			sscanf( buf, "%lu", &DiskLoad[ i ].s[ idx ].old );
			while ( *buf && isblank( *buf++ ) );
			while ( *buf && isdigit( *buf++ ) );
			sprintf( sensorName, "disk/disk%d/%s", i, shortLabel );
			registerMonitor( sensorName, "float", ex, iq, StatSM );
		}
		
		return 1;
	}
	
	return 0;
}
Example #18
0
void initMemory(struct SensorModul *sm)
{
    char *nlistf = NULL;
    char *memf = NULL;
    char buf[_POSIX2_LINE_MAX];

    if((kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, buf)) == NULL)
    {
        log_error("kvm_openfiles()");
        return;
    }

    registerMonitor("mem/physical/free", "integer", printMFree, printMFreeInfo, sm);
    registerMonitor("mem/physical/used", "integer", printUsed, printUsedInfo, sm);
    registerMonitor("mem/physical/buf", "integer", printBuffers, printBuffersInfo, sm);
    registerMonitor("mem/physical/cached", "integer", printCached, printCachedInfo, sm);
    registerMonitor("mem/swap/free", "integer", printSwapFree, printSwapFreeInfo, sm);
    registerMonitor("mem/swap/used", "integer", printSwapUsed, printSwapUsedInfo, sm);
}
Example #19
0
static int process24DiskIO( const char* buf ) {
	/* Process disk_io lines as provided by 2.4.x kernels.
	* disk_io: (2,0):(3,3,6,0,0) (3,0):(1413012,511622,12155382,901390,26486215) */
	int major, minor;
	unsigned long total, rblk, rio, wblk, wio;
	DiskIOInfo* ptr = DiskIO;
	DiskIOInfo* last = 0;
	char sensorName[ 128 ];
	const char* p;
	
	p = buf + strlen( "disk_io: " );
	while ( p && *p ) {
		if ( sscanf( p, "(%d,%d):(%lu,%lu,%lu,%lu,%lu)", &major, &minor,
				&total, &rio, &rblk, &wio, &wblk ) != 7 )
			return -1;
		
		last = 0;
		ptr = DiskIO;
		while ( ptr ) {
			if ( ptr->major == major && ptr->minor == minor ) {
				/* The IO device has already been registered. */
				ptr->total.delta = total - ptr->total.old;
				ptr->total.old = total;
				ptr->rio.delta = rio - ptr->rio.old;
				ptr->rio.old = rio;
				ptr->wio.delta = wio - ptr->wio.old;
				ptr->wio.old = wio;
				ptr->rblk.delta = rblk - ptr->rblk.old;
				ptr->rblk.old = rblk;
				ptr->wblk.delta = wblk - ptr->wblk.old;
				ptr->wblk.old = wblk;
				ptr->alive = 1;
				break;
			}

			last = ptr;
			ptr = ptr->next;
		}
		
		if ( !ptr ) {
			/* The IO device has not been registered yet. We need to add it. */
			ptr = (DiskIOInfo*)malloc( sizeof( DiskIOInfo ) );
			ptr->major = major;
			ptr->minor = minor;
			
			/* 2.6 gives us a nice device name. On 2.4 we get nothing */
			ptr->devname = (char *)malloc( DISKDEVNAMELEN );
			memset( ptr->devname, 0, DISKDEVNAMELEN );
			
			ptr->total.delta = 0;
			ptr->total.old = total;
			ptr->rio.delta = 0;
			ptr->rio.old = rio;
			ptr->wio.delta = 0;
			ptr->wio.old = wio;
			ptr->rblk.delta = 0;
			ptr->rblk.old = rblk;
			ptr->wblk.delta = 0;
			ptr->wblk.old = wblk;
			ptr->alive = 1;
			ptr->next = 0;
			if ( last ) {
				/* Append new entry at end of list. */
				last->next = ptr;
			}
			else {
				/* List is empty, so we insert the fist element into the list. */
				DiskIO = ptr;
			}
			
			sprintf( sensorName, "disk/%s_(%d:%d)24/total", ptr->devname, major, minor );
			registerMonitor( sensorName, "float", print24DiskIO, print24DiskIOInfo, StatSM );
			sprintf( sensorName, "disk/%s_(%d:%d)24/rio", ptr->devname, major, minor );
			registerMonitor( sensorName, "float", print24DiskIO, print24DiskIOInfo, StatSM );
			sprintf( sensorName, "disk/%s_(%d:%d)24/wio", ptr->devname, major, minor );
			registerMonitor( sensorName, "float", print24DiskIO, print24DiskIOInfo, StatSM );
			sprintf( sensorName, "disk/%s_(%d:%d)24/rblk", ptr->devname, major, minor );
			registerMonitor( sensorName, "float", print24DiskIO, print24DiskIOInfo, StatSM );
			sprintf( sensorName, "disk/%s_(%d:%d)24/wblk", ptr->devname, major, minor );
			registerMonitor( sensorName, "float", print24DiskIO, print24DiskIOInfo, StatSM );
		}

		/* Move p after the second ')'. We can safely assume that
		* those two ')' exist. */
		p = strchr( p, ')' ) + 1;
		p = strchr( p, ')' ) + 1;
		if ( p && *p )
			p = strchr( p, '(' );
	}
	
	return 0;
}
Example #20
0
void
initCpuInfo(struct SensorModul* sm)
{
    size_t len;
    int id;
    char name[SYSCTL_ID_LEN];
    int minfreq, maxfreq;

    len = sizeof(cpus);
    /* XXX: this is a guess */
    sysctlbyname("kern.smp.active", &cpus, &len, NULL, 0);
    /* NOTE: cpus may be 0, which implies 1 */
    cpus = cpus ? cpus : 1;

    len = sizeof(cores);
    sysctlbyname("kern.smp.cpus", &cores, &len, NULL, 0);

    len = sizeof(maxcpus);
    sysctlbyname("kern.smp.maxcpus", &maxcpus, &len, NULL, 0);

    /* Core/process count */
    registerMonitor("system/processors", "integer", printNumCpus, printNumCpusInfo, sm);
    registerMonitor("system/cores", "integer", printNumCores, printNumCoresInfo, sm);

    /*
     * CPU Loads
     */
    if ((cp_time = malloc(sizeof(long) * CPUSTATES * (cores * 4 + 1))) == NULL) {
        log_error("out of memory for cp_time");
        return;
    }
    cp_old = &cp_time[cores];
    cp_diff = &cp_old[cores];
    cpu_states = &cp_diff[cores];

    /* Total CPU load */
    registerMonitor("cpu/system/user", "float", printCPUUser, printCPUUserInfo, sm);
    registerMonitor("cpu/system/nice", "float", printCPUNice, printCPUNiceInfo, sm);
    registerMonitor("cpu/system/sys", "float", printCPUSys, printCPUSysInfo, sm);
    registerMonitor("cpu/system/TotalLoad", "float", printCPUTotalLoad, printCPUTotalLoadInfo, sm);
    registerMonitor("cpu/system/intr", "float", printCPUIntr, printCPUIntrInfo, sm);
    registerMonitor("cpu/system/idle", "float", printCPUIdle, printCPUIdleInfo, sm);

    /* Monitor names changed from kde3 => kde4. Remain compatible with legacy requests when possible. */
    registerLegacyMonitor("cpu/user", "float", printCPUUser, printCPUUserInfo, sm);
    registerLegacyMonitor("cpu/nice", "float", printCPUNice, printCPUNiceInfo, sm);
    registerLegacyMonitor("cpu/sys", "float", printCPUSys, printCPUSysInfo, sm);
    registerLegacyMonitor("cpu/idle", "float", printCPUIdle, printCPUIdleInfo, sm);

    for (id = 0; id < cores; ++id) {
        snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/user", id);
        registerMonitor(name, "float", printCPUxUser, printCPUxUserInfo, sm);
        snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/nice", id);
        registerMonitor(name, "float", printCPUxNice, printCPUxNiceInfo, sm);
        snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/sys", id);
        registerMonitor(name, "float", printCPUxSys, printCPUxSysInfo, sm);
        snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/TotalLoad", id);
        registerMonitor(name, "float", printCPUxTotalLoad, printCPUxTotalLoadInfo, sm);
        snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/intr", id);
        registerMonitor(name, "float", printCPUxIntr, printCPUxIntrInfo, sm);
        snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/idle", id);
        registerMonitor(name, "float", printCPUxIdle, printCPUxIdleInfo, sm);
    }

    /*
     * CPU frequencies
     */
    if ((freq = malloc(sizeof(int) * 3 * (cores + 1))) == NULL) {
        log_error("out of memory for freq");
        return;
    }

    registerMonitor("cpu/system/AverageClock", "float", printCPUClock, printCPUClockInfo, sm);
    for (id = 0; id < cores; ++id) {
        len = sizeof(int);
        snprintf(name, SYSCTL_ID_LEN, "dev.cpu.%d.freq", id);
        if (!sysctlbyname(name, &freq[id][0], &len, NULL, 0)) {
            get_mmfreq(id, &freq[id][1], &freq[id][2]);
            snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/clock", id);
            registerMonitor(name, "integer", printCPUxClock, printCPUxClockInfo, sm);
        } else {
            freq[id][0] = -1;
            freq[id][1] = 0;
            freq[id][2] = 0;
        }
    }

    minfreq = freq[0][1];
    maxfreq = freq[0][2];
    for (id = 1; id < cores; ++id)
        if (freq[id][0] != -1) {
            minfreq = minfreq > freq[id][1] ? freq[id][1] : minfreq;
            maxfreq = maxfreq < freq[id][2] ? freq[id][2] : maxfreq;
        }
    freq[cores][1] = minfreq;
    freq[cores][2] = maxfreq;

    /*
     * CPU temperature
     */
    if ((temp = malloc(sizeof(int) * (cores + 1))) == NULL) {
        log_error("out of memory for temp");
        return;
    }
    registerMonitor("cpu/system/AverageTemperature", "float", printCPUTemperature, printCPUTemperatureInfo, sm);
    for (id = 0; id < cores; ++id) {
        len = sizeof(int);
        snprintf(name, SYSCTL_ID_LEN, "dev.cpu.%d.temperature", id);
        if (!sysctlbyname(name, &temp[id], &len, NULL, 0)) {
            snprintf(name, SYSCTL_ID_LEN, "cpu/cpu%d/temperature", id);
            registerMonitor(name, "float", printCPUxTemperature, printCPUxTemperatureInfo, sm);
        } else
            temp[id] = -1;
    }

    updateCpuInfo();
}
Example #21
0
void getMdadmDetail( ArrayInfo* MyArray ) {
	int fd[2];
	pid_t ChildPID;
	ssize_t nbytes;
	
	char sensorName[128];
	char arrayDevice[ARRAYNAMELEN + 5];
	char format[ 32 ];
	char lineBuf[ 1024 ];
	char mdadmStatBuf[ MDADMSTATBUFSIZE ];	/* Buffer for mdadm --detail */
	char* mdadmStatBufP;

	/* Create a pipe */
	if(pipe(fd) == -1)
	{
		perror("Could not create a pipe to launch mdadm.");
		exit(1);
	}

	/* Fork */
	if((ChildPID = fork()) == -1)
	{
		perror("Could not fork to launch mdadm.");
		exit(1);
	}

	/* Child will execute the program, parent will listen. */

	if (ChildPID == 0) {
	/* Child process */

		/* Child will execute the program, parent will listen. */
		/* Close stdout, duplicate the input side of pipe to stdout */
		dup2(fd[1], 1);
		/* Close output side of pipe */
		close(fd[0]);
		close(2);

		snprintf( arrayDevice, sizeof( arrayDevice ), "/dev/%s", MyArray->ArrayName );
		execl ("/sbin/mdadm", "mdadm", "--detail", arrayDevice, (char *)0);
		exit(0); /* In case /sbin/mdadm isn't found */
		/* Child is now dead, as per our request */
	}
	
	/* Parent process */
	
	/* Close input side of pipe */
	close(fd[1]);

	waitpid( ChildPID, 0, 0);
	
	/* Fill mdadmStatBuf with pipe's output */
	nbytes = read( fd[0], mdadmStatBuf, MDADMSTATBUFSIZE-1 );
        if (nbytes >= 0)
	   mdadmStatBuf[nbytes] = '\0';

	/* Now, go through mdadmStatBuf line by line. Register monitors along the way */
	sprintf( format, "%%%d[^\n]\n", (int)sizeof( lineBuf ) - 1 );
	mdadmStatBufP = mdadmStatBuf;
	while (sscanf(mdadmStatBufP, format, lineBuf) != EOF) {
		lineBuf[sizeof(lineBuf) - 1] = '\0';
		mdadmStatBufP += strlen(lineBuf) + 1;  /* move mdadmStatBufP to next line */
		
		if ( sscanf(lineBuf, "  Array Size : %d", &MyArray->ArraySizeKB) == 1 ) {
			MyArray->ArraySizeIsAlive = true;
			if ( !MyArray->ArraySizeIsRegistered ) {
				sprintf(sensorName, "SoftRaid/%s/ArraySizeKB", MyArray->ArrayName);
				registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

				MyArray->ArraySizeIsRegistered = true;
			}
		}

		/* Versions of mdadm prior to 2.6 used "Device Size" instead of "Used Dev Size"
		 */
		else if ( ( sscanf(lineBuf, " Device Size : %d", &MyArray->UsedDeviceSizeKB) == 1 ) ||
			( sscanf(lineBuf, " Used Dev Size : %d", &MyArray->UsedDeviceSizeKB) == 1 ) ) {
			MyArray->UsedDeviceSizeIsAlive = true;
			if ( !MyArray->UsedDeviceSizeIsRegistered ) {
				sprintf(sensorName, "SoftRaid/%s/UsedDeviceSizeKB", MyArray->ArrayName);
				registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );
				MyArray->UsedDeviceSizeIsRegistered = true;
			}
		}

		else if ( sscanf(lineBuf, "Preferred Minor : %d", &MyArray->PreferredMinor) == 1 ) {
			MyArray->PreferredMinorIsAlive = true;
			if ( !MyArray->PreferredMinorIsRegistered ) {
				sprintf(sensorName, "SoftRaid/%s/PreferredMinor", MyArray->ArrayName);
				registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );
				MyArray->PreferredMinorIsRegistered = true;
			}
		}
	}

	/* Note: Don't test NumBlocksIsAlive, because it hasn't been set yet */
	if (    (!MyArray->ArraySizeIsAlive      && MyArray->ArraySizeIsRegistered      ) ||
		(!MyArray->UsedDeviceSizeIsAlive && MyArray->UsedDeviceSizeIsRegistered ) ||
		(!MyArray->PreferredMinorIsAlive && MyArray->PreferredMinorIsRegistered ) 
		) {
		print_error( "RECONFIGURE" );
		log_error( "Soft raid device disappeared" );
		return;
	}
}
Example #22
0
ArrayInfo *getOrCreateArrayInfo(char *array_name, int array_name_length) {
	ArrayInfo key;
	INDEX idx;
	ArrayInfo* MyArray;
	/*We have the array name.  see if we already have a record for it*/
	strncpy(key.ArrayName, array_name, array_name_length);
	key.ArrayName[array_name_length]='\0';
	if ( ( idx = search_ctnr( ArrayInfos, ArrayInfoEqual, &key ) ) == 0 ) {
		/* Found an existing array device */
		MyArray = get_ctnr( ArrayInfos, idx );
	}
	else {
		/* Found a new array device. Create a data structure for it. */
		MyArray = calloc(1,sizeof (ArrayInfo));
		if (MyArray == NULL) {
			/* Memory could not be allocated, so print an error and exit. */
			fprintf(stderr, "Could not allocate memory\n");
			exit(EXIT_FAILURE);
		}
		strcpy( MyArray->ArrayName, key.ArrayName );
		/* Add this array to our list of array devices */
		push_ctnr(ArrayInfos, MyArray);
		char sensorName[128];
		sprintf(sensorName, "SoftRaid/%s/NumBlocks", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/TotalDevices", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/FailedDevices", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/SpareDevices", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/NumRaidDevices", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/WorkingDevices", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/ActiveDevices", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/RaidType", MyArray->ArrayName);
		registerMonitor(sensorName, "string", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/DeviceNumber", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );

		sprintf(sensorName, "SoftRaid/%s/ResyncingPercent", MyArray->ArrayName);
		registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM );
		
		sprintf(sensorName, "SoftRaid/%s/DiskInfo", MyArray->ArrayName);
		registerMonitor(sensorName, "listview", printArrayAttribute, printArrayAttributeInfo, StatSM );

	}
	return MyArray;
}
Example #23
0
void initStat( struct SensorModul* sm ) {
	/* The CPU load is calculated from the values in /proc/stat. The cpu
	* entry contains 7 counters. These counters count the number of ticks
	* the system has spend on user processes, system processes, nice
	* processes, idle and IO-wait time, hard and soft interrupts.
	*
	* SMP systems will have cpu1 to cpuN lines right after the cpu info. The
	* format is identical to cpu and reports the information for each cpu.
	* Linux kernels <= 2.0 do not provide this information!
	*
	* The /proc/stat file looks like this:
	*
	* cpu  <user> <nice> <system> <idling> <waiting> <hardinterrupt> <softinterrupt>
	* disk 7797 0 0 0
	* disk_rio 6889 0 0 0
	* disk_wio 908 0 0 0
	* disk_rblk 13775 0 0 0
	* disk_wblk 1816 0 0 0
	* page 27575 1330
	* swap 1 0
	* intr 50444 38672 2557 0 0 0 0 2 0 2 0 0 3 1429 1 7778 0
	* ctxt 54155
	* btime 917379184
	* processes 347 
	*
	* Linux kernel >= 2.4.0 have one or more disk_io: lines instead of
	* the disk_* lines.
	*
	* Linux kernel >= 2.6.x(?) have disk I/O stats in /proc/diskstats
	* and no disk relevant lines are found in /proc/stat
	*/
	
	char format[ 32 ];
	char tagFormat[ 16 ];
	char buf[ 1024 ];
	char tag[ 32 ];
	
	StatSM = sm;
	
	sprintf( format, "%%%d[^\n]\n", (int)sizeof( buf ) - 1 );
	sprintf( tagFormat, "%%%ds", (int)sizeof( tag ) - 1 );

    FILE *stat = fopen("/proc/stat", "r");
    if(!stat) {
		print_error( "Cannot open file \'/proc/stat\'!\n"
				"The kernel needs to be compiled with support\n"
				"for /proc file system enabled!\n" );
		return;
    }
	while ( fscanf( stat, format, buf ) == 1 ) {
		buf[ sizeof( buf ) - 1 ] = '\0';
		sscanf( buf, tagFormat, tag );
		
		if ( strcmp( "cpu", tag ) == 0 ) {
			/* Total CPU load */
			registerMonitor( "cpu/system/user", "float", printCPUUser, printCPUUserInfo, StatSM );
			registerMonitor( "cpu/system/nice", "float", printCPUNice, printCPUNiceInfo, StatSM );
			registerMonitor( "cpu/system/sys", "float", printCPUSys, printCPUSysInfo, StatSM );
			registerMonitor( "cpu/system/TotalLoad", "float", printCPUTotalLoad, printCPUTotalLoadInfo, StatSM );
			registerMonitor( "cpu/system/idle", "float", printCPUIdle, printCPUIdleInfo, StatSM );
			registerMonitor( "cpu/system/wait", "float", printCPUWait, printCPUWaitInfo, StatSM );

			/* Monitor names changed from kde3 => kde4. Remain compatible with legacy requests when possible. */
			registerLegacyMonitor( "cpu/user", "float", printCPUUser, printCPUUserInfo, StatSM );
			registerLegacyMonitor( "cpu/nice", "float", printCPUNice, printCPUNiceInfo, StatSM );
			registerLegacyMonitor( "cpu/sys", "float", printCPUSys, printCPUSysInfo, StatSM );
			registerLegacyMonitor( "cpu/TotalLoad", "float", printCPUTotalLoad, printCPUTotalLoadInfo, StatSM );
			registerLegacyMonitor( "cpu/idle", "float", printCPUIdle, printCPUIdleInfo, StatSM );
			registerLegacyMonitor( "cpu/wait", "float", printCPUWait, printCPUWaitInfo, StatSM );
		}
		else if ( strncmp( "cpu", tag, 3 ) == 0 ) {
			char cmdName[ 24 ];
			/* Load for each SMP CPU */
			int id;
			
			sscanf( tag + 3, "%d", &id );
			CPUCount++;
			sprintf( cmdName, "cpu/cpu%d/user", id );
			registerMonitor( cmdName, "float", printCPUxUser, printCPUxUserInfo, StatSM );
			sprintf( cmdName, "cpu/cpu%d/nice", id );
			registerMonitor( cmdName, "float", printCPUxNice, printCPUxNiceInfo, StatSM );
			sprintf( cmdName, "cpu/cpu%d/sys", id );
			registerMonitor( cmdName, "float", printCPUxSys, printCPUxSysInfo, StatSM );
			sprintf( cmdName, "cpu/cpu%d/TotalLoad", id );
			registerMonitor( cmdName, "float", printCPUxTotalLoad, printCPUxTotalLoadInfo, StatSM );
			sprintf( cmdName, "cpu/cpu%d/idle", id );
			registerMonitor( cmdName, "float", printCPUxIdle, printCPUxIdleInfo, StatSM );
			sprintf( cmdName, "cpu/cpu%d/wait", id );
			registerMonitor( cmdName, "float", printCPUxWait, printCPUxWaitInfo, StatSM );
		}
		else if ( strcmp( "disk", tag ) == 0 ) {
			unsigned long val;
			char* b = buf + 5;
			
			/* Count the number of registered disks */
			for ( DiskCount = 0; *b && sscanf( b, "%lu", &val ) == 1; DiskCount++ ) {
				while ( *b && isblank( *b++ ) );
				while ( *b && isdigit( *b++ ) );
			}
			
			if ( DiskCount > 0 )
				DiskLoad = (DiskLoadInfo*)malloc( sizeof( DiskLoadInfo ) * DiskCount );

			initStatDisk( tag, buf, "disk", "disk", 0, print24DiskTotal, print24DiskTotalInfo );
		}
		else if ( initStatDisk( tag, buf, "disk_rio", "rio", 1, print24DiskRIO, print24DiskRIOInfo ) );
		else if ( initStatDisk( tag, buf, "disk_wio", "wio", 2, print24DiskWIO, print24DiskWIOInfo ) );
		else if ( initStatDisk( tag, buf, "disk_rblk", "rblk", 3, print24DiskRBlk, print24DiskRBlkInfo ) );
		else if ( initStatDisk( tag, buf, "disk_wblk", "wblk", 4, print24DiskWBlk, print24DiskWBlkInfo ) );
		else if ( strcmp( "disk_io:", tag ) == 0 )
			process24DiskIO( buf );
		else if ( strcmp( "page", tag ) == 0 ) {
			sscanf( buf + 5, "%lu %lu", &OldPageIn, &OldPageOut );
			registerMonitor( "cpu/pageIn", "float", printPageIn, printPageInInfo, StatSM );
			registerMonitor( "cpu/pageOut", "float", printPageOut, printPageOutInfo, StatSM );
		}
		else if ( strcmp( "intr", tag ) == 0 ) {
			unsigned int i;
			char cmdName[ 32 ];
			char* p = buf + 5;
			
			/* Count the number of listed values in the intr line. */
			NumOfInts = 0;
			while ( *p )
				if ( *p++ == ' ' )
					NumOfInts++;
			
			/* It looks like anything above 24 is always 0. So let's just
			* ignore this for the time being. */
			if ( NumOfInts > 25 )
				NumOfInts = 25;
			OldIntr = (unsigned long*)malloc( NumOfInts * sizeof( unsigned long ) );
			Intr = (unsigned long*)malloc( NumOfInts * sizeof( unsigned long ) );
			i = 0;
			p = buf + 5;
			for ( i = 0; p && i < NumOfInts; i++ ) {
				sscanf( p, "%lu", &OldIntr[ i ] );
				while ( *p && *p != ' ' )
					p++;
				while ( *p && *p == ' ' )
					p++;
				sprintf( cmdName, "cpu/interrupts/int%02d", i );
				registerMonitor( cmdName, "float", printInterruptx, printInterruptxInfo, StatSM );
			}
		}
		else if ( strcmp( "ctxt", tag ) == 0 ) {
			sscanf( buf + 5, "%lu", &OldCtxt );
			registerMonitor( "cpu/context", "float", printCtxt, printCtxtInfo, StatSM );
		}
	}
    fclose(stat);

	stat = fopen("/proc/vmstat", "r");
    if(!stat) {
		print_error( "Cannot open file \'/proc/vmstat\'\n");
    } else {
        while ( fscanf( stat, format, buf ) == 1 ) {
            buf[ sizeof( buf ) - 1 ] = '\0';
            sscanf( buf, tagFormat, tag );

            if ( strcmp( "pgpgin", tag ) == 0 ) {
                sscanf( buf + 7, "%lu", &OldPageIn );
                registerMonitor( "cpu/pageIn", "float", printPageIn, printPageInInfo, StatSM );
            }
            else if ( strcmp( "pgpgout", tag ) == 0 ) {
                sscanf( buf + 7, "%lu", &OldPageOut );
                registerMonitor( "cpu/pageOut", "float", printPageOut, printPageOutInfo, StatSM );
            }
        }
        fclose(stat);
    }
	if ( CPUCount > 0 )
		SMPLoad = (CPULoadInfo*)calloc( CPUCount, sizeof( CPULoadInfo ) );
	
	/* Call processStat to eliminate initial peek values. */
	processStat();
}
Example #24
0
void initNetDev( struct SensorModul* sm ) {
#ifdef HAVE_KSTAT
    char	mon[128];
    int	i;

    getnetdevlist();
    for( i = 0; i < NetDevCount; i++ ) {
        sprintf( mon, "network/%s/ipackets", IfInfo[i].Name );
        registerMonitor( mon, "integer",
                         printIPackets, printIPacketsInfo, sm );
        sprintf( mon, "network/%s/opackets", IfInfo[i].Name );
        registerMonitor( mon, "integer",
                         printOPackets, printOPacketsInfo, sm );
        /*
         *  if this isn't a loopback interface,
         *  register additional monitors
         */
        if( ! (IfInfo[i].flags & IFF_LOOPBACK) ) {
            /*
             *  recv errors
             */
            sprintf( mon, "network/%s/ierrors",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printIErrors, printIErrorsInfo, sm );
            /*
             *  xmit errors
             */
            sprintf( mon, "network/%s/oerrors",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printOErrors, printOErrorsInfo, sm );
            /*
             *  collisions
             */
            sprintf( mon, "network/%s/collisions",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printCollisions, printCollisionsInfo, sm );
            /*
             *  multicast xmits
             */
            sprintf( mon, "network/%s/multixmt",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printMultiXmits, printMultiXmitsInfo, sm );
            /*
             *  multicast recvs
             */
            sprintf( mon, "network/%s/multircv",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printMultiRecvs, printMultiRecvsInfo, sm );
            /*
             *  broadcast xmits
             */
            sprintf( mon, "network/%s/brdcstxmt",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printBcastXmits, printBcastXmitsInfo, sm );
            /*
             *  broadcast recvs
             */
            sprintf( mon, "network/%s/brdcstrcv",
                     IfInfo[i].Name );
            registerMonitor( mon, "integer",
                             printBcastRecvs, printBcastRecvsInfo, sm );
        }
    }
#endif
}