Simple example ?
    Corrado Giacomini 
    c.giacomini____acresearch.com
       
    Fri Oct  6 16:34:09 CEST 2000
    
    
  
Hello All,
    I have recently downloaded AGENT++ I have read the the documentation
and had a look in the agent examples
but still I ham a little bit confused about how things should be done.
Does anybody has a small example  of an agent implementing a table which
has row added through a set ?
attached you will find what I have currently wrote, is still in
progress..
-corrado
-------------- next part --------------
#include <Customer.h>
//////////////////////////////////////////////////////////////////////////////////////
//
//	customerId
//
customerId::customerId(const Oidx& oid) :
	MibLeaf(oid, READCREATE, new SnmpInt32()) 
{
}
customerId::~customerId()
{
}
MibEntryPtr 
customerId::clone()
{
        MibEntryPtr other = new customerId(oid);
        ((customerId*)other)->replace_value(value->clone());
        ((customerId*)other)->set_reference_to_table(my_table);
        return other;
}   
boolean 
customerId::value_ok(const Vbx& vb)
{
        return TRUE;
}  
//////////////////////////////////////////////////////////////////////////////////////
//
//	customerName
//
customerName::customerName(const Oidx& oid) :
	MibLeaf(oid, READCREATE, new OctetStr("")) 
{
}
customerName::~customerName()
{
}
MibEntryPtr 
customerName::clone()
{
        MibEntryPtr other = new customerName(oid);
        ((customerName*)other)->replace_value(value->clone());
        ((customerName*)other)->set_reference_to_table(my_table);
        return other;
}
 
void 
customerName::get_request(Request* req, int ind)
{
        // place instrumentation code (manipulating "value") here
        MibLeaf::get_request(req, ind);
}  
boolean 
customerName::value_ok(const Vbx& vb)
{
        return TRUE;
}  
//////////////////////////////////////////////////////////////////////////////////////
//
//	customerSurname
//
customerSurname::customerSurname(const Oidx& oid) :
	 MibLeaf(oid, READCREATE, new OctetStr()) 
{
}
customerSurname::~customerSurname()
{
}
MibEntryPtr 
customerSurname::clone()
{
        MibEntryPtr other = new customerSurname(oid);
        ((customerSurname*)other)->replace_value(value->clone());
        ((customerSurname*)other)->set_reference_to_table(my_table);
        return other;
}   
boolean 
customerSurname::value_ok(const Vbx&)
{
 	return TRUE;      
}
//////////////////////////////////////////////////////////////////////////////////////
//
//	customerAddress
//
customerAddress::customerAddress(const Oidx&) :
	 MibLeaf(oid, READCREATE, new OctetStr())
{
}
customerAddress::~customerAddress()
{
}
MibEntryPtr
customerAddress::clone()
{
        MibEntryPtr other = new customerAddress(oid);
        ((customerAddress*)other)->replace_value(value->clone());
        ((customerAddress*)other)->set_reference_to_table(my_table);
        return other;
}  
boolean 
customerAddress::value_ok(const Vbx&)
{
 	return TRUE;      
}
//////////////////////////////////////////////////////////////////////////////////////
//
//	customerPhone
//
customerPhone::customerPhone(const Oidx&) :
	 MibLeaf(oid, READCREATE, new OctetStr())  
{
}
customerPhone::~customerPhone()
{
}
MibEntryPtr
customerPhone::clone()
{
        MibEntryPtr other = new customerPhone(oid);
        ((customerPhone*)other)->replace_value(value->clone());
        ((customerPhone*)other)->set_reference_to_table(my_table);
        return other;
}       
boolean 
customerPhone::value_ok(const Vbx&)
{
 	return TRUE;      
}
//////////////////////////////////////////////////////////////////////////////////////
//
// customerRowStatus
//
customerRowStatus::customerRowStatus(const Oidx& id) :
	snmpRowStatus(id, READCREATE) 
{
}
customerRowStatus::~customerRowStatus()
{
}
boolean 
customerRowStatus::value_ok(const Vbx&)
{
 	return TRUE;      
}
//////////////////////////////////////////////////////////////////////////////////////
//
// 	customerTableEntry
//
customerTableEntry* customerTableEntry::instance = 0;
customerTableEntry::customerTableEntry():
	 MibTable(oidCustomerTableEntry)
{
        // This table object is a singleton. In order to access it use
        // the static pointer customerTableEntry::instance.
        instance = this;
 
        add_col(new customerId		(colCustomerId));
        add_col(new customerName	(colCustomerName));
        add_col(new customerSurname	(colCustomerSurname));
        add_col(new customerAddress	(colCustomerAddress));
        add_col(new customerPhone	(colCustomerPhone));
        add_col(new customerRowStatus	(colCustomerRowStatus));
	//
	// add one row just to see something at the beginin
	//
	add_entry(1001,"Pippo","Mc Pippis","Main Street n1","0493331234");
	add_entry(1002,"Minni","DeMinni",  "Main Street n2","0391380477");
}
customerTableEntry::~customerTableEntry()
{
}
void 
customerTableEntry::set_row(MibTableRow* row, int customerId, char* customerName, 
			    char* customerSurname, char* customerAddress,
                            char* customerPhone)
{
        row->get_nth(0)->replace_value(new SnmpInt32(customerId));
        row->get_nth(0)->replace_value(new OctetStr(customerName));
        row->get_nth(1)->replace_value(new OctetStr(customerSurname));
        row->get_nth(2)->replace_value(new OctetStr(customerAddress));
        row->get_nth(3)->replace_value(new OctetStr(customerPhone));
} 
void 
customerTableEntry::row_delete(MibTableRow* row, const Oidx& index)
{
        // The row 'row' with 'index' will be deleted.
        // Place any necessary actions here.
}  
MibTableRow *
customerTableEntry::add_entry (int   customerId, char* customerName, 
			       char* customerSurname, char* customerAddress, 
			       char* customerPhone) 
{
	Oidx index;		 // create Index
        index = customerId;
	if(contains(index)) {	 // check if we already have row with that index
	    // error
	    return 0;
	}
	else {
	    LOG_BEGIN(EVENT_LOG | 1);
            LOG("adding row....");
            LOG(index.get_printable());
            LOG_END;                                                                  
	   // Add the row with specified index and set row values
	   MibTableRow *row = add_row(index);
	   set_row(row, customerId, customerName, customerSurname,
                    customerAddress,customerPhone);
	
	   return row;
	}
}
 
