Tratando o log do snmptrapd
Publicado por Paulo Augusto de Almeida Ferreira 30/03/2006
[ Hits: 5.859 ]
Senhores, Vamos lá.
Esse script faz simplesmente o seguinte,
Coleta as informações enviadas pelo snmptrapd (em um arquivo de logs) e separa os traps por arquivos por hosts.
+ para frente, vou publicar um que leia esses arquivos e retorne para o nagios... :)
Abraços.
// Bibliotecas // #include <stdio.h> #include <string.h> #include <unistd.h> #include <regex.h> #include <dirent.h> #include <errno.h> // Variaveis Constates // #define tmp_trap "/tmp/traplog.tmp" #define max_linha 2048 #define max_command 255 // Expressao Regular // /* Procura o caracter [ ++ numeros de 1 a 9 ([1-9]) compondo um intervalo de 1 a 3 numeros ({1,3}) ++ procura o caracter . ++ numeros de 1 a 9 ... ++ procura o caracter ] */ #define expressao "[[]++[1-9]{1,3}++.++[1-9]{1,3}++.++[1-9]{1,3}++.++[1-9]{1,3}++[]]" // Prototipos // void help (void); //Função que descreve o help int find_dir (char *path); //função que testa se o diretorio existe, caso não exista o diretorio é criado //Funções // void help (void) { printf("..:: help ::.. \n\n"); printf("./programa <diretorio> <arquivo1> <arquivo2>"); printf("Digite os segintes parametros: \n"); printf("Diretorio do arquivo, Ex: /usr/local/ \n"); printf("Digite o nome do arquivo (arquivo de logs do snmptrapd \n"); printf("Digite o nome do diretorio de saida dos arquivos, Ex: /home/nagios/traps \n "); } int find_dir (char *path){ // recebe o caminho do diretorio (ex: /home/paulo/teste/casa/) char mkdir_system[max_command]; //armazena o comando do shell char test[max_command]; //armazena o caminho do diretorio int i; strcpy(test,"/"); //inclui no inico de test o caracter "/" for (i=0;i<strlen(path);i++) { if (path[i]=='/') { // procura o caracter "/" if ((opendir(test)) == NULL) { // testa se o diretorio existe, se == NULL ele não existe // Cria o caminho para criar o diretorio strcpy(mkdir_system,"mkdir "); strcat(mkdir_system,test); mkdir_system[strlen(mkdir_system)]='{FONTE}'; printf("Criando Diretorio: %s \n",test); system(mkdir_system); // Executa o comando no shell pra criar o diretorio } strcat(test,"/"); //inclui o / para o prossimo diretorio (ex: /home/paulo + /) test[strlen(test)]='{FONTE}'; } else { test[i]=path[i]; //incluie os caracters de path em test test[i+1]='{FONTE}'; } } return(0); // Retorna quando tudo concluido } // Inicio da Main // int main (int arg, char *argv[]) { // Recebe como parametro argv[1] = Diretorio do arquvio, argv[2] = arquivo e argv[3] = local de saida if (!strcmp(argv[1],"--help")) { help(); // chama o Help return(3); // sai do programa } FILE *ftemp_trap; // Ponteiro da Copia temporario do arquivo de traps FILE *fsaida; // Ponterio do Arquivo de Saida do tratamento do Traps FILE *fsaida2; // Ponterio do Arquivo Secundario para Saidas do tratamento das Traps FILE *ftest; // Ponteiro usado para verificar se o arquivo exite ou não, regex_t reg; // Variavel refente a expressão regular. char cmd_system[max_linha]; // Armazeno o comando do Shell char cmd_system2[max_linha]; // Usado para concaternas os comandos do Shell char troca[max_command]; // Usado para concatenar a caminho de saida char linha[max_linha]; // Armazena a linha do arquivo char host[50]; // Armazena o nome do Host int i, count, j; strcpy(cmd_system2,argv[1]); // Captura o caminho do diretorio if (cmd_system2[strlen(argv[1])-1]!='/') //Verifica se no argumento 1 foi passado o carcter / no final da linha strcat(cmd_system2,"/"); strcat(cmd_system2,argv[2]); // Concatena com o nome do arquivo if ((ftest = fopen (cmd_system2,"r"))==NULL) { // Testa se o arquivo existe no diretorio falado printf("..:: Error ::.. O arquivo %s não existe.\n", cmd_system2); return(3); } fclose(ftest); // Bloco para copiar o arquivo // strcpy(cmd_system,"cp "); strcat(cmd_system,cmd_system2); strcat(cmd_system," "); strcat(cmd_system,tmp_trap); // Copia o arquivo para a pasta definida na variavel constante printf("%s \n",cmd_system); system(cmd_system); // Fim do Bloco // // Bloco para limparo o arquivo // strcpy(cmd_system,"echo ' ' > "); // imprimi ' '(Vazil) noa aqruivo strcat(cmd_system,cmd_system2); printf("%s \n", cmd_system); system(cmd_system); // Fim do Bloco // if ((ftemp_trap = fopen (tmp_trap,"r"))==NULL) { // Verifica e abre o arquivo copiado printf("..:: Error ::..O Arquivo %s Não existe \n", tmp_trap); return(3); } strcpy(cmd_system, argv[3]); //coleta o caminho de saida if (cmd_system[0]!='/') { // verifica se no inicio existe o caracter "/" strcpy(troca,"/"); strcat(troca,cmd_system); troca[strlen(troca)]='{FONTE}'; strcpy(cmd_system,troca); } if (cmd_system[strlen(cmd_system)-1]!='/') { // verifica se no fim do cainmho existe o caracter "/" strcat(cmd_system,"/"); cmd_system[strlen(cmd_system)]='{FONTE}'; } if (find_dir(cmd_system)==3) // Verifica e Cria os diretorios de saida printf("..:: Error ::.."); strcpy(cmd_system2,cmd_system); // Armazena o cainho de saida validado if (regcomp(® , expressao, REG_EXTENDED|REG_NOSUB) != 0) { // compila a ER passada em expressao em caso de erro, a funcao retorna diferente de zero printf("..:: Error ::.. Impossivel compilar a regras da expressao regular (regcomp)\n"); return(3); } while (!feof(ftemp_trap)) { /* Enquanto não chegar ao final do arquivo */ fgets(linha, max_linha-1, ftemp_trap); //Coleta a linha if ((regexec(®,linha, 0, (regmatch_t *)NULL, 0)) == 0) { // Aplica a expressao regular count=0; j=0; strcpy(host," "); // Bloco para separar o nome da maquina // for (i=0; i<strlen(linha); i++) { if (linha[i]==' ') count+=1; else if (count==2) { host[j]=linha[i]; j+=1; } } // Fim do Bloco // strcat(cmd_system,host); // Concatena com o caminho do diretorio strcat(cmd_system,".trap"); // Concatena com ".trap" (exemplo de do valor ataul: /home/paulo/teste/geysa.trap if ((fsaida = fopen (cmd_system,"a"))==NULL) { printf("..:: Error ::.. Impossivel de abrir o arquivo %s",cmd_system); } //Cria o arquivo de saida else{ fputs(linha,fsaida); // Imprime a linha no arquivo while ((strlen(linha)>1)&&(!feof(ftemp_trap))) { //Ate encontrar um linha em brando ou ate o fim do arquivo fgets(linha, max_linha-1, ftemp_trap); // Captura a linha if ((strstr(linha,"NET-SNMP version")>0) || (strstr(linha,"couldn't open udp:162")>0)||(strstr(linha,"No such file or directory")>0)) { //Verifica as palavras reservadas do snmptrapd ou sistema strcpy(cmd_system, cmd_system2); // Armazena o cainho de saida validado strcat(cmd_system,"default_system.log"); // Arquivo de saida dos logs do snmptrapd if ((fsaida2 = fopen (cmd_system,"a"))==NULL) {printf("..:: Error ::.. Impossivel de abrir o arquivo %s",cmd_system); } //Cria o arquivo de saida else { fputs(linha,fsaida2); // Imprime a linha no arquivo fclose(fsaida2); //Fecha o arquivo } } else { fputs(linha,fsaida); // Imprime a linha no arquivo } } strcpy(cmd_system, cmd_system2); // Armazena o cainho de saida validado fclose(fsaida); //Fecha o arquivo } } else { if ((strstr(linha,"NET-SNMP version")>0) || (strstr(linha,"couldn't open udp:162")>0)||(strstr(linha,"No such file or directory")>0)) { //Verifica as palavras reservadas do snmptrapd ou sistema strcat(cmd_system,"default_system.log"); // Arquivo de saida dos logs do snmptrapd if ((fsaida2 = fopen (cmd_system,"a"))==NULL) {printf("..:: Error ::.. Impossivel de abrir o arquivo %s",cmd_system); } //Cria o arquivo de saida else { fputs(linha,fsaida2); // Imprime a linha no arquivo strcpy(cmd_system, cmd_system2); // Armazena o cainho de saida validado fclose(fsaida2); //Fecha o arquivo } } } } fclose(ftemp_trap); //Fecha o arquivo return(0);
Robo HTTP usando socket e código multiplataforma
Calcular Broadcast e IPs disponíveis
Nenhum comentário foi encontrado.
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
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)