KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > dwipal > SnmpLib


1 package com.dwipal;
2
3 import java.util.*;
4 import org.snmp4j.*;
5 import org.snmp4j.event.*;
6 import org.snmp4j.mp.*;
7 import org.snmp4j.smi.*;
8 import org.snmp4j.transport.*;
9
10
11 public class SnmpLib implements ISnmpLib {
12
13   private String JavaDoc m_host;
14   private int m_port;
15   private String JavaDoc m_readCommunity;
16   private String JavaDoc m_writeCommunity;
17   private ISnmpResponseHandler m_snmpResponseHandler;
18   private boolean m_sessionDestroyed;
19   private CommunityTarget m_target;
20
21   public SnmpLib() {
22     m_target=null;
23   }
24
25   public String JavaDoc getHost() {
26     return m_host;
27   }
28   public int getPort() {
29     return m_port;
30   }
31   public String JavaDoc getReadCommunity() {
32     return m_readCommunity;
33   }
34   public String JavaDoc getWriteCommunity() {
35     return m_writeCommunity;
36   }
37   public void setCommunity(String JavaDoc readCommunity, String JavaDoc writeCommunity) {
38     m_readCommunity=readCommunity;
39     m_writeCommunity=writeCommunity;
40   }
41   public void setHost(String JavaDoc host) {
42     m_target=null;
43     m_host=host;
44   }
45   public void setPort(int port) {
46     m_target=null;
47     m_port=port;
48   }
49   public void setSnmpResponseHandler(ISnmpResponseHandler snmpResponseHandler) {
50     m_snmpResponseHandler=snmpResponseHandler;
51   }
52   public ISnmpResponseHandler getSnmpResponseHandler() {
53     return m_snmpResponseHandler;
54   }
55   public void destroySession() {
56     m_sessionDestroyed=true;
57   }
58   private Target getTarget(String JavaDoc strCommunity) {
59     if(m_target==null) {
60       Address addr = GenericAddress.parse("udp:" + getHost() + "/" + getPort());
61       m_target = new CommunityTarget();
62       m_target.setCommunity(new OctetString(strCommunity));
63       m_target.setAddress(addr);
64       m_target.setVersion(SnmpConstants.version1);
65       m_target.setRetries(3);
66     }
67     return m_target;
68   }
69
70   public void snmpWalk(String JavaDoc oidFrom, String JavaDoc oidTo) throws SnmpException {
71     snmpWalk(oidFrom);
72   }
73
74   public void snmpWalk(String JavaDoc oidFrom) throws SnmpException {
75     PDU request=new PDU();
76     request.setType(PDU.GETNEXT);
77     request.add(new VariableBinding(new OID(oidFrom)));
78     request.setNonRepeaters(0);
79     OID rootOID = request.get(0).getOid();
80     PDU response = null;
81
82     int objects = 0;
83     int requests = 0;
84     long startTime = System.currentTimeMillis();
85
86     try {
87       Snmp snmp=new Snmp(new DefaultUdpTransportMapping());
88       snmp.listen();
89       m_sessionDestroyed=false;
90       do {
91         requests++;
92         ResponseEvent responseEvent = snmp.send(request, getTarget(getReadCommunity()));
93         response = responseEvent.getResponse();
94         if (response != null) {
95           objects += response.size();
96         }
97       }
98       while (!processWalk(response, request, rootOID) && !m_sessionDestroyed);
99
100     } catch (SnmpException e) {
101       throw e;
102     } catch (Exception JavaDoc e) {
103       e.printStackTrace();
104       throw new SnmpException(e.getMessage());
105     }
106     if(m_snmpResponseHandler != null) {
107       m_snmpResponseHandler.requestStats(requests, objects, System.currentTimeMillis()-startTime);
108     }
109   }
110
111   private boolean processWalk(PDU response, PDU request, OID rootOID) throws SnmpException {
112     if ((response == null) || (response.getErrorStatus() != 0) ||
113         (response.getType() == PDU.REPORT)) {
114       return true;
115     }
116     boolean finished = false;
117     OID lastOID = request.get(0).getOid();
118     for (int i=0; (!finished) && (i<response.size()); i++) {
119       VariableBinding vb = response.get(i);
120       if ((vb.getOid() == null) ||
121           (vb.getOid().size() < rootOID.size()) ||
122           (rootOID.leftMostCompare(rootOID.size(), vb.getOid()) != 0)) {
123         finished = true;
124       }
125       else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
126         outputResponse(vb);
127         finished = true;
128       }
129       else if (vb.getOid().compareTo(lastOID) <= 0) {
130         throw new SnmpException("Variable received is not lexicographic successor of requested one:" + vb.toString() + " <= "+lastOID);
131       }
132       else {
133         outputResponse(vb);
134         lastOID = vb.getOid();
135       }
136     }
137     if (response.size() == 0) {
138       finished = true;
139     }
140     if (!finished) {
141       VariableBinding next = response.get(response.size()-1);
142       next.setVariable(new Null());
143       request.set(0, next);
144       request.setRequestID(new Integer32(0));
145     }
146     return finished;
147   }
148
149   private SnmpOidValuePair outputResponse(VariableBinding vb) {
150     SnmpOidValuePair oidval=new SnmpOidValuePair();
151     oidval.oid=vb.getOid().toString();
152     oidval.value_str=vb.getVariable().toString();
153     if(m_snmpResponseHandler != null) {
154       m_snmpResponseHandler.responseReceived(oidval);
155     }
156     return oidval;
157   }
158
159   void snmpSetValue(String JavaDoc oid, int syntax, String JavaDoc value) throws SnmpException {
160     VariableBinding varbind = getVarBindForSetRequest(oid, syntax, value);
161
162     PDU request = new PDU();
163     request.setType(PDU.SET);
164     request.add(varbind);
165     PDU response = null;
166
167     long startTime = System.currentTimeMillis();
168
169     try {
170       Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
171       snmp.listen();
172       ResponseEvent responseEvent = snmp.send(request, getTarget(getWriteCommunity()));
173       response = responseEvent.getResponse();
174       System.out.println(response);
175     }
176     catch (Exception JavaDoc e) {
177       e.printStackTrace();
178       throw new SnmpException(e.getMessage());
179     }
180   }
181
182
183
184
185   VariableBinding getVarBindForSetRequest(String JavaDoc oid, int type, String JavaDoc value) {
186     VariableBinding vb = new VariableBinding(new OID(oid));
187
188     if (value != null) {
189       Variable variable;
190       switch (type) {
191         case DwSnmpMibRecord.VALUE_TYPE_INTEGER32:
192           variable = new Integer32(Integer.parseInt(value));
193           break;
194         case DwSnmpMibRecord.VALUE_TYPE_UNSIGNED_INTEGER32:
195           variable = new UnsignedInteger32(Long.parseLong(value));
196           break;
197         case DwSnmpMibRecord.VALUE_TYPE_OCTET_STRING:
198           variable = new OctetString(value);
199           break;
200         case DwSnmpMibRecord.VALUE_TYPE_NULL:
201           variable = new Null();
202           break;
203         case DwSnmpMibRecord.VALUE_TYPE_OID:
204           variable = new OID(value);
205           break;
206         case DwSnmpMibRecord.VALUE_TYPE_TIMETICKS:
207           variable = new TimeTicks(Long.parseLong(value));
208           break;
209         case DwSnmpMibRecord.VALUE_TYPE_IP_ADDRESS:
210           variable = new IpAddress(value);
211           break;
212         default:
213           throw new IllegalArgumentException JavaDoc("Variable type " + type +
214                                              " not supported");
215       }
216       vb.setVariable(variable);
217     }
218     return vb;
219   }
220
221 }
222
Popular Tags