boolean 
customerTableEntry::contains(Oidx index)
{
        OidListCursor<MibTableRow> cur;
        for (cur.init(&content); cur.get(); cur.next()) {
                if (strcmp(cur.get()->get_index().get_printable(),
                           index.get_printable()) == 0) {
                        return TRUE;
                }
        }
        return FALSE;
}   
void 
customerTableEntry::get_request(Request* req, int ind) 
{
}
 
int 
customerTableEntry::commit_set_request(Request* req, int ind) 
{
	return SNMP_ERROR_SUCCESS; 
}
 
int 
customerTableEntry::prepare_set_request(Request* req, int& ind) 
{
	 return SNMP_ERROR_SUCCESS; 
}
 
int 
customerTableEntry::undo_set_request(Request* req, int& ind) 
{
	 return SNMP_ERROR_SUCCESS; 
}
 
void 
customerTableEntry::cleanup_set_request(Request* req, int& ind)
{
}       
//////////////////////////////////////////////////////////////////////////////////////
//
//
//
 
customerMib::customerMib() : MibGroup(oidCustomerMibGroup, "CustomerMibGroup")
{
        add(new customerTableEntry());
}    
customerMib::~customerMib()
{
}
-------------- next part --------------
#ifndef _Customer_H_
#define _Customer_H_
#include <mib.h>
#include <snmp_textual_conventions.h>
#include <notification_originator.h>
#include <log.h>
#include <sim_mib.h>
#define oidCustomerMibGroup    		 "1.3.6.1.2.1.6915.1"
#define oidCustomerTable       		 "1.3.6.1.2.1.6915.1.1"
#define oidCustomerTableEntry          	 "1.3.6.1.2.1.6915.1.1.1"
#define oidCustomerId           	 "1.3.6.1.2.1.6915.1.1.1.1"
#define colCustomerId           	 "1"
#define oidCustomerName            	 "1.3.6.1.2.1.6915.1.1.1.2"
#define colCustomerName            	 "2"
#define oidCustomerSurname            	 "1.3.6.1.2.1.6915.1.1.1.3"
#define colCustomerSurname            	 "3"
#define oidCustomerAddress            	 "1.3.6.1.2.1.6915.1.1.1.4"
#define colCustomerAddress            	 "4"
#define oidCustomerPhone            	 "1.3.6.1.2.1.6915.1.1.1.5"
#define colCustomerPhone            	 "5"
#define oidCustomerRowStatus           	 "1.3.6.1.2.1.6915.1.1.1.6"
#define colCustomerRowStatus           	 "6"
class customerId : public MibLeaf  {
    public:
        customerId(const Oidx&);
        virtual ~customerId();
	virtual MibEntryPtr	clone(); 
	virtual boolean    	value_ok(const Vbx&);
	
};                                                    
class customerName : public MibLeaf {
    public:
	customerName(const Oidx&);
	virtual ~customerName();
	virtual MibEntryPtr     clone();   
	virtual void            get_request(Request*, int);  
	virtual boolean    	value_ok(const Vbx&);
};
class customerSurname : public MibLeaf {
    public:
	customerSurname(const Oidx&);
	virtual ~customerSurname();
        virtual MibEntryPtr     clone();  
	virtual boolean    	value_ok(const Vbx&);
};
class customerAddress : public MibLeaf {
    public:
        customerAddress(const Oidx&);
        virtual ~customerAddress();
 
	virtual MibEntryPtr     clone();  
        virtual boolean         value_ok(const Vbx&);
};    
class customerPhone : public MibLeaf {
    public:
        customerPhone(const Oidx&);
        virtual ~customerPhone();
 
        virtual MibEntryPtr     clone();  
        virtual boolean         value_ok(const Vbx&);
};    
class customerRowStatus : public snmpRowStatus  {
    public:
        customerRowStatus(const Oidx&);
        virtual ~customerRowStatus();
        virtual boolean         value_ok(const Vbx&);
};                                                    
class customerTableEntry : public MibTable  {
    public:
        customerTableEntry();
        virtual ~customerTableEntry();
	
	static customerTableEntry* instance; 
	
	virtual boolean	contains(Oidx index);
	virtual void	set_row( MibTableRow* r,
				 int   p0,  //customerId
				 char* p1,  //Name
		             	 char* p2,  //Surname
		             	 char* p3,  //Address
			     	 char* p4); //Phone //rowStatus
	virtual MibTableRow* add_entry (int   p0,  //Id
                               		char* p1,  //Name
                             		char* p2,  //Surname
                               		char* p3,  //Address
                               		char* p4); //Phone
                               		
	virtual void	row_delete(MibTableRow* row, const Oidx& index) ;
	int 	prepare_set_request(Request* req, int& ind);
	int 	undo_set_request(Request* req, int& ind);
	void	cleanup_set_request(Request* req, int& ind);
	int 	commit_set_request(Request* req, int ind);
	void 	get_request(Request* req, int ind);
	
};
 
class customerMib: public MibGroup
{
  public:
        customerMib();
        virtual ~customerMib();
};   
#endif
-------------- next part --------------
# Linux 
CFLAGS	        = -g -Wall 
# Digital Unix
#CFLAGS	        = -g -pthreads 
# Solaris 
#CFLAGS	        = -g -mt 
CLINK		= -c -o
CC              = cc
# Linux
CPP             = g++
# Digital Unix
#CPP             = cxx
# Solaris 
#CPP             = CC
RM              = rm -f 
INCLUDE		= -I. -I../../../include \
		  -I../../../../snmp++/include -I../../../../snmp++/src
SNMPLIBPATH     = ../../../../snmp++/lib
AGENTLIBPATH	= ../../../lib
RSAEUROLIBPATH  = ../../../../rsaeuro/install/unix
# Digital Unix 3.2 and 4.0
#LIB	        = -L$(AGENTLIBPATH) -L$(SNMPLIBPATH) -L$(RSAEUROLIBPATH) \
#	  	  -lagent++ -lsnmp++ -lrsaeuro -lpthread
# SOLARIS 2.6
#LIB	        = -L$(AGENTLIBPATH) -L$(SNMPLIBPATH) -L$(RSAEUROLIBPATH) \
#		  -lagent++ -lsnmp++ -lrsaeuro -lsocket -lnsl 
# Linux
LIB	        = -L$(AGENTLIBPATH) -L$(SNMPLIBPATH) -L$(RSAEUROLIBPATH) \
		  -lpthread -lagent++ -lsnmp++ -lrsaeuro #-lg++ 
AGENTOBJ	= Customer.o agent.o
EXECUTABLE	= agent
HEADERS		= ../include/Customer.h
all:		$(EXECUTABLE)
clean:  
	$(RM) *.o *~ ../include/*~ $(EXECUTABLE)
clobber: clean
	$(RM) $(EXECUTABLE)
#compile rules
.SUFFIXES:	.cpp
$(EXECUTABLE):  $(AGENTOBJ) $(SNMPLIBPATH)/libsnmp++.a \
		$(AGENTLIBPATH)/libagent++.a
		$(CPP) $(CFLAGS) -o $@ $(AGENTOBJ) $(LIB) 
%.o:		%.cpp $(HEADERS)
		$(RM) $@
		$(CPP) $(CFLAGS) $(CLINK) $@ $(INCLUDE) $< 
-------------- next part --------------
#include <stdlib.h>
#include <signal.h>
#include "agent++.h"
#include "log.h"
#include "snmp_group.h"
#include "system_group.h"
#include "snmp_target_mib.h"
#include "snmp_notification_mib.h"
#include "snmp_community_mib.h"
#include "notification_originator.h"
#include "oid_def.h"
#include "Customer.h"
#include "agentpp_simulation_mib.h"
// globals:
u_short port;
Mib* mib;
RequestList* reqList;
static void sig(int signo)
{
	if ((signo == SIGTERM) || (signo == SIGINT) ||
	    (signo == SIGSEGV)) {
		printf ("\n");
      
		switch (signo) {
		case SIGSEGV: {
			printf ("Segmentation fault, aborting.\n");
			exit(1);
		}
		case SIGTERM: 
		case SIGINT: {
		        delete mib;
			printf ("User abort\n");
			exit(0);
		}
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
//
// Function 	:	init_signals
//
// Description	:
//
void init_signals()
{
	//
	// Setup signal handler for SIGTERM SIGINT SIGSEGV
	//
	signal (SIGTERM, sig);
	signal (SIGINT,  sig);
	signal (SIGSEGV, sig); 
}	
////////////////////////////////////////////////////////////////////////////////
//
// Function 	:	init_mib
//
// Description	:
//
void init_mib(Mib& mib)
{
	//mib.add(new snmpGroup());
	mib.add(new customerMib());
	//mib.add(new snmp_notification_mib()); // this is need to send Traps
}	
////////////////////////////////////////////////////////////////////////////////
//
// Function 	:	main
//
// Description	:
//
int main (int argc, char* argv[])
{
	//
	// very simply get the port number as argument if any
	//
	if( argc > 1 )
	    port = atoi(argv[1]);
	else
	    port = 4700;
#ifndef _NO_LOGGING
	DefaultLog::log->set_filter(ERROR_LOG,   5);
	DefaultLog::log->set_filter(WARNING_LOG, 5);
	DefaultLog::log->set_filter(EVENT_LOG,   5);
	DefaultLog::log->set_filter(INFO_LOG,    5);
	DefaultLog::log->set_filter(DEBUG_LOG,   6);
#endif
	//
	// Open snmpsession with specified port number
	//
	int status;
	Snmpx snmp(status, port);
	if (status == SNMP_CLASS_SUCCESS) {
	    LOG_BEGIN(EVENT_LOG | 1);
	    LOG("main: SNMP listen port");
	    LOG(port);
	    LOG_END;
	}
	else {
	    LOG_BEGIN(ERROR_LOG | 0);
	    LOG("main: SNMP port init failed");
	    LOG(status);
	    LOG_END;
	    exit(1);
	}
	//
	// Create the agent MIB
	// Call Mib initialization functions
	// load persitent objects from disk
	// add supported objects
	//
	mib = new Mib();
	mib->init();
	init_mib(*mib);
	//
	// register signal handler for some signals
	//
	init_signals();
	//
	// register the RequestList to be used for answering request 
	// ( requestList for outgoing requests )
	//
	reqList = new RequestList();
	mib->set_request_list(reqList);
	//
	// Set the Snmpx session to be used for incoming requests
	//
	reqList->set_snmp(&snmp);
	
	/*
        Vbx* vbs = 0;
        coldStartOid coldOid;
        NotificationOriginator no;
        UdpAddress dest("127.0.0.1/162");
        no.add_v1_trap_destination(dest);
        no.generate(vbs, 0, coldOid, "", "");
	*/
	Request* req;
	for (;;) {
	     //
	     // Wait a given time (in secs) for an incoming request 
	     //
	     req = reqList->receive(120);
	     if (req) {
	        mib->process_request(req);	// process the request
	     }
	     else {
	         mib->cleanup();		// cleanup the MIB
	     }
	}
	return 0;
}
    
    
More information about the AGENTPP
mailing list