| .TH SNMP_AGENT_API 3 "01 Aug 2002" VVERSIONINFO "Net-SNMP" |
| .SH NAME |
| snmp_agent_api \- embedding an agent into a external application |
| .SH SYNOPSIS |
| .nf |
| #include <net-snmp/net-snmp-config.h> |
| #include <net-snmp/net-snmp-includes.h> |
| #include <net-snmp/agent/net-snmp-agent-includes.h> |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| int agentx_subagent = 1; /* Change this if you're a master agent. */ |
| |
| snmp_enable_stderrlog(); |
| |
| /* If we're an AgentX subagent... */ |
| if (agentx_subagent) { |
| /* ...make us an AgentX client. */ |
| netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, |
| NETSNMP_DS_AGENT_ROLE, 1); |
| } |
| |
| init_agent("yourappname"); |
| |
| /* Initialize your MIB code here. */ |
| init_my_mib_code(); |
| |
| /* `yourappname' will be used to read yourappname.conf files. */ |
| init_snmp("yourappname"); |
| |
| /* If we're going to be a SNMP master agent... */ |
| if (!agentx_subagent) |
| init_master_agent(); /* Listen on default port (161). */ |
| |
| /* Your main loop here... */ |
| while (whatever) { |
| /* if you use select(), see snmp_api(3) */ |
| /* --- OR --- */ |
| agent_check_and_process(0); /* 0 == don't block */ |
| } |
| |
| /* At shutdown time: */ |
| snmp_shutdown("yourappname"); |
| } |
| |
| Then: |
| $(CC) ... `net-snmp-config --agent-libs` |
| |
| .fi |
| .SH DESCRIPTION |
| .PP |
| Our goal is to create a easy to use interface to the Net-SNMP package |
| such that you can take code that you have written that has been |
| designed to be a Net-SNMP MIB module and embed it into an external |
| application where you can either chose to be a SNMP master agent or an |
| AgentX sub-agent using the same MIB module code. Our suggestion is |
| that you use our (or another) SNMP agent as the AgentX master agent |
| and chose to become an AgentX subagent which then attaches to the |
| master. |
| .PP |
| The Net-SNMP package provides a pair of libraries that enables easy |
| embedding of an SNMP or AgentX agent into an external software |
| package. AgentX is an extensible protocol designed to allow multiple |
| SNMP sub-agents all run on one machine under a single SNMP master |
| agent. It is defined in RFC 2741. |
| .PP |
| You will need to perform a few tasks in order to accomplish |
| this. First off, you will need to initialize both the SNMP library and |
| the SNMP agent library. As indicated above, this is done slightly |
| differently depending on whether or not you are going to perform as a |
| master agent or an AgentX sub-agent. |
| .SH CONFIGURATION |
| .PP |
| If you intend to operate as an AgentX sub-agent, you will have to |
| configured the Net-SNMP package with agentx support (which is turned |
| on by default, so just don't turn it off) |
| .PP |
| Additionally, you will need to link against the net-snmp libraries |
| (use the output of "net-snmp-config --agent-libs" to get a library |
| list) and call subagent_pre_init() as indicated above. |
| .SH COMPILING |
| .PP |
| In order to make use of any of the above API, you will need to link |
| against at least the four libraries listed above. |
| .SH FUNCTIONS |
| .PP This is a brief description of the functions called above and |
| where to find out more information on them. It is certainly not a |
| complete list of what is available within all the net-snmp libraries. |
| .IP "snmp_enable_stderrlog()" |
| Logs error output from the SNMP agent to the standard error stream. |
| .IP "netsnmp_ds_set_boolean()" |
| Please see the |
| .IR default_store(3) |
| manual page for more information |
| about this API. |
| .IP "init_agent(char *name)" |
| Initializes the embedded agent. This should be called before the |
| .BR "init_snmp()" |
| call. |
| .I name |
| is used to dictate what .conf file to read when |
| .BR "init_snmp()" |
| is called later. |
| .IP "init_snmp(char *name)" |
| Initializes the SNMP library. Note that one of the things this will |
| do will be to read configuration files in an effort to configure your |
| application. It will attempt to read the configuration files named by |
| the |
| .I name |
| string that you passed in. It can be used to configure access |
| control, for instance. Please see the |
| .IR read_config(3) ", " snmp_config(5) ", and " snmpd.conf(5) |
| manual pages for further details on this subject. |
| .IP "init_master_agent(void)" |
| Initializes the master agent and causes it to listen for SNMP requests |
| on its default UDP port of 161. |
| .IP "agent_check_and_process(int block)" |
| This checks for packets arriving on the SNMP port and processes them |
| if some are found. If |
| .I block |
| is non-zero, the function call will block until a packet arrives or an |
| alarm must be run (see |
| .IR snmp_alarm(3) ). |
| The return value from this function is a positive integer if packets |
| were processed, zero if an alarm occurred and -1 if an error occured. |
| .IP "snmp_shutdown(char *name);" |
| This shuts down the agent, saving any needed persistent storage, etc. |
| .SH "SEE ALSO" |
| http://www.net-snmp.org/tutorial-5/toolkit/, select(2), snmp_api(3), |
| default_store(3), snmp_alarm(3), read_config(3), snmp_config(5), |
| snmpd.conf(5) |