Hello Graeme, thanks for your prompt reply.
netsnmp_register_handler( reg ) is "hidden" in printf("returned=%d\n", netsnmp_register_handler(reg)); I tried it before without printf and it was doing the same thing. I have no other handlers and no other agents started. I considered switching snmp logging with LOG_DEBUG level/priority but I did not find any function how to set the level. Is there anything else I could try? Thanks. Milan On Thu, August 9, 2007 4:53 pm, Graeme Wilson wrote: > 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: net-snmp-users@lists.sourceforge.net >> 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: net-snmp-users@lists.sourceforge.net >>>> 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: net-snmp-users@lists.sourceforge.net >>>>>> 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 >>>>>>> Net-snmp-users@lists.sourceforge.net >>>>>>> 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 >>>>>> Net-snmp-users@lists.sourceforge.net >>>>>> 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 >>>>> Net-snmp-users@lists.sourceforge.net >>>>> 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 Net-snmp-users@lists.sourceforge.net Please see the following page to unsubscribe or change other options: https://lists.sourceforge.net/lists/listinfo/net-snmp-users