Tratando o log do snmptrapd

Publicado por Paulo Augusto de Almeida Ferreira 30/03/2006

[ Hits: 5.726 ]

Download organize_trap.c




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.

  



Esconder código-fonte

// 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);

Scripts recomendados

Cliente em C via UDP

Simples TCP Cliente em C#

Funções básicas para conexão OpenSSL em C

ChangePassword

Simulação de controle de fluxo usando sockets


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts