Hi there,

iam using the snmp4j API to create an SNMP-agent.

When i do a

snmpwalk -0s -c public -v 2c localhost:2001 1.3.6.1.4.1.6695.1

there is this error message at the end of the result:

"No more variables left in this MIB View (It is past the end of the MIB
tree)"

A snmpnext at the very last OID in this table, jumps to a column that
doesn't exist.

Many thanks in advance,

Greetings Max Schmidt.

Here is my agent-class:
###########################
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.rrd4j.ConsolFun;
import org.rrd4j.core.FetchData;
import org.rrd4j.core.FetchRequest;
import org.rrd4j.core.RrdDb;
import org.rrd4j.core.RrdDbPoolNew;
import org.rrd4j.core.Util;
import org.snmp4j.TransportMapping;
import org.snmp4j.agent.BaseAgent;
import org.snmp4j.agent.CommandProcessor;
import org.snmp4j.agent.DuplicateRegistrationException;
import org.snmp4j.agent.MOGroup;
import org.snmp4j.agent.ManagedObject;
import org.snmp4j.agent.mo.MOAccessImpl;
import org.snmp4j.agent.mo.MOMutableTableRow;
import org.snmp4j.agent.mo.MOTable;
import org.snmp4j.agent.mo.MOTableRow;
import org.snmp4j.agent.mo.snmp.RowStatus;
import org.snmp4j.agent.mo.snmp.SnmpCommunityMIB;
import org.snmp4j.agent.mo.snmp.SnmpNotificationMIB;
import org.snmp4j.agent.mo.snmp.SnmpTargetMIB;
import org.snmp4j.agent.mo.snmp.StorageType;
import org.snmp4j.agent.mo.snmp.VacmMIB;
import org.snmp4j.agent.security.MutableVACM;
import org.snmp4j.mp.MPv3;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModel;
import org.snmp4j.security.USM;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.SMIConstants;
import org.snmp4j.smi.Variable;
import org.snmp4j.transport.TransportMappings;

/**
 * This Agent contains mimimal functionality for running a version 2c snmp
 * agent.
 */
public class SNMPAgent extends BaseAgent {
        
        private Logger logger = Logger.getLogger(TTMReader.class.getName());
        private String address;
        private RrdDbPoolNew rrdPool = (RrdDbPoolNew) 
RrdDbPoolNew.getInstance();
        private ArrayList<String> files = null;
        private static final OID sysDescr = new OID(".1.3.6.1.2.1.1.1.0");
        private static final OID root = new OID(".1.3.6.1.4.1.6695.1");
        private ConfigCheck config = ConfigCheck.getInstance();
        private MOTable table = null;
        private Timer timer = null;
        
        public SNMPAgent(String address) throws IOException {
                // These files does not exist and are not used but has to be 
specified
                // Read snmp4j docs for more info
                super(new File("conf.agent"), new File("bootCounter.agent"), new
CommandProcessor(new OctetString(MPv3.createLocalEngineID())));
                this.address = address;
                // Build Table
                MOTableBuilder builder = new MOTableBuilder(root);
        
builder.addColumnType(SMIConstants.SYNTAX_OCTET_STRING,MOAccessImpl.ACCESS_READ_ONLY);
        
builder.addColumnType(SMIConstants.SYNTAX_OCTET_STRING,MOAccessImpl.ACCESS_READ_ONLY);
        
builder.addColumnType(SMIConstants.SYNTAX_INTEGER,MOAccessImpl.ACCESS_READ_ONLY);
                // Build array with rrd's that should be monitored
                Destination[] destinations = config.getDestinations();
                Source[] sources = TTMReader.getSources();
                files = new ArrayList<String>();
                for(int i = 0 ; i < sources.length ; ++i) {
                        for(int j = 0 ; j < destinations.length ; ++j) {
                    if (destinations[j].getTtm().matches(sources[i].getAlias()
+ "(b|d)")) {
                        continue;
                    }
                    if (config.mergeSource(sources[i].getAlias(),
destinations[j]) == null) {
                        continue;
                    }
                                files.add(config.getRRDdirectory() + 
sources[i].getAlias() + "_" +
destinations[j].getTtm() + "_delay.rrd");
                                builder.addRowValue(new 
OctetString(sources[i].getAlias() + "_" +
destinations[j].getTtm()));
                                builder.addRowValue(new
OctetString(config.mergeSource(sources[i].getAlias(),
destinations[j]).getSw() + "_" + destinations[j].getSw()));
                                builder.addRowValue(new Integer32(-1)); // -1 = 
unknown = Double.NaN
                        }
                }
                table = builder.build();
                // initialize timers
                timer = new Timer("snmpAgent-timer", true);
                timer.schedule( new SNMPUpdateTask(this), 300 * 1000, 300 * 
1000);
        }
        
        public void shutdown() {
                if(timer != null) {
                        timer.cancel();
                }
                this.stop();
        }

        /**
         * We let clients of this agent register the MO they
         * need so this method does nothing
         */
        @Override
        protected void registerManagedObjects() {
        
registerManagedObject(MOScalarFactory.createReadOnly(sysDescr,"TTMreader"));
                registerManagedObject(table);
        }

