Fév 082010
 

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;
}

Sorry, the comment form is closed at this time.