Usando sockets para monitorar servidores
Publicado por Davidson Esteves Nunes 26/10/2005
[ Hits: 9.497 ]
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"); }
Connect - um simples programa para atravessar proxys Socks
Simulação de controle de fluxo usando sockets
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
A area de trabalho ficou preta (16)
Agora temos uma assistente virtual no fórum!!! (244)
Servidor said: 530 5.7.0 Must issue a STARTTLS command first (in r... (0)
Falta pacotes de suporte ao sistema de arquivos (Gerenciador de discos... (5)