[SNMP4J] Basic Question about implementing SNMP Tables
Frank Fock
fock at agentpp.com
Sat Dec 15 13:32:30 CET 2007
Hi,
First, you should use SMIv2 for new MIB modules.
Second, in SMIv2 all index columns must have
a maximum access of "not-accessible". Thus,
there will be no readable index-column - just
a virtual one.
Best regards,
Frank
inliner683 at gmx.de wrote:
> Hello,
>
> I want to implement an agent serving a table defined in an own
> mib. The table rows will be created and deleted only by the agent
> itself dynamicalle to represent some information of a managed application.
> Cells in the table will be settable via a SNMP manager, but no row addition
> or removal should be possible via the manager.
>
> I will explain my question on the following example. Having the MIB
> definition as follows:
>
> SOMETABLE-MIB DEFINITIONS ::= BEGIN
>
> IMPORTS
> enterprises, OBJECT-TYPE, TimeTicks
> FROM RFC1155-SMI
> OBJECT-TYPE
> FROM RFC-1212;
>
> someCompany OBJECT IDENTIFIER ::= { enterprises 1234 }
> someSubTree1 OBJECT IDENTIFIER ::= { someCompany 2 }
> someSubTree2 OBJECT IDENTIFIER ::= { someSubTree1 2 }
>
> -- Some Table
> someTable OBJECT-TYPE
> SYNTAX SEQUENCE OF SomeEntry
> ACCESS not-accessible
> STATUS mandatory
> DESCRIPTION ""
> ::= { someSubTree2 1 }
>
> someEntry OBJECT-TYPE
> SYNTAX SomeEntry
> ACCESS not-accessible
> STATUS mandatory
> DESCRIPTION ""
> INDEX { index }
> ::= { someTable 1 }
>
> SomeEntry ::= SEQUENCE{
> index INTEGER,
> someID OCTET STRING,
> someVersion OCTET STRING
> }
>
> index OBJECT-TYPE
> SYNTAX INTEGER
> ACCESS read-only
> STATUS mandatory
> DESCRIPTION "Row index."
> ::= { someEntry 1 }
>
> someID OBJECT-TYPE
> SYNTAX OCTET STRING (SIZE (0..30))
> ACCESS read-write
> STATUS mandatory
> DESCRIPTION ""
> ::= { someEntry 2 }
>
> someVersion OBJECT-TYPE
> SYNTAX OCTET STRING (SIZE (0..30))
> ACCESS read-write
> STATUS mandatory
> DESCRIPTION ""
> ::= { someEntry 3 }
>
> ::= { someSubTree2 2 }
> END
>
> It' a simple table under the enterprises tree. The index column is the index of the table, the other
> columns are settable via SNMP. The table's SomeEntry is under the OID .1.3.6.1.4.1.1234.2.2.1.1.
>
>
> Now I have an implementation similar to the agenpro generator, first defining the OIDs:
>
> public static final OID oidSomeEntry = new OID(new int[]{1, 3, 6, 1, 4, 1, 1234, 2, 2, 1, 1});
> public static final OID oidIndex = new OID(new int[]{1, 3, 6, 1, 4, 1, 1234, 2, 2, 1, 1, 1});
>
> public static final int colIndex = 1;
> public static final int colSomeID = 2;
> public static final int colSomeVersion = 3;
>
> public static final int idxIndex = 0;
> public static final int idxSomeID = 1;
> public static final int idxSomeVersion = 2;
>
> The index definition is as follows:
>
> someEntryIndexes = new MOTableSubIndex[]{moFactory.createSubIndex(oidIndex,
> SMIConstants.SYNTAX_INTEGER, 1, 1)};
> someEntryIndex = moFactory.createIndex(someEntryIndexes, false);
>
> and the columns and table are created via:
>
> MOColumn[] someEntryColumns = new MOColumn[3];
> someEntryColumns[idxIndex] = moFactory.createColumn(colIndex, SMIConstants.SYNTAX_INTEGER,
> moFactory.createAccess(MOAccessImpl.ACCESSIBLE_FOR_READ_ONLY));
> someEntryColumns[idxSomeID] = new MOMutableColumn(colSomeID,
> SMIConstants.SYNTAX_OCTET_STRING, moFactory
> .createAccess(MOAccessImpl.ACCESSIBLE_FOR_READ_WRITE), null);
> someEntryColumns[idxSomeVersion] = new MOMutableColumn(colSomeVersion,
> SMIConstants.SYNTAX_OCTET_STRING, moFactory
> .createAccess(MOAccessImpl.ACCESSIBLE_FOR_READ_WRITE), null);
>
> someEntryModel = moFactory.createTableModel(oidSomeEntry, someEntryIndex, someEntryColumns);
> ((MOMutableTableModel) someEntryModel).setRowFactory(new SomeEntryRowFactory());
> someEntry = moFactory.createTable(oidSomeEntry, someEntryIndex, someEntryColumns,
> someEntryModel);
>
> This working fine so far and I want to add some rows to the table:
>
>
> Variable v1[] = new Variable[3];
> v1[0] = new Integer32(11);
> v1[1] = new OctetString("someID1");
> v1[2] = new OctetString("someVersion1");
> Variable v2[] = new Variable[3];
> v2[0] = new Integer32(22);
> v2[1] = new OctetString("someID2");
> v2[2] = new OctetString("someVersion2");
> someEntry.addRow(new SomeEntryRow(new OID("1"), v1));
> someEntry.addRow(new SomeEntryRow(new OID("2"), v2));
>
> And this is the part which is confusing me. I would to expect to identify the table row via the index
> column and the base OID. So reading columns someID and someVersion in this example I would expect the OIDs
>
> .1.3.6.1.4.1.1234.2.2.1.1.2.11
> .1.3.6.1.4.1.1234.2.2.1.1.3.11
>
> to be valid. "11" is the value in the index column to identify the row. But using a mib browser these oids are invalid, and
> you must use the oids
>
> .1.3.6.1.4.1.1234.2.2.1.1.2.1
> .1.3.6.1.4.1.1234.2.2.1.1.3.1
>
> to get the values from 1st row. These are the OIDs used when creating the row. What is wrong here and why
> do I have to provide an (arbitrary?) OID when creating rows. I thought the OIDs should be deduced from
> the index column? This doesn't fit in my understanding of indexing tables in SNMP. Here you can provide
> arbitrary OIDs which will be valid and the index column seems to be of no importance.
>
> As well I was wondering when the RowFactory will be used and by whom? Is this necessary when creating rows
> only by the agent itself?
>
> Having answered these questions, I would like to be able to delete the table rows by the agent. What would be here the
> way to go?
>
> Many thanks in advance.
>
>
>
>
>
>
>
--
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com
More information about the SNMP4J
mailing list