voici un petit bout de code C qui mesure l’activité CPU d’une machine et envoie les statistiques à une machine de monitoring
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define BUFSIZE 1024
enum { CURRENT , OLD , DIFF , PERCENT , TABSIZE };
enum { USR, NICE, SYSTEM , IDLE , IOWAIT , IRQ , SOFTIRQ , TOTAL , NBCOLS };
enum { ERROR, OK };
unsigned long long int table[NBCOLS][TABSIZE];
void setcolor(int f, int b) { printf("%c[0;%d;%dm",27,30+f,40+b); }
void setfcolor(int f) { printf("%c[%d;%dm", 27, f/8, 30+(f%8) ); }
void setbcolor(int b) { printf("%c[%d;%dm", 27, b/8, 40+(b%8) ); }
void setdefault(void) { printf("%c[m",27); }
char thishostname[BUFSIZE];
int s;
struct sockaddr_in srvAddr;
struct hostent *h;
void recuphostname(void)
{ FILE * f;
f=fopen("/etc/hostname" ,"r");
fgets(thishostname , BUFSIZE-1 , f);
if ( thishostname[strlen(thishostname)-1] == '\n') thishostname[strlen(thishostname)-1] ='\0';
fclose(f);
}
int recup(void)
{ FILE * f;
char cpuline[BUFSIZE];
unsigned int i;
f=fopen("/proc/stat" ,"r");
if (!f) return ERROR;
fgets(cpuline , BUFSIZE-1 , f);
fclose(f);
for ( i=0 ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[USR][CURRENT] ) );
for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[NICE][CURRENT] ) );
for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[SYSTEM][CURRENT] ) );
for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[IDLE][CURRENT] ) );
for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[IOWAIT][CURRENT] ) );
for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[IRQ][CURRENT] ) );
for ( i++ ; cpuline[i] != ' ' && i<BUFSIZE ; i++ ); i++;
sscanf(cpuline+i, "%llu", &( table[SOFTIRQ][CURRENT] ) );
return OK;
}
void affiche(void)
{ printf("USR=%03lu ", table[USR][PERCENT]);
printf("NICE=%03lu ", table[NICE][PERCENT]);
printf("SYSTEM=%03lu ", table[SYSTEM][PERCENT]);
printf("IDLE=%03lu ", table[IDLE][PERCENT]);
printf("IOWAIT=%03lu ", table[IOWAIT][PERCENT]);
printf("IRQ=%03lu ", table[IRQ][PERCENT]);
printf("SOFTIRQ=%03lu\n", table[SOFTIRQ][PERCENT]);
}
void affiche2(void)
{ int i;
int cpt=0;
printf("[");
//setfcolor(0);
setfcolor(2);
for ( i=0 ; i < table[USR][PERCENT] ; i++ ) { putc('U',stdout); cpt++; }
setfcolor(1);
for ( i=0 ; i < table[SYSTEM][PERCENT] ; i++ ) { putc('S',stdout); cpt++; }
setfcolor(4);
for ( i=0 ; i < table[IOWAIT][PERCENT] ; i++ ) { putc('W',stdout); cpt++; }
setfcolor(6);
for ( i=0 ; i < table[IRQ][PERCENT]+table[SOFTIRQ][PERCENT] ; i++ ) { putc('I',stdout); cpt++; }
setdefault();
for ( i=cpt ; i < 100 ; i++ ) putc(' ',stdout);
printf("] CHARGE CPU : %4lu%% \n", 100 - table[IDLE][PERCENT] );
}
void affichenet(void)
{ char outbuffer[2000];
sprintf(outbuffer , "%s|",thishostname);
sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[USR][PERCENT]);
sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[NICE][PERCENT]);
sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[SYSTEM][PERCENT]);
sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IDLE][PERCENT]);
sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IOWAIT][PERCENT]);
sprintf(outbuffer+strlen(outbuffer) , "%lu|", table[IRQ][PERCENT]);
sprintf(outbuffer+strlen(outbuffer) , "%lu\n", table[SOFTIRQ][PERCENT]);
printf("%s", outbuffer);
sendto(s, outbuffer, strlen(outbuffer)+1, 0, (struct sockaddr *) &srvAddr, sizeof(srvAddr));
}
void submain(void)
{
unsigned int i=0;
if ( ! recup() ) return;
for ( i=USR ; i<TOTAL ; i++)
{ if (table[i][CURRENT]<table[i][OLD]) return;
}
table[TOTAL][CURRENT] = 0;
for ( i=USR ; i<TOTAL ; i++ )
table[TOTAL][CURRENT] += table[i][CURRENT]; /*genere le total */
for ( i=USR ; i<=TOTAL ; i++)
table[i][DIFF] = table[i][CURRENT] - table[i][OLD]; /*genere différences */
if ( table[TOTAL][DIFF] == 0 ) return;
for ( i=USR ; i<=TOTAL ; i++)
table[i][PERCENT] = ( table[i][DIFF] * 100 ) / table[TOTAL][DIFF]; /*calcul pourcentages */
//affiche2();
affichenet();
for ( i=USR ; i<=TOTAL ; i++ )
table[i][OLD]=table[i][CURRENT]; /*archive les anciennes valeur pour la prochaine mesure */
}
int main(void)
{
unsigned int i=0;
unsigned int j=0;
struct timespec ts;
ts.tv_sec=0;
ts.tv_nsec=100000000;
for ( i=USR ; i<=TOTAL ; i++) for (j=CURRENT ; j<NBCOLS ; j++ ) table[i][j]=0;
recuphostname();
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(31857);
srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
s=socket(AF_INET,SOCK_DGRAM,0);
if ( s<0 ) return 1;
while (1)
{ nanosleep(&ts, NULL);
submain();
}
return 0;
}