Tratando o log do snmptrapd

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

[ Hits: 5.740 ]

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

Exemplo de sockets: um client e um server bem simples

Subdomain Finder

Servidor em C via UDP

Servidor TCP/IP em C

[C - Socket] UDP SERVER


  

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