I've searched the archives for a solution to this, but haven't found it. So I have an SNMP sub-agnet that talkes to master agentx over the agentx socket. Also, cannot block on this process waiting for snmp requests. So I use select to timeout in order to kick a watchdog.
When the snmpd restart the socket fd which I watch for select is invalid. I assume I need to restart the subagent. When I do I get a bazillion handler re-registration errors. Of course the subagent handler code was created from a mib2c process, and that script doesn't generate code to de-register the handlers. So I'm also looking into how to handle that. Finally, when the subagent is killed off and restarted, snmpwalk of the MIB fails, like the subagent isn't running. Here's the code I have right now. The reinit call basically executes the shutdown code, and re-runs the startup code. Code included below. TIA, Eldon. void SnmpSubagent::run() { fd_set fds; struct timeval timeout, tv; int rc, numfds=0, block=1, numsocks; // Configure snmp logging int use_syslog = false; if (use_syslog) { snmp_enable_calllog(); // syslog } else { snmp_enable_stderrlog(); // stdout } snmp_log(LOG_DEBUG, "Starting the SNMP Subagent...\n"); // Become Subagent if (netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1) != SNMPERR_SUCCESS) { mpLog->logf(Log::ERROR,"SnmpSubagent::run() - Error setting AppID::Agent Role=1"); } // Now register with the master Agent X process // Set AgentX socket interface if (netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCKET, NETSNMP_AGENTX_SOCKET) != SNMPERR_SUCCESS) { mpLog->logf(Log::ERROR,"SnmpSubagent::run() - Error setting AppID::AgentX Socket"); } // Initialize the agent if (init_agent("mp") != SNMPERR_SUCCESS) { mpLog->logf(Log::ERROR,"SnmpSubagent::run() - Error initializing the agent"); } // Register callback functions ... init_ssiSbssMIB(); init_snmp("mp"); snmp_log(LOG_INFO, "SBSS Radio Snmp Subagent started.\n"); // Sent the App Startup notification send_sbssNotifAppStartup_trap(); // main loop here... while(1) { tv.tv_sec = period; numsocks = snmp_select_info(&numfds, &fds, &timeout, &block); if (numsocks) { rc = select(numfds+1, &fds, NULL, NULL, &tv); if (rc == -1) { mpLog->logf(Log::ERROR, "SnmpSubagent::run() Select error"); numfds = 0; FD_ZERO(&fds); reinit(); } else if (rc == 0) { WDT::Instance()->Kick(tid, pthread_self()); clock_gettime(CLOCK_MONOTONIC, (timespec *)&timeout); timeout.tv_usec = 0; timeout.tv_sec += period; } else { WDT::Instance()->Kick(tid, pthread_self()); agent_check_and_process(0); } } else { mpLog->logf(Log::ERROR, "SnmpSubagent::run() No open SNMP sockets. Resetting SNMP connection."); reinit(); } } // at shutdown time (never happens....) send_sbssNotifAppShutdown_trap(); snmp_log(LOG_ERR, "SBSS Radio Snmp Subagent shutting down.\n"); snmp_shutdown("mp"); //TODO-khs: tie this into the project's properties somehow...also maybe change it to "sbssmp"... } oid SnmpSubagent::reinit() { snmp_shutdown("mp"); // Re-configure snmp logging int use_syslog = false; if (use_syslog) { snmp_enable_calllog(); // syslog } else { snmp_enable_stderrlog(); // stdout } snmp_log(LOG_DEBUG, "Starting the SNMP Subagent...\n"); // Become Subagent if (netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1) != SNMPERR_SUCCESS) { mpLog->logf(Log::ERROR,"SnmpSubagent::run() - Error setting AppID::Agent Role=1"); } // Now register with the master Agent X process // Set AgentX socket interface if (netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_X_SOCKET, NETSNMP_AGENTX_SOCKET) != SNMPERR_SUCCESS) { mpLog->logf(Log::ERROR,"SnmpSubagent::run() - Error setting AppID::AgentX Socket"); } // Initialize the agent if (init_agent("mp") != SNMPERR_SUCCESS) { mpLog->logf(Log::ERROR,"SnmpSubagent::run() - Error initializing the agent"); } // Register callback functions ... init_ssiSbssMIB(); init_snmp("mp"); snmp_log(LOG_INFO, "SBSS Radio Snmp Subagent started.\n"); // Sent the App Startup notification send_sbssNotifAppStartup_trap(); } ------------------------------------------------------------------------------ Free Software Download: Index, Search & Analyze Logs and other IT data in Real-Time with Splunk. Collect, index and harness all the fast moving IT data generated by your applications, servers and devices whether physical, virtual or in the cloud. Deliver compliance at lower cost and gain new business insights. http://p.sf.net/sfu/splunk-dev2dev _______________________________________________ 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