Hi Milan,
>From a quick look at your code it looks like you've missed a crucial
line to register the handler:
netsnmp_register_handler( reg );
Which you need to do after your line:
reg = netsnmp_handler_registration_create(...)
Also, one important point (I forgot to mention previously), if there are
any other handlers which register for specific OIDs (e.g.
.1.3.6.1.2.1.1.4.0) - these will be called instead of your generic
handler.
Hope that helps.
Graeme
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: 09 August 2007 15:43
> To: Graeme Wilson
> Cc: [email protected]
> Subject: RE: Newbie question: writing a simple agent
>
> Hello Graeme,
>
> sorry for bothering you again.
>
> I have tried to merge your code with MFD code. I am obviously
> doing something wrong. When I run snmpwalk on the agent I can see that
> agent_check_and_process(1) in the main loop finishes but the
> handler does not get called.
>
> I get error message from the agent:
>
> Connection from UDP: [127.0.0.1]:-32767
>
> I assume this means this request was not handled by the agent.
>
> I do not know if netsnmp_register_handler(reg) is successful,
> it returns 0. I was googling but I did not find meaning of this value.
>
> Did I miss something in my main()? I am attaching short code.
>
> Thank you and please do net get angry with me for so many mails.
>
> Milan
>
> ----
>
>
> #include "agent.h"
> #include "agent_error.h"
>
> static int keep_running;
>
> void stop_server(UNUSED int a) {
> keep_running = 0;
> }
>
> /* Ippc function which will be called for all OIDs below the
> root one registered above */ int IppcOidHandler(UNUSED
> netsnmp_mib_handler *handler,
> UNUSED netsnmp_handler_registration *reginfo,
> UNUSED netsnmp_agent_request_info *reqinfo,
> netsnmp_request_info *requests) {
> int ret = SNMP_ERR_NOERROR;
>
> printf("Received SNMP request");
> for (unsigned i = 0; i < requests->range_end_len; i++) {
> printf("%d.", (int)requests->range_end[i]);
> }
> printf("\n");
>
> switch(reqinfo->mode)
> {
> case MODE_GET:
> /* Call some other code to process the 'requests' argument */
> //ret = myData->getData( requests );
> break;
> case MODE_GETNEXT:
> /* Call some other code to process the 'requests' argument */
> //ret = myData->getNextData( requests );
> break;
> default:
> /* we should never get here in my code */
> //iRet = SNMP_ERR_GENERR;
> break;
> }
> return 1; //ret;
> }
>
> int main (UNUSED int argc, UNUSED char **argv) {
> netsnmp_mib_handler *handler;
> netsnmp_handler_registration *reg;
>
> static oid root_oid[] = { 1, 3, 6 };
>
> snmp_enable_stderrlog();
>
> SOCK_STARTUP;
>
> init_agent("ippc agent");
>
> init_snmp("ippc agent");
>
> init_master_agent(); /* open the port to listen on (defaults to
> udp:161) */
>
> keep_running = 1;
> signal(SIGTERM, stop_server);
> signal(SIGINT, stop_server);
>
> handler = netsnmp_create_handler("IppcOIDHandler",
> &IppcOidHandler );
>
> if (handler) {
> reg = netsnmp_handler_registration_create( "IppcHandler",
> handler,
> root_oid,
> OID_LENGTH(root_oid),
> 0);
>
> printf("returned=%d\n", netsnmp_register_handler(reg));
> }
> else {
> exit(1);
> }
>
>
> while(keep_running) {
> agent_check_and_process(1); /* 0 == don't block */
> printf("mainloop\n");
> }
>
> /* at shutdown time */
> netsnmp_unregister_handler(reg);
> snmp_shutdown("ippc agent");
> SOCK_CLEANUP;
>
> return 0;
> }
>
>
>
>
> ----
>
>
> On Wed, August 8, 2007 4:10 pm, Graeme Wilson wrote:
> > Hi Milan,
> >
> >
> > No worries about the questions.
> >
> >
> > For my subagent (binary/executable) I doctored an existing
> 'main' that
> > I had from when I'd created a subagent with mib2c - its
> just like your
> > example below: - init_agent
> > - etc etc
> > - register your handler here
> > - loop (agent_check_and_process)
> > - etc etc
> >
> >
> > Cheers
> > Graeme
> >
> >
> >
> >> -----Original Message-----
> >> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> >> Sent: 08 August 2007 14:47
> >> To: Graeme Wilson
> >> Cc: [email protected]
> >> Subject: RE: Newbie question: writing a simple agent
> >>
> >>
> >> Hello Graeme,
> >>
> >>
> >> I went through your code and it seems it is exactly what I need.
> >>
> >>
> >> I am just confused about one thing: how does it plug into snmpd?
> >>
> >>
> >> I understand that I need to do in agent main() registration (and
> >> un-registration at agent finish) but what do I actually generate?
> >>
> >> Should I create a binary like in MFD example and loop using
> >> agent_check_and_process() or snmp_select_info() or should I create
> >> some kind of .so that does mere regsitration and finishes?
> >>
> >> In the former case the scenario is
> >> - init_agent
> >> - init_snmp
> >> - init_master_agent();
> >> - register handler
> >> - loop
> >> - un-register handler
> >> - snmp_shutdown
> >>
> >>
> >> or am I missing something?
> >>
> >> Sorry for asking you newbie trivial questions :-)
> >>
> >>
> >> Thanks.
> >>
> >>
> >> Milan
> >>
> >>
> >>
> >>
> >>
> >>
> >> On Wed, August 8, 2007 11:11 am, Graeme Wilson wrote:
> >>
> >>>
> >>
> >>> Hi,
> >>>
> >>>
> >>>
> >>> I have done something similar recently (I provide some
> sample code
> >>> below - but note that ultimately everything is still done within
> >>>
> >> the agent).
> >>> My Agent simply registers the root OID of the MIB it will
> >>>
> >> handle and
> >>> some other function knows all about the data and the
> specific OIDs
> >>> that the Agent handles. I just registered a generic
> handler for the
> >>> root oid and
> >> then when it
> >>> is called, the handler make appropriate calls to handle the
> >> request.
> >>> I guess in your case you could then request the data (if
> >>>
> >> any) from the
> >>> process/thread that holds the Data and OIDS.
> >>>
> >>> Hope that helps.
> >>> Graeme
> >>> -------------
> >>> /* In your main/initialise function */
> >>> netsnmp_mib_handler* handler = netsnmp_create_handler(
> >>> "GenericOIDHandler", &genericOidHandler );
> >>>
> >>>
> >>>
> >>> netsnmp_handler_registration* reg =
> >>> netsnmp_handler_registration_create( "GenericHandler", handler,
> >>> root_oid, OID_LENGTH(root_oid), 0 );
> >>>
> >>> netsnmp_register_handler( reg );
> >>>
> >>>
> >>>
> >>> /* Generic function which will be called for all OIDs below
> >>>
> >> the root
> >>> one registered above */ int genericOidHandler(
> netsnmp_mib_handler
> >>> *handler, netsnmp_handler_registration *reginfo,
> >>> netsnmp_agent_request_info *reqinfo, netsnmp_request_info
> >> *requests )
> >>
> >>> { int ret = SNMP_ERR_NOERROR;
> >>>
> >>>
> >>> switch(reqinfo->mode) { case MODE_GET: /* Call some other code to
> >>> process the 'requests' argument */ ret = myData->getData(
> requests
> >>> ); break; case MODE_GETNEXT: /* Call some other code to
> process the
> >>> 'requests'
> >>> argument */ ret = myData->getNextData( requests ); break;
> default:
> >>> /* we should never get here in my code */ iRet = SNMP_ERR_GENERR;
> >>> break; } return ret; }
> >>>
> >>>
> >>>
> >>>
> >>>> -----Original Message-----
> >>>> From: [EMAIL PROTECTED]
> >>>> [mailto:[EMAIL PROTECTED] On
> Behalf Of
> >>>> [EMAIL PROTECTED]
> >>>> Sent: 08 August 2007 06:51
> >>>> To: Mike Ayers
> >>>> Cc: [email protected]
> >>>> Subject: RE: Newbie question: writing a simple agent
> >>>>
> >>>>
> >>>>
> >>>> Hello Mike,
> >>>>
> >>>>
> >>>>
> >>>> thanks for replying to my question.
> >>>>
> >>>> I understand that a standard approach is to register the
> >>>>
> >> agent for a
> >>>> range of OISs and to let the agent to be OID aware while
> the other
> >>>> process should take care of the underlaying data.
> >>>>
> >>>> However, I was asked to write an agent that would NOT be
> >>>>
> >> OID-aware.
> >>
> >>>> All it would know it is responsible for a range of OIDs without
> >>>> knowing any details. It would forward complete OIDs to the other
> >>>> process that would take care about OID
> >> disassembly/translation, data
> >>>> manipulation etc.
> >>>>
> >>>> I am wondering if this is possible within the Net SNMP
> API, at all.
> >>>>
> >>>>
> >>>>
> >>>> If so, where should I start?
> >>>>
> >>>>
> >>>>
> >>>> Thanks.
> >>>>
> >>>>
> >>>>
> >>>> Milan
> >>>>
> >>>>
> >>>>
> >>>> On Tue, August 7, 2007 11:44 pm, Mike Ayers wrote:
> >>>>
> >>>>
> >>>>>
> >>>>
> >>>>>> From: [EMAIL PROTECTED]
> >>>>>> [mailto:[EMAIL PROTECTED] On
> >>>>>>
> >> Behalf Of
> >>
> >>>>>> [EMAIL PROTECTED]
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>>
> >>>>>> The agent itself will not be aware of individual OIDs
> and their
> >>>>>> meaning. This will be done by the other process that also
> >>>> holds the
> >>>>>> actual data.
> >>>>>
> >>>>> This is a bit of a design problem as stated. The (sub)agent is
> >>>>> responsible for managing its OID range, and therefore it is not
> >>>>> possible to have a subagent completely unaware of the OIDs.
> >>>> This does
> >>>>
> >>>>
> >>>>> not, however, mean that the subagent needs to be aware of
> >> the data
> >>>>> underlying the MIB.
> >>>>>
> >>>>> A common paradigm is to have the subagent register for
> >>>>>
> >> the range of
> >>>>> values (table, MIB, whatever) that it will manage, and
> >> have the OP
> >>>>> (other
> >>>>> process) manage the data within the range. The agent does OID
> >>>>> assembly/disassembly (i.e. breaking OIDs into range part
> >>>> and specific
> >>>>> part), possibly reformat the specific part to make it more
> >>>>> understandable to the OP (thus only the subagent need be
> >>>> MIB aware).
> >>>>
> >>>>
> >>>>> The OP returns the values for the requested data, then
> >>>>>
> >> the subagent
> >>>>> formats and assembles the response.
> >>>>>
> >>>>>
> >>>>> HTH,
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> Mike
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>
> ---------------------------------------------------------------------
> >>
> >>>> -
> >>>>
> >>>>
> >>>>> --- This SF.net email is sponsored by: Splunk Inc.
> >>>>> Still grepping through log files to find problems? Stop.
> >>>>> Now Search log events and configuration files using AJAX
> >>>>>
> >>>>>
> >>>> and a browser.
> >>>>> Download your FREE copy of Splunk now >>
> http://get.splunk.com/
> >>>>> _______________________________________________
> >>>>> Net-snmp-users mailing list
> >>>>> [email protected]
> >>>>> Please see the following page to unsubscribe or change
> >>>>>
> >>>>>
> >>>> other options:
> >>>>> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>>>
> >>>> --------------------------------------------------------------
> >>>> -----------
> >>>> This SF.net email is sponsored by: Splunk Inc.
> >>>> Still grepping through log files to find problems? Stop.
> >>>> Now Search log events and configuration files using AJAX and a
> >>>> browser. Download your FREE copy of Splunk now >>
> >>>> http://get.splunk.com/
> >>>> _______________________________________________
> >>>> Net-snmp-users mailing list
> >>>> [email protected]
> >>>> Please see the following page to unsubscribe or change
> >>>>
> >> other options:
> >>>> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
> >>>>
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>>
> >>
> ---------------------------------------------------------------------
> >> -
> >>
> >>> --- This SF.net email is sponsored by: Splunk Inc.
> >>> Still grepping through log files to find problems? Stop.
> >>> Now Search log events and configuration files using AJAX
> >>>
> >> and a browser.
> >>> Download your FREE copy of Splunk now >> http://get.splunk.com/
> >>> _______________________________________________
> >>> Net-snmp-users mailing list
> >>> [email protected]
> >>> Please see the following page to unsubscribe or change
> >>>
> >> other options:
> >>> https://lists.sourceforge.net/lists/listinfo/net-snmp-users
> >>>
> >>>
> >>>
> >>>
> >>
> >>
> >>
> >>
> >
> >
>
>
>
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users