blob: 5dce075ff017fd117ca264314a4122712d86f72e [file] [log] [blame]
.TH SNMP_AGENT_API 3 "02 Apr 2001" VVERSIONINFO "Net-SNMP"
.UC 5
.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>
main () {
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 a agentx client. */
ds_set_boolean(DS_APPLICATION_ID, 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). */
/* you're 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 ... -lucdagent -lucdmibs -lsnmp # other libraries may be needed here
.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 as follows:
.RS
./configure --with-mib-modules="agentx/subagent"
.RE
Additionally, you will need to link against the libucdmibs library 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 clinch
against at least two libraries: the libucdagent library and the
libsnmp library. Additionally, if you plan to make use of any of the
code in the agent's MIB modules (like the AgentX subagent support),
you will need to link against the libucdmibs library as well.
.SH FUNCTIONS
.IP "snmp_enable_stderrlog()"
Logs error output from the SNMP agent to the standard error stream.
.IP "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"
select(2), snmp_api(3), default_store(3), snmp_alarm(3), read_config(3),
snmp_config(5), snmpd.conf(5)