Tratando o log do snmptrapd
Publicado por Paulo Augusto de Almeida Ferreira 30/03/2006
[ Hits: 6.234 ]
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);
Exemplo de sockets: um client e um server bem simples
Connect - um simples programa para atravessar proxys Socks
Simples servidor http com concorrência feito em C
Nenhum comentário foi encontrado.
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Faça suas próprias atualizações de pacotes/programas no Void Linux e torne-se um Contribuidor
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Utilizando a Ferramenta xcheckrestart no Void Linux
Pisando no acelerador do Linux Mint: Kernel XanMod, zRAM e Ajustes de Swap
Como compilar kernel no Linux Mint
Abrir um arquivo URL pelo Clipper (8)
Seno, Coseno, Tangente em CLIPPER (1)
Inserir uma URL num arquvo pelo Ubuntu (CLIPPER) (0)
VMWare Player não conecta na rede nem consigo intercambiar arquivos (1)