        /**
         * An Error during fetching values from the rrds is indicated with
<code>-2</code> and Double.NaN is like <code>-1</code>.
         * Values are calculated from floating point milliseconds to integer
microseconds.
         */
        @SuppressWarnings("unchecked")
        public void updateTable() {
                long now_N = Util.normalize(System.currentTimeMillis() / 1000, 
30);
                Iterator<MOTableRow> iter = table.getModel().iterator();
                for(int i = 0 ; i < files.size() ; ++i) {
                        MOMutableTableRow r = (MOMutableTableRow) iter.next();
                        try {
                                RrdDb db = rrdPool.requestRrdDb(files.get(i));
                                FetchRequest fetchRequest = 
db.createFetchRequest(ConsolFun.AVERAGE,
now_N-30, now_N-30, 300); // 5min average
                        FetchData fetchData = fetchRequest.fetchData();
                        double tmp[] = fetchData.getValues(0); // Get Delay 
Values;
1=jitter; 2=NTPerr
                        int value = ( Double.isNaN(tmp[0]) ? -1 : (int) (tmp[0] 
*
1000)); // if(Double.NaN){ -1} else {ms -> ns}
                            r.setValue(2, new Integer32(value));
                        logger.log(Level.FINE, "[{0}]read: {1}", new
Object[]{r.getValue(1), tmp[0]} );
                                rrdPool.release(db);
                        } catch (IOException e) {
                                logger.log(Level.WARNING, "[{0}]IOException 
during fetch values:
{1}", new Object[]{r.getValue(1), e.getMessage()});
                                r.setValue(2, new Integer32(-2));
                        }
                }
        }
        
        /* ######################## Wrapper and start_up functions
######################## */
        /**
         * Start method invokes some initialization methods needed to
         * start the agent
         * @throws IOException
         */
        public void start() throws IOException {

                init();
                // This method reads some old config from a file and causes
                // unexpected behavior.
                // loadConfig(ImportModes.REPLACE_CREATE);
                addShutdownHook();
                getServer().addContext(new OctetString("public"));
                finishInit();
                run();
                sendColdStartNotification();
        }
        
        /**
         * Overrides the default MIB.
         */
        @Override
        protected void registerSnmpMIBs() {
                registerManagedObjects();
        }
        
        /**
         * Clients can register the MO they need
         */
        public void registerManagedObject(ManagedObject mo) {
                try {
                        server.register(mo, null);
                } catch (DuplicateRegistrationException ex) {
                        throw new RuntimeException(ex);
                }
        }
        
        public void unregisterManagedObject(MOGroup moGroup) {
                moGroup.unregisterMOs(server, getContext(moGroup));
        }
        
        /**
         * Minimal View based Access Control
         *
         * http://www.faqs.org/rfcs/rfc2575.html
         */
        @Override
        protected void addViews(VacmMIB vacm) {
                vacm.addGroup(SecurityModel.SECURITY_MODEL_SNMPv2c, new
OctetString("cpublic"), new
OctetString("v1v2group"),StorageType.nonVolatile);

                vacm.addAccess(new OctetString("v1v2group"), new
OctetString("public"), SecurityModel.SECURITY_MODEL_ANY,
SecurityLevel.NOAUTH_NOPRIV,
                                MutableVACM.VACM_MATCH_EXACT, new 
OctetString("fullReadView"), new
OctetString("fullWriteView"), new OctetString("fullNotifyView"),
StorageType.nonVolatile);

                vacm.addViewTreeFamily(new OctetString("fullReadView"), new
OID("1.3"),     new OctetString(), VacmMIB.vacmViewIncluded,
StorageType.nonVolatile);
        }

        /**
         *
         */
        @Override
        protected void initTransportMappings() throws IOException {
                transportMappings = new TransportMapping[1];
                Address addr = GenericAddress.parse(address);
                TransportMapping tm =
TransportMappings.getInstance().createTransportMapping(addr);
                transportMappings[0] = tm;
        }
        
        /**
         * The table of community strings configured in the SNMP
         * engine's Local Configuration Datastore (LCD).
         *
         * We only configure one, "public".
         */
        protected void addCommunities(SnmpCommunityMIB communityMIB) {
                Variable[] com2sec = new Variable[] {
                                new OctetString("public"), // community name
                                new OctetString("cpublic"), // security name
                                getAgent().getContextEngineID(), // local 
engine ID
                                new OctetString("public"), // default context 
name
                                new OctetString(), // transport tag
                                new Integer32(StorageType.nonVolatile), // 
storage type
                                new Integer32(RowStatus.active) // row status
                };
                MOTableRow row = 
communityMIB.getSnmpCommunityEntry().createRow(new
OctetString("public2public").toSubIndex(true), com2sec);
                communityMIB.getSnmpCommunityEntry().addRow(row);
        }
        
        /**
         *
         */
        protected void unregisterManagedObjects() {
                // here we should unregister those objects previously 
registered...
        }
        
        /**
         * Empty implementation
         */
        @Override
        protected void addNotificationTargets(SnmpTargetMIB targetMIB,
SnmpNotificationMIB notificationMIB) {
                /* NONE TO DO */
        }
        
        /**
         * User based Security Model, only applicable to
         * SNMP v.3
         */
        protected void addUsmUser(USM usm) {
                /* NONE TO DO */
        }
}
_______________________________________________
SNMP4J mailing list
SNMP4J@agentpp.org
http://lists.agentpp.org/mailman/listinfo/snmp4j

Reply via email to