Usando sockets para monitorar servidores
Publicado por Davidson Esteves Nunes 26/10/2005
[ Hits: 9.451 ]
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"); }
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
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Wifi não funciona no Aspire ES 15 com o Debian (8)
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta