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

Reply via email to