[SNMP4J] FW: Is it possible to create an OID in the agent (server) MIB from the manager (client)?

Réda BENKIRANE reda.benkirane at hotmail.fr
Fri Oct 30 15:59:07 CET 2015



Réda BENKIRANE

From: reda.benkirane at hotmail.fr
To: fock at agentpp.com
Subject: RE: [SNMP4J] Is it possible to create an OID in the agent (server) MIB from the manager (client)?
Date: Thu, 29 Oct 2015 14:55:08 +0000




Hi Frank,
Thank you very much for your clear answer.
I tried to gather what you told me and what I understood to continue building my Agent.
What I want exactly is to create a conceptual table that has zero (or one "test" unuseful row) at the beginning and then, to be able to send a SET from the Manager. I want a structure of columns like that : { IPAddress IPAdd, Integer32 NodeID, Integer32 Counter }. 
=> For IP Adresses that already exist in the MIB, I will simply increment the counter by sending a SET. => For IP Addresses that doesn't exist I want to CREATE a NEW row by sending a SET. 
Do you think that this is possible ? Particularly, what do you think is the best way to increment the counter ? I have thought about GET-ting the value and then SET-ting it but I don't know if this operation is safe (If another client thread tries to do the same thing at the same time).
For what I have done till now, it unfortunately doesn't work. When I run the Agent, everything is okay, the conceptual table is created (Verified with an SNMP Walk on the root OID "1.3.6.1.2.1.3" using Paessler SNMP Tester 5.2.1).
The problem occurs when I send the SET to the agent FROM the client (manager) (Please see the SET Implementation below).
I get this error in the Agent Side :
java.lang.Exception: Error 'Inconsistent naming used' generated at: 1.3.6.1.2.1.3.1 = 192.168.1.12	at org.snmp4j.agent.request.SnmpRequest$SnmpSubRequest.requestStatusChanged(SnmpRequest.java:621)	at (...)	at java.lang.Thread.run(Thread.java:745)
I get this error in the Manager (Client) Side : 
java.io.IOException: Unexpected end of input stream at position 82	at org.snmp4j.asn1.BERInputStream.read(BERInputStream.java:58)	at (...)	at java.lang.Thread.run(Thread.java:745)
Why it tries to write at "1.3.5.1.2.1.3.1" while I want it to write in a NEW row ? Here it would be "1.3.5.1.2.1.3.1.3"
When I try to rather write at "1.3.5.1.2.1.3.x.3" (Non Existing Sub-OID) (x = 1, 2 or 3, depends on the column), I get this error (even if I have set ACCESS for the table to ACCESS_READ_CREATE) : Agent Side Error : java.lang.Exception: Error 'Not writable' generated at: 1.3.6.1.2.1.3.1.3 = 192.168.1.12	at org.snmp4j.agent.request.SnmpRequest$SnmpSubRequest.requestStatusChanged(SnmpRequest.java:621)	at (...)	at java.lang.Thread.run(Thread.java:745)Client Side Error : java.io.IOException: Unexpected end of input stream at position 85	at org.snmp4j.asn1.BERInputStream.read(BERInputStream.java:58)        at (...)	at java.lang.Thread.run(Thread.java:745)
Even when I try to write at Existing-Row OID : "1.3.5.1.2.1.3.x.1", I get the same error ('Not Writeable').
So, regarding all of this, how can I create a new row and increment the counter ? What did I do wrong ?
Thank you very much for your help,
Please see below the simplified implementations of my agent's main and addViews, and my client's main
Reda 
PS : To understand, here are the implementations : 
Here is a simplified "Main" of my Agent : 
public static void main(String[] Args) {final OID customTable = new OID(".1.3.6.1.2.1.3");Agent agent = new Agent("172.24.167.61/161");agent.start();
/* Here we create the conceptual table with ordered values in the MIB * "1.3.6.1.2.1.3.1.x" => 1st column * "1.3.6.1.2.1.3.2.x" => 2nd column * "1.3.6.1.2.1.3.3.x" => 3rd column*/MOTableBuilder customBuilder = new MOTableBuilder(customTable)						.addColumnType(1, SMIConstants.SYNTAX_OCTET_STRING, MOAccessImpl.ACCESS_READ_CREATE)						.addColumnType(2, SMIConstants.SYNTAX_INTEGER, MOAccessImpl.ACCESS_READ_CREATE)						.addColumnType(3, SMIConstants.SYNTAX_INTEGER, MOAccessImpl.ACCESS_READ_CREATE)						.addRowValue(new OctetString("192.168.1.10"))						.addRowValue(new Integer32(0))						.addRowValue(new Integer32(100))				                .addRowValue(new OctetString("192.168.1.11"))						.addRowValue(new Integer32(0))				                .addRowValue(new Integer32(200));
agent.registerManagedObject(customBuilder.build());
	   while(true) {
                System.out.println("Agent running...");
	        Thread.sleep(5000);
	   }}
