Usando sockets para monitorar servidores
Publicado por Davidson Esteves Nunes 26/10/2005
[ Hits: 9.842 ]
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.
/*
* 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");
}
Robo HTTP usando socket e código multiplataforma
Connect - um simples programa para atravessar proxys Socks
Bluefin - A nova geração de ambientes de trabalho Linux
Como atualizar sua versão estável do Debian
Cirurgia para acelerar o openSUSE em HD externo via USB
Pós-instalação do elementary OS 8.1
Quer auto-organizar janelas (tiling) no seu Linux? Veja como no Plasma 6 e no Gnome
Copiando caminho atual do terminal direto para o clipboard do teclado
archlinux resolução abaixou após atualização (18)
Conky não mostra temperaturas da CPU no notebook (7)
Estou com um problema no meu desktop do ubuntu (2)
Não estou conseguindo fazer funcionar meu Postfix na versão 2.4 no Deb... (0)









