Antw: Problems registering AgentX (in C)

"Ulrich Windl" <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <[email protected]>
Hi!

I got absolute zero replies to my message, so I created an isolated test case in the mean-time. The test case looks like this:

static  volatile int    stop_requests = 0;      /* count stop requests */

/* main */
int     main(int argc, char *argv[])
{
        int             result  = 0;

        /*BEGIN SNMP*/
        /* prepare for AgentX subagent */
        if ( netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
                                    NETSNMP_DS_AGENT_ROLE, 1)
             != SNMPERR_SUCCESS )
        {
                result = 2;
        }
        SOCK_STARTUP;           /* initialize TCP/IP, if necessary */
        init_agent("testagent");        /* initialize the agent library */
        init_IOTWatchMIB();     /* initialize MIB module */
        while ( stop_requests == 0 ) {
                agent_check_and_process(1); /* 0 == don't block */
        }

        /* at shutdown time */
        snmp_shutdown("testagent");
        SOCK_CLEANUP;
        /*END SNMP*/
quit:   return(result);
}

When running the testagent with ltrace, I see the handlers are registered, and the test agent waits for data:

---
SNMP> ltrace ./testagent
__libc_start_main(0x400f40, 1, 0x7ffc0e2bb4e8, 0x4011b0, 0x4011a0 <unfinished ...>
netsnmp_ds_set_boolean(1, 1, 1, 0, 0x7fd165f0f320) = 0
init_agent(0x4012a4, 0x7fd1663d1f40, 0, 1, 0x7fd165f0f320) = 0
snmp_get_do_debugging(1, 1, 0, 1, 0x2965736c61667c) = 0
netsnmp_create_handler_registration(0x40134d, 0x401040, 0x602120, 13, 1) = 0x6071a0
netsnmp_register_scalar(0x6071a0, 0x602188, 0, 1, 1000) = 0
netsnmp_create_handler_registration(0x40135f, 0x400fd0, 0x6020a0, 13, 1) = 0x607d40
netsnmp_register_scalar(0x607d40, 0x602108, 0, 2, 1000) = 0
agent_check_and_process(1, 0x7fd166a33049, 0, 0, 0x608050
---

However If I query the OIDs registered, no data are returned ("There is no such variable name in this MIB.")

The init Module looks like this:

/** Initializes the IOTWatchMIB module */
void
init_IOTWatchMIB(void)
{
    static oid      giveItABetterName_oid[] =
        { 1, 3, 6, 1, 4, 1, 8072, 9999, 9999, 1000, 1, 1, 1 };
    static oid      giveThisANameToo_oid[] =
        { 1, 3, 6, 1, 4, 1, 8072, 9999, 9999, 1000, 1, 1, 2 };

    DEBUGMSGTL(("IOTWatchMIB", "Initializing\n"));

    netsnmp_register_scalar(netsnmp_create_handler_registration
                            ("giveItABetterName", handle_giveItABetterName,
                             giveItABetterName_oid,
                             OID_LENGTH(giveItABetterName_oid),
                             HANDLER_CAN_RONLY));
    netsnmp_register_scalar(netsnmp_create_handler_registration
                            ("giveThisANameToo", handle_giveThisANameToo,
                             giveThisANameToo_oid,
                             OID_LENGTH(giveThisANameToo_oid),
                             HANDLER_CAN_RONLY));
}

(The handlers both should cause an abort if called (to help debugging)):

    switch (reqinfo->mode) {

    case MODE_GET:
        snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
                                 (u_char *) 0 /* XXX: a pointer to the scalar's data */
                                 , 1 /* XXX: the length of the data in bytes */ );
        break;

I have absolutely no idea how to debug this. While debugging I'm running snmpd in user mode as suggested in the tutorial:
/usr/sbin/snmpd -f -Lo -C --rwcommunity=public --master=agentx \
--agentXSocket=tcp:localhost:1705 udp:1161 -Dagentx

I fail to see where my testagent connects to the SNMP socket, nor do I see that my config file is opened. The select() is on a pipe, but I cannot see any other process in strace:
---
2819  munmap(0x7f84066bd000, 4096)      = 0
2819  gettimeofday({1439373523, 620867}, NULL) = 0
2819  pipe([3, 4])                      = 0
2819  gettimeofday({1439373523, 621388}, NULL) = 0
2819  pipe([5, 6])                      = 0
2819  select(6, [3 5], NULL, NULL, NULL) = ? ERESTARTNOHAND (To be restarted)
2819  --- SIGINT (Interrupt) @ 0 (0) ---
2819  +++ killed by SIGINT +++
---

Any ideas?

Regards,
Ulrich

>>> Ulrich Windl schrieb am 05.08.2015 um 10:42 in Nachricht <55C1CC7D.CAD : 161 :
60728>:
> Hello!
> 
> I had reported problems with registering an AgentX subagent in Perl (no 
> error, but doesn't work). Finally I found the bug that prevented it from 
> working.
> 
> Now I have a C program that uses multiple threads to retrieve and monitor 
> some values. I tried to make this program an AgentX subagent by adding the 
> code from the C coding example. Unfortunately the same things as in Perl 
> happen: The agent does not connect, and there is no error. When trying to 
> access any of the registered OIDs, an error is returned. None of the handlers 
> is ever called.
> 
> What I'd like to have eventually is that one thread takes care of all the 
> SNMP handling.
> 
> From the example I guess that the API is too high-level (init_agent()): It's 
> hard to see which steps are actually executed, and what the results of these 
> steps are.
> 
> What could the problem be, and how could I debug it?
> 
> The essential code fragemnt looks like this:
>                 /*BEGIN SNMP*/
>                 /* prepare for AgentX subagent */
>                 if ( netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
>                                             NETSNMP_DS_AGENT_ROLE, 1)
>                      != SNMPERR_SUCCESS )
>                 {
>                         /* report problem */
>                 }
>                 SOCK_STARTUP;           /* initialize TCP/IP, if necessary 
> */
>                 init_agent("iotwatch"); /* initialize the agent library */
>                 init_IOTWatchMIB();     /* initialize MIB module */
>                 while ( stop_requests == 0 ) {
>                         agent_check_and_process(1); /* 0 == don't block */
>                 }
> 
>                 /* at shutdown time */
>                 snmp_shutdown("iotwatch");
>                 SOCK_CLEANUP;
>                 /*END SNMP*/
> 
> Regards,
> Ulrich
> 
> 




------------------------------------------------------------------------------
_______________________________________________
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.