Usando sockets para monitorar servidores

Publicado por Davidson Esteves Nunes 26/10/2005

[ Hits: 9.206 ]

Download netcheck.c




Script em C que monitora servidores de rede, executa uma ação quando um deles para de responder e executa outra ação quando o mesmo fica on-line.

  



Esconder código-fonte

/*
 * NetCheck   Teste de rede
 *
 * Version:   1.0   19/10/2005
 *
 * Authors:   Davidson Esteves Nunes

*/


#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h> 
#include <signal.h>
#define BUFFSIZE 32

void Die(char *mess) { perror(mess); exit(1); }
int test(char *ip, char *porta);

void aviso(int);

int main(int argc, char *argv[]) {
   char downscript[128];  //responsavel pela acao a ser executada caso nao consiga conectar
   char upscript[128];  //responsavel pela acao a ser executada quando eu reconectar
   int r;
   int status, tempo, tempodefault, contador;
   fprintf(stdout, "NetCheck - Monitor de serviços de rede (by Davidson)!\n");
   if (argc != 5) {
      fprintf(stderr, "Sintaxe: client <server_ip> <porta> <down-script> <up-script>\n");
      exit(1);
   }

   if(fork()) {exit(1);}   //fica rodando em segundo plano
   

   strcpy(downscript, argv[3]);
   strcpy(upscript, argv[4]);
   tempodefault = 5;
   contador = 1;
   tempo = tempodefault; //a checagem é feita a cada n segundos
   
   while (1) {
      r = test(argv[1], argv[2]);
      if(r == 0) {
         contador++;
         if(contador==4) {
            //não roda o downscript logo de cara, o servidor pode ter demorado a responder
            system(downscript);
            contador = 1;
         }
         status = 0;
         tempo = 1;  //tenta recuperar o mais rapido possível
      } else {
         if(status == 0) {
            //signigica que houve uma queda e ainda estamos em down, mas agora como o host respondeu,
            //podemos rodar o script de reativação
            system(upscript);
            status = 1;
            tempo = tempodefault; //volta o tempo de checagem ao normal
            contador = 1;
         }
      }
      alarm(0);
      sleep(tempo);
      //fprintf(stdout, "Testando: \n");
   }
   exit(0);
}

int test(char *ip, char *porta) 
{
   //executa um teste de conexão no ip selecionado e retorna 1 para online e 0 para off-line
   int sock;
   char buffer[BUFFSIZE];
   struct sockaddr_in echoserver;
   unsigned int echolen;
   int received = 0;
   /* Create the TCP socket */
   if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
      Die("Não consegui criar o socket!!!");
   }

       /* Construct the server sockaddr_in structure */
   memset(&echoserver, 0, sizeof(echoserver));       /* Clear struct */
   echoserver.sin_family = AF_INET;                  /* Internet/IP */   
   echoserver.sin_addr.s_addr = inet_addr(ip);  /* IP address */
   echoserver.sin_port = htons(atoi(porta));       /* server port */
   
   struct sigaction sigact;
   sigset_t  sigset;

   /* set up handler for the timer alarm */
   sigemptyset(&sigset); /* create an empty signal mask set */
   sigact.sa_handler = aviso; /* use the wakeup() handler */
   sigact.sa_mask    = sigset; /* use the empty sigset */
   sigact.sa_flags   = 0;      /* no flags needed */
   sigaction(SIGALRM, &sigact, NULL);
   alarm(1);  /* set the timer alarm for 1 second */   
   if (connect(sock, (struct sockaddr *) &echoserver, sizeof(echoserver)) < 0) {return(0);}
   
   close(sock);
   return(1);   
}

void aviso(int s)
{   
   //alarm(1); /* what would happen without this statement? */
   //fprintf(stdout, "Alarme!\n");
}

Scripts recomendados

Tratando o log do snmptrapd

Mostrar IP em C#

Exemplo de Cliente e Servidor Usando Socket no Linux!

Sniffer ICMP

whateveryouwant.c


  

Comentários
[1] Comentário enviado por eltonhbm em 25/09/2009 - 00:46h

interessante...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts