Tratando o log do snmptrapd
Publicado por Paulo Augusto de Almeida Ferreira 30/03/2006
[ Hits: 6.096 ]
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 Básico de Sockets em C
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Linux é a solução para o fim do Windows10? (2)
Problemas com Driver NVIDIA (4)
Programa fora de escala na tela do pc (28)
converter algoritmo C++ em C? (1)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)