Here is the minimal view based Access Control method AddViews(VacmMIB vacm) 
	/**	 * 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);				vacm.addViewTreeFamily(new OctetString("fullWriteView"), new OID("1.3"),				new OctetString(), VacmMIB.vacmViewIncluded, 				StorageType.nonVolatile);				vacm.addViewTreeFamily(new OctetString("fullReadView"), new OID("1.3.6.1.2.1.3"), 				new OctetString(), VacmMIB.vacmViewIncluded,				StorageType.nonVolatile);				vacm.addViewTreeFamily(new OctetString("fullWriteView"), new OID("1.3.6.1.2.1.3"), 				new OctetString(), VacmMIB.vacmViewIncluded,				StorageType.nonVolatile);	}
And finally here is the simplified "Main" of my SnmpSet Sample (Client) :
private static String  ipAddress  = "172.24.167.61";private static String  port    = "161";
/* * Root of the 1st column (OctetString IPAddress) : ".1.3.6.1.2.1.3.1" * Root of the 2nd column (Integer32 NodeID) : ".1.3.6.1.2.1.3.2" * Root of the 3rd column (Integer32 Counter) : ".1.3.6.1.2.1.3.3" */final static OID[] customTable = new OID[]{new OID(".1.3.6.1.2.1.3.1"),		  						             new OID(".1.3.6.1.2.1.3.2"),		  						             new OID(".1.3.6.1.2.1.3.3")};  private static int    snmpVersion  = SnmpConstants.version2c;  private static String  community  = "public";
public static void main(String[] args) throws Exception  { TransportMapping transport = new DefaultUdpTransportMapping();    transport.listen();    CommunityTarget comtarget = new CommunityTarget();    comtarget.setCommunity(new OctetString(community));    comtarget.setVersion(snmpVersion);    comtarget.setAddress(new UdpAddress(ipAddress + "/" + port));    comtarget.setRetries(2);    comtarget.setTimeout(1500);
/* Here we want to SEND a SET in order to CREATE a new ROW in the TABLE   * customTable[0] => corresponds to the OID where to put the IP Address (here simply in OctetString format)  * customTable[1] => corresponds to the OID where to put the Node-ID (I need a Node ID for my application)  * customTable[2] => corresponds to the OID where to put the Counter (Here it is set to 125 but what I want finally  *                                    is to INCREMENT the counter, in order to have a Statistic).  */PDU customTablePDU = new PDU();    customTablePDU.addAll(new VariableBinding[]{new VariableBinding(customTable[0],new OctetString("192.168.1.12")),            new VariableBinding(customTable[1],new Integer32(0)),            new VariableBinding(customTable[2],new Integer32(125))});customTablePDU.setType(PDU.SET);Snmp customSnmp = new Snmp(transport);
System.out.println("Request:\nSending CustomTable Snmp Set Request to Agent (CREATE a new row)...");ResponseEvent customTableResponse = customSnmp.set(customTablePDU, comtarget);}



Réda BENKIRANE

> To: snmp4j at agentpp.org
> From: fock at agentpp.com
> Date: Thu, 22 Oct 2015 18:33:53 +0200
> Subject: Re: [SNMP4J] Is it possible to create an OID in the agent (server) MIB from the manager (client)?
> 
> Hi Réda,
> 
> If you have the MIB specification, the steps to do are (for a production 
> grade system):
> 
> 1. Write or generate using AgenPro, the ManagedObject implementations 
> for the MIB specification.
> 2. Instrument the ManagedObjects (i.e., MOScalars and MOMutableTableRows).
> 3. Compile the agent and run it
> 4. Set variable binding you want to change.
> 5. The agent instrumentation code will be called and can then act upon 
> the new value.
> 
> As a consequence from the above, you will not be able to create totally 
> new MIB objects in an agent.
> Means, MIB object instances for MIB object definitions, that the authors 
> of the agent did not implement.
> 
> However, the SNMP standard allows to define SNMP tables. Tables can 
> contain zero rows. To create
> a new row, typically using the RowStatus column of that table, you 
> simple SET the RowStatus column
> of the new row to createAndWait(5). You will have to define/find out a 
> valid row index (the row "name")
> for the new row. That row index OID is then appended to the OID of the 
> column you SET.
> 
> With the above approach you are able to create "new" objects in an 
> agent, the agent did not had before.
> However, the structure of those objectzs must be already known at 
> compile time to the agent.
> 
> All the above, is true for product grade agents.
> 
> If you want to simulate an agent and simply provide/put data in an agent 
> without implementing any
> functionality based on that data, then you can also create totally new 
> object VBs at runtime.
> The AgenPro built-in simulation agent does that by dynamically load new 
> MIB specifications.
> You can use the SimMOFactory by implementing the AgentppSimulationMib in 
> your agent, for instance.
> 
> Hope this helps.
> 
> Best regards,
> Frank
> 
> Am 22.10.2015 um 17:27 schrieb Réda BENKIRANE:
> > I am using SNMP4J Framework and it implements and makes possible the standard SET, GET, GET-NEXT, etc. messages.For example, with a SET, I can update the value of the MIB OID "1.3.6.1.2.50.0". This works perfectly for me. I can do that using org.snmp4j.Snmp.set(PDU pdu, Target target)What I want to do now is to CREATE a custom MIB OID (as "1.3.6.1.2.100.0") FROM the client and assign a value to it and not simply update an existing MIB OID value.Is there any standard SNMP way to do that easily ?
> > Réda BENKIRANE 		 	   		
> > _______________________________________________
> > SNMP4J mailing list
> > SNMP4J at agentpp.org
> > https://oosnmp.net/mailman/listinfo/snmp4j
> 
> -- 
> ---
> AGENT++
> Maximilian-Kolbe-Str. 10
> 73257 Koengen, Germany
> https://agentpp.com
> Phone: +49 7024 8688230
> Fax:   +49 7024 8688231
> 
> _______________________________________________
> SNMP4J mailing list
> SNMP4J at agentpp.org
> https://oosnmp.net/mailman/listinfo/snmp4j
 		 	   		   		 	   		  


More information about the SNMP4J mailing list