| #!/bin/sh |
| |
| . ../support/simple_eval_tools.sh |
| |
| HEADER 'AgentX subagent in Perl (using NetSNMP::agent)' |
| |
| SKIPIF NETSNMP_DISABLE_SNMPV2C |
| SKIPIFNOT USING_AGENTX_MASTER_MODULE |
| SKIPIFNOT USING_AGENTX_SUBAGENT_MODULE |
| SKIPIFNOT HAVE_SIGHUP |
| # make sure the toolkit has been configured --with-perl-modules |
| [ -d ${SNMP_UPDIR}/perl/blib/arch/auto/NetSNMP/agent ] || SKIP Not --with-perl-modules |
| |
| # |
| # Begin test |
| # |
| |
| snmp_version=v2c |
| TESTCOMMUNITY=testcommunity |
| . ./Sv2cconfig |
| |
| TESTOID=.1.3.6.1.4.1.8872.9999.9999.1.0 |
| TESTOID2=.1.3.6.1.4.1.8872.9999.9999.2.0 |
| AGENTX_SOCKET=${SNMP_TMPDIR}/agentx_socket |
| PERL_SUBAGENT=${SNMP_TMPDIR}/hello.pl |
| PERL_SUBAGENT_CONF=${SNMP_TMPDIR}/hello.conf |
| |
| cat >$PERL_SUBAGENT <<END |
| #!${SNMP_PERLPROG} |
| # minimal AgentX subagent in Perl |
| |
| use blib qw(${SNMP_UPDIR}/perl); |
| use NetSNMP::OID qw(:all); |
| use NetSNMP::agent qw(:all); |
| use NetSNMP::ASN qw(:all); |
| use NetSNMP::agent::default_store; |
| use NetSNMP::default_store qw(:all); |
| use SNMP; |
| |
| ## double-fork daemon |
| my \$pid; |
| unless (\$pid = fork) { |
| unless (fork) { |
| ## start main code |
| my \$regat = '.1.3.6.1.4.1.8872.9999.9999'; # netSnmpPlayPen |
| my \$myoid = \$regat . ".1.0"; # the "hello world" OID |
| my \$myoid2 = \$regat . ".2.0"; # the "hello again world" OID |
| |
| my \$pidfile = shift; # take PID file as first argument |
| open(PIDFILE, ">\$pidfile") or die "Couldn't open \$pidfile"; |
| print PIDFILE \$\$; |
| close(PIDFILE); |
| |
| sub my_snmp_handler { |
| my (\$handler, \$registration_info, \$request_info, \$requests) = @_; |
| for(my \$request = \$requests; \$request; \$request = \$request->next()) { |
| if (\$request_info->getMode() == MODE_GET) { |
| if (\$request->getOID() == new NetSNMP::OID(\$myoid)) { |
| \$request->setValue(ASN_OCTET_STR, "hello world"); |
| last; |
| } elsif (\$request->getOID() == new NetSNMP::OID(\$myoid2)) { |
| \$request->setValue(ASN_OCTET_STR, "hello again world"); |
| last; |
| } |
| } |
| } |
| } |
| sub shut_it_down { \$running = 0; } |
| |
| netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, |
| NETSNMP_DS_AGENT_NO_ROOT_ACCESS, 1); |
| my \$agent = new NetSNMP::agent('Name' => 'hello', 'AgentX' => 1); |
| my \$regoid = new NetSNMP::OID(\$regat); |
| \$agent->register("hello", \$regoid, \&my_snmp_handler); |
| |
| \$SIG{'INT'} = \&shut_it_down; |
| \$SIG{'QUIT'} = \&shut_it_down; |
| \$running = 1; |
| while(\$running) { |
| \$agent->agent_check_and_process(1); |
| } |
| \$agent->shutdown(); |
| ## end main code |
| exit 0; |
| } |
| exit 0; |
| } |
| waitpid(\$pid, 0); |
| END |
| |
| echo "agentxsocket $AGENTX_SOCKET" > $PERL_SUBAGENT_CONF |
| |
| CONFIGAGENT master agentx |
| CONFIGAGENT agentxsocket $AGENTX_SOCKET |
| |
| STARTAGENT |
| |
| # start perl subagent |
| /usr/bin/env SNMPCONFPATH="${SNMP_TMPDIR}${SNMP_ENV_SEPARATOR}${SNMP_TMP_PERSISTENTDIR}" $SNMP_PERLPROG $PERL_SUBAGENT $SNMP_AGENTX_PID_FILE >$SNMP_AGENTX_LOG_FILE 2>&1 |
| DELAY |
| |
| ## 1) SNMP GET against mib object implemented by the perl subagent |
| CAPTURE "snmpget -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT $TESTOID" |
| CHECK "hello world" |
| |
| ## 2) persistency: reconfigure master agent (HUP), re-test |
| HUPAGENT |
| CAPTURE "snmpget -$snmp_version -c $TESTCOMMUNITY $SNMP_TRANSPORT_SPEC:$SNMP_TEST_DEST$SNMP_SNMPD_PORT $TESTOID2" |
| CHECK "hello again world" |
| |
| ## stop |
| STOPAGENT |
| STOPPROG $SNMP_AGENTX_PID_FILE |
| |
| FINISHED |