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 m_host; 14 private int m_port; 15 private String m_readCommunity; 16 private String 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 getHost() { 26 return m_host; 27 } 28 public int getPort() { 29 return m_port; 30 } 31 public String getReadCommunity() { 32 return m_readCommunity; 33 } 34 public String getWriteCommunity() { 35 return m_writeCommunity; 36 } 37 public void setCommunity(String readCommunity, String writeCommunity) { 38 m_readCommunity=readCommunity; 39 m_writeCommunity=writeCommunity; 40 } 41 public void setHost(String 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 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 oidFrom, String oidTo) throws SnmpException { 71 snmpWalk(oidFrom); 72 } 73 74 public void snmpWalk(String 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 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 oid, int syntax, String 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 e) { 177 e.printStackTrace(); 178 throw new SnmpException(e.getMessage()); 179 } 180 } 181 182 183 184 185 VariableBinding getVarBindForSetRequest(String oid, int type, String 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 ("Variable type " + type + 214 " not supported"); 215 } 216 vb.setVariable(variable); 217 } 218 return vb; 219 } 220 221 } 222 | Popular Tags |