home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.umcs.maine.edu
/
2015-02-07.ftp.umcs.maine.edu.tar
/
ftp.umcs.maine.edu
/
pub
/
thesis
/
zhongy
/
snmp
/
start.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-15
|
9KB
|
342 lines
/*
This is a generalized snmp client package.
Following main program will do statistic on the MIB object defined
on VAR.TXT file.
This package will do statistic on "any" MIB object on "any host" on an
interval defined by user.
(Right now, this package only support the integer based MIB ogject: integer,
counter,timeticks,gauge,)
All MIB objects are defined in MIB.TXT file
programer: Zhong Yunxiang
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/types.h>
#include <setjmp.h>
#include <signal.h>
#include "asn1.h"
#include "snmp.h"
#include "snmparse.h"
#include "snmpencode.h"
#include "snmprint.h"
#include "snmpbasic.h"
#include "../rule/rule.h"
#include "../rule/rule_based.h"
#include "../prob/prob_based.h"
/* extern ObjectType *FirstObject;*/
/*
struct ObjectType{
char Hostname[50];
char Obj_Name[50];
int Pre_Value;
int Diff_Value;
ObjectType *Next;
struct timeval time_left;
struct timeval time_interval;
};
*/
void snmp_usage()
{
fprintf(stderr,"\nusage: snmp start");
}
/**check event and problem
multi-problem: report
single-problem: report, update problem and event on the PDB file
no-problem: antipate problem according to the event
**/
void UPDATE_PDB(void)
{
ObjectType *ObjPtr;
char problem[NMaxProblems][NMaxCharactersProblem];
char event[NMaxSymptoms][NMaxCharactersSymptom];
int i,j,h;
struct ProblemSymptomType *SymptomPtr;
int num_problem, num_event;
time_t t;
FILE *file;
/*check and record all happening problem and event*/
ObjPtr=FirstObject;
num_problem=0;
num_event=0;
while (ObjPtr != NULL ) {
switch ((*ObjPtr).Type()) {
case MIB_VARIANCE:
break;
case MIB_VALUE:
break;
case PROBLEM:
if(((*ObjPtr).Known()==1) && (!strcmp( (*ObjPtr).Value(),"T"))) {
num_problem++;
printf("\nPROBLEM FOUND!!!: %s", (*ObjPtr).Name());
/* system("(*ObjPtr).Name()"); */
bzero(problem[num_problem],sizeof(problem[num_problem]));
strcpy(problem[num_problem], (*ObjPtr).Name() );
}
break;
case EVENT:
if(((*ObjPtr).Known()==1) && (!strcmp( (*ObjPtr).Value(),"T"))) {
num_event++;
bzero(event[num_event], sizeof(event[num_event]));
strcpy(event[num_event], (*ObjPtr).Name() );
}
break;
default:
break;
}
ObjPtr=(*ObjPtr).Next();
};
/*
num_problem > 1
if multiproblem happen, we don't update the PDB, because we can not
tell which event has relationship with which problem.
We have a way to change the problem occuring times only. That need
a little bit of work
*/
/*
one problem happen, we would better update the PDB
*/
if (num_problem == 1) {
/*update problem number*/
i=SearchProblem(problem[num_problem]);
Problem_Times[i]++;
/*update event num to corresponding problem*/
for (j=1; j<=num_event; j++) {
SymptomPtr=SymptomsProblem[i];
while (SymptomPtr !=NULL) {
if ( !strcmp(SymptomName[SymptomPtr->Number], event[j])) {
SymptomPtr->times++;
SymptomPtr->Likehood=(float)SymptomPtr->times/(float)Problem_Times[i];
break;
}
SymptomPtr=SymptomPtr->Next;
}
if (SymptomPtr == NULL ) {
SymptomPtr= new ProblemSymptomType;
SymptomPtr->times=1;
SymptomPtr->Likehood=1.0/(float)Problem_Times[i];
SymptomPtr->Number=SearchSymptom(event[j]);
SymptomPtr->Next=SymptomsProblem[i];
SymptomsProblem[i]=SymptomPtr;
}
}
/*update PDB.DBF file*/
SaveInFile();
}
printf("\nnum_problem: %d, num_event:%d\n",num_problem, num_event);
if ((num_problem == 0) && (num_event >0)) {
/*log the current happening events*/
if ((file=fopen("EVENT_LOG","a")) == NULL) {
printf("\n EVENT.LOG can not be opened");
exit(0);
}
t=time(NULL);
printf("\n second");
fprintf(file,"\n\n**%s**", ctime(&t)); /*put in time*/
for (i=1;i<=num_event;i++) /*log all events*/
fprintf(file, "\n------------%s",event[i]);
fclose(file);
/*Do diagnosis problems accoring to current happening events*/
Diagnosis_START(); /*no problem situation, problem based inference*/
}
}
void start()
{
struct snbentry test;
ObjectType *ObjPtr;
int i;
int num_problem,num_event;
char Hostname[50];
char Obj_name[50];
FILE *var_file;
long time_interval;
struct timeval t;
int firsttime;
int Current_Value;
NUM_MIBITEM=init_mib();
printf("\n num_mib_item:%d",NUM_MIBITEM);
printf("\n begin load database");
Load_DB();
ReadFromFile();
printf("\n begin initialize database");
/*initialize the value in database
get the value first time
*/
ObjPtr=FirstObject;
while (ObjPtr != NULL ) {
/* C struct
test=get_value(ObjPtr->Obj_Name,ObjPtr->Hostname);
ObjPtr->Pre_Value=test.sb_val.sv_val.sv_int;
ObjPtr=ObjPtr->Next;
*/
printf("\n hostname:%s, objname:%s",(*ObjPtr).Hostname(),(*ObjPtr).Obj_Name());
switch ((*ObjPtr).Type()) {
case MIB_VARIANCE:
test=get_value((*ObjPtr).Obj_Name(),(*ObjPtr).Hostname());
(*ObjPtr).set_prevalue(test.sb_val.sv_val.sv_int);
(*ObjPtr).set_Known(0);
break;
case MIB_VALUE:
test=get_value((*ObjPtr).Obj_Name(),(*ObjPtr).Hostname());
(*ObjPtr).set_prevalue(test.sb_val.sv_val.sv_int);
(*ObjPtr).set_diff(test.sb_val.sv_val.sv_int);
(*ObjPtr).set_Known(0);
break;
case PROBLEM:
case EVENT:
break;
default:
break;
}
ObjPtr=(*ObjPtr).Next();
};
printf("\n\n wait 5 seconds\n\n");
system("sleep 5");
/*
do retrieve
*/
do {
ObjPtr=FirstObject;
printf("\n OBJECT_TYPE Hostname Objname Current_val Diff Period");
printf("\n******************************************************************************");
while (ObjPtr != NULL ) {
switch ((*ObjPtr).Type()) {
case MIB_VARIANCE:
if (((*ObjPtr).Time_Left()).tv_sec == 0) {
test=get_value((*ObjPtr).Obj_Name(),(*ObjPtr).Hostname());
Current_Value=test.sb_val.sv_val.sv_int;
(*ObjPtr).set_diff(Current_Value -(*ObjPtr).Pre_Value());
(*ObjPtr).set_prevalue(Current_Value);
(*ObjPtr).set_timeleft((*ObjPtr).Time_Interval());
printf("\n%-4d", 1);
printf("%-25s",(*ObjPtr).Hostname());
printf(" %-20s",(*ObjPtr).Obj_Name());
printf("%-10d %-5d ",Current_Value,(*ObjPtr).Diff());
printf(" %-4d",((*ObjPtr).Time_Interval()).tv_sec);
printf("\n-----------------------------------------------------------------------------");
}
else {
t.tv_sec=((*ObjPtr).Time_Left()).tv_sec - 5;
(*ObjPtr).set_timeleft(t);
}
break;
case MIB_VALUE:
if (((*ObjPtr).Time_Left()).tv_sec == 0) {
test=get_value((*ObjPtr).Obj_Name(),(*ObjPtr).Hostname());
Current_Value=test.sb_val.sv_val.sv_int;
(*ObjPtr).set_prevalue((*ObjPtr).Diff()); /*save the old value*/
(*ObjPtr).set_diff(Current_Value); /*set the current value*/
(*ObjPtr).set_timeleft((*ObjPtr).Time_Interval());
printf("\n%-4d", 0);
printf("\n%-25s",(*ObjPtr).Hostname());
printf(" %-20s",(*ObjPtr).Obj_Name());
printf("%-10d %-5d ",Current_Value,(*ObjPtr).Diff());
printf(" %-4d",((*ObjPtr).Time_Interval()).tv_sec);
printf("\n-------------------------------------------------------
----------------------");
}
else {
t.tv_sec=((*ObjPtr).Time_Left()).tv_sec - 5;
(*ObjPtr).set_timeleft(t);
}
break;
case PROBLEM:
case EVENT:
break;
default:
break;
}
ObjPtr=(*ObjPtr).Next();
}
printf("\n\n\n");
/**Forward chaining**********************************************/
ForwardChaining();
UPDATE_PDB();
/* Diagnosis_START(); */
Clear_DB();
printf("\n\n wait 5 seconds\n\n");
system("sleep 5");
/* EraseScreen(); */
system("clear");
} while (1);
}