1 29 30 31 package snmp; 32 33 import java.io.*; 34 import java.net.*; 35 import java.util.*; 36 37 38 46 47 public class SNMPv1AgentInterface 48 implements Runnable 49 { 50 public static final int SNMP_PORT = 161; 51 52 public int receiveBufferSize = 512; 55 56 int version = 0; 57 58 private DatagramSocket dSocket; 59 private Thread receiveThread; 60 private Vector listenerVector; 61 62 private PrintWriter errorLog; 63 64 65 66 67 71 72 public SNMPv1AgentInterface(int version) 73 throws SocketException 74 { 75 this(version, SNMP_PORT, new PrintWriter(System.out)); 76 } 77 78 79 80 84 85 public SNMPv1AgentInterface(int version, int localPort) 86 throws SocketException 87 { 88 this(version, localPort, new PrintWriter(System.out)); 89 } 90 91 92 93 97 98 public SNMPv1AgentInterface(int version, PrintWriter errorReceiver) 99 throws SocketException 100 { 101 this(version, SNMP_PORT, errorReceiver); 102 } 103 104 105 106 110 111 public SNMPv1AgentInterface(int version, int localPort, PrintWriter errorReceiver) 112 throws SocketException 113 { 114 115 this.version = version; 116 117 dSocket = new DatagramSocket(localPort); 118 119 listenerVector = new Vector(); 120 121 receiveThread = new Thread (this); 122 123 errorLog = errorReceiver; 124 125 } 126 127 128 129 132 133 public void setErrorReceiver(PrintWriter errorReceiver) 134 { 135 errorLog = errorReceiver; 136 } 137 138 139 140 public void addRequestListener(SNMPRequestListener listener) 141 { 142 for (int i = 0; i < listenerVector.size(); i++) 144 { 145 if (listener == listenerVector.elementAt(i)) 146 { 147 return; 148 } 149 } 150 151 listenerVector.add(listener); 153 } 154 155 156 157 public void removeRequestListener(SNMPRequestListener listener) 158 { 159 for (int i = 0; i < listenerVector.size(); i++) 161 { 162 if (listener == listenerVector.elementAt(i)) 163 { 164 listenerVector.removeElementAt(i); 165 break; 166 } 167 } 168 169 } 170 171 172 173 176 177 public void startReceiving() 178 { 179 if (!receiveThread.isAlive()) 181 { 182 receiveThread = new Thread (this); 183 receiveThread.start(); 184 } 185 } 186 187 188 189 190 193 194 public void stopReceiving() 195 throws SocketException 196 { 197 receiveThread.interrupt(); 199 } 200 201 202 203 204 205 211 212 public void run() 213 { 214 215 216 while (!receiveThread.isInterrupted()) 217 { 218 219 try 220 { 221 222 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 223 224 dSocket.receive(inPacket); 225 226 InetAddress requesterAddress = inPacket.getAddress(); 227 int requesterPort = inPacket.getPort(); 228 229 byte[] encodedMessage = inPacket.getData(); 230 231 241 242 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 243 244 String communityName = receivedMessage.getCommunityName(); 245 SNMPPDU receivedPDU = receivedMessage.getPDU(); 246 byte requestPDUType = receivedPDU.getPDUType(); 247 248 251 SNMPSequence requestedVarList = receivedPDU.getVarBindList(); 252 253 Hashtable variablePairHashtable = new Hashtable(); 254 SNMPSequence responseVarList = new SNMPSequence(); 255 int errorIndex = 0; 256 int errorStatus = SNMPRequestException.NO_ERROR; 257 int requestID = receivedPDU.getRequestID(); 258 259 try 260 { 261 262 265 if ((requestPDUType == SNMPBERCodec.SNMPGETREQUEST) || (requestPDUType == SNMPBERCodec.SNMPSETREQUEST)) 266 { 267 268 for (int i = 0; i < listenerVector.size(); i++) 270 { 271 SNMPRequestListener listener = (SNMPRequestListener)listenerVector.elementAt(i); 272 273 SNMPSequence handledVarList = listener.processRequest(receivedPDU, communityName); 275 276 for (int j = 0; j < handledVarList.size(); j++) 278 { 279 280 SNMPSequence handledPair = (SNMPSequence)handledVarList.getSNMPObjectAt(j); 281 SNMPObjectIdentifier snmpOID = (SNMPObjectIdentifier)handledPair.getSNMPObjectAt(0); 282 SNMPObject snmpObject = (SNMPObject)handledPair.getSNMPObjectAt(1); 283 284 if (!variablePairHashtable.containsKey(snmpOID)) 285 { 286 variablePairHashtable.put(snmpOID, snmpObject); 287 } 288 289 } 290 291 } 292 293 294 295 for (int j = 0; j < requestedVarList.size(); j++) 297 { 298 SNMPSequence requestPair = (SNMPSequence)requestedVarList.getSNMPObjectAt(j); 299 SNMPObjectIdentifier snmpOID = (SNMPObjectIdentifier)requestPair.getSNMPObjectAt(0); 300 301 if (!variablePairHashtable.containsKey(snmpOID)) 303 { 304 errorIndex = j + 1; 305 errorStatus = SNMPRequestException.VALUE_NOT_AVAILABLE; 306 307 if (requestPDUType == SNMPBERCodec.SNMPGETREQUEST) 308 throw new SNMPGetException("OID " + snmpOID + " not handled", errorIndex, errorStatus); 309 else 310 throw new SNMPSetException("OID " + snmpOID + " not handled", errorIndex, errorStatus); 311 } 312 313 SNMPObject snmpObject = (SNMPObject)variablePairHashtable.get(snmpOID); 314 SNMPVariablePair responsePair = new SNMPVariablePair(snmpOID, snmpObject); 315 316 responseVarList.addSNMPObject(responsePair); 317 318 } 319 320 } 321 else if (requestPDUType == SNMPBERCodec.SNMPGETNEXTREQUEST) 322 { 323 for (int i = 0; i < listenerVector.size(); i++) 325 { 326 SNMPRequestListener listener = (SNMPRequestListener)listenerVector.elementAt(i); 327 328 SNMPSequence handledVarList = listener.processGetNextRequest(receivedPDU, communityName); 331 332 for (int j = 0; j < handledVarList.size(); j++) 334 { 335 336 SNMPSequence handledPair = (SNMPSequence)handledVarList.getSNMPObjectAt(j); 337 SNMPObjectIdentifier snmpOID = (SNMPObjectIdentifier)handledPair.getSNMPObjectAt(0); 338 SNMPObject snmpObject = (SNMPObject)handledPair.getSNMPObjectAt(1); 339 340 if (!variablePairHashtable.containsKey(snmpOID)) 341 { 342 variablePairHashtable.put(snmpOID, snmpObject); 343 } 344 345 } 346 347 } 348 349 350 351 for (int j = 0; j < requestedVarList.size(); j++) 353 { 354 SNMPSequence requestPair = (SNMPSequence)requestedVarList.getSNMPObjectAt(j); 355 SNMPObjectIdentifier snmpOID = (SNMPObjectIdentifier)requestPair.getSNMPObjectAt(0); 356 357 if (!variablePairHashtable.containsKey(snmpOID)) 359 { 360 errorIndex = j + 1; 361 errorStatus = SNMPRequestException.VALUE_NOT_AVAILABLE; 362 363 throw new SNMPGetException("OID " + snmpOID + " not handled", errorIndex, errorStatus); 364 } 365 366 SNMPVariablePair responsePair = (SNMPVariablePair)variablePairHashtable.get(snmpOID); 368 369 responseVarList.addSNMPObject(responsePair); 370 371 } 372 373 } 374 else 375 { 376 continue; 378 } 379 380 381 } 382 catch (SNMPRequestException e) 383 { 384 errorIndex = e.errorIndex; 386 errorStatus = e.errorStatus; 387 388 responseVarList = requestedVarList; 390 } 391 catch (Exception e) 392 { 393 errorIndex = 0; 395 errorStatus = SNMPRequestException.FAILED; 396 397 responseVarList = requestedVarList; 399 400 errorLog.println("Exception while processing request: " + e.toString()); 402 errorLog.flush(); 403 } 404 405 406 SNMPPDU pdu = new SNMPPDU(SNMPBERCodec.SNMPGETRESPONSE, requestID, errorStatus, errorIndex, responseVarList); 407 SNMPMessage message = new SNMPMessage(version, communityName, pdu); 408 byte[] messageEncoding = message.getBEREncoding(); 409 DatagramPacket outPacket = new DatagramPacket(messageEncoding, messageEncoding.length, requesterAddress, requesterPort); 410 411 412 dSocket.send(outPacket); 413 414 415 416 } 417 catch (IOException e) 418 { 419 errorLog.println("IOException during request processing: " + e.getMessage()); 421 errorLog.flush(); 422 } 423 catch (SNMPBadValueException e) 424 { 425 errorLog.println("SNMPBadValueException during request processing: " + e.getMessage()); 427 errorLog.flush(); 428 } 429 catch (Exception e) 430 { 431 errorLog.println("Exception during request processing: " + e.toString()); 433 errorLog.flush(); 434 } 435 436 } 437 438 } 439 440 441 442 443 private String hexByte(byte b) 444 { 445 int pos = b; 446 if (pos < 0) 447 pos += 256; 448 String returnString = new String (); 449 returnString += Integer.toHexString(pos/16); 450 returnString += Integer.toHexString(pos%16); 451 return returnString; 452 } 453 454 455 456 464 465 public void setReceiveBufferSize(int receiveBufferSize) 466 { 467 if (receiveBufferSize >= 484) 468 { 469 this.receiveBufferSize = receiveBufferSize; 470 } 471 else 472 { 473 this.receiveBufferSize = 484; 474 } 475 } 476 477 478 479 482 483 public int getReceiveBufferSize() 484 { 485 return this.receiveBufferSize; 486 } 487 488 489 490 } 491 492 493 494 | Popular Tags |