Tratando o log do snmptrapd
Publicado por Paulo Augusto de Almeida Ferreira 30/03/2006
[ Hits: 5.868 ]
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);
Connect - um simples programa para atravessar proxys Socks
Usando sockets para monitorar servidores
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
Falta pacotes de suporte ao sistema de arquivos (Gerenciador de discos... (2)
Enzo quer programar mas não faz código pra não bugar (12)
Erro de Montagem SSD Nvme (12)
WebScrapping através de screenshot devido a bloqueios de Shadow DOM (1)