1 29 30 31 package snmp; 32 33 import java.io.*; 34 import java.net.*; 35 import java.util.*; 36 37 38 50 51 public class SNMPTrapReceiverInterface 52 implements Runnable 53 { 54 public static final int SNMP_TRAP_PORT = 162; 55 56 private int receiveBufferSize = 512; 59 60 private DatagramSocket dSocket; 61 private Thread receiveThread; 62 63 private Vector v1TrapListenerVector; 64 private Vector v2TrapListenerVector; 65 private Vector v2InformRequestListenerVector; 66 private PrintWriter errorLog; 67 68 69 70 71 75 76 public SNMPTrapReceiverInterface() 77 throws SocketException 78 { 79 this(new PrintWriter(System.out)); 81 } 82 83 84 85 90 91 public SNMPTrapReceiverInterface(PrintWriter errorReceiver) 92 throws SocketException 93 { 94 dSocket = new DatagramSocket(SNMP_TRAP_PORT); 95 96 v1TrapListenerVector = new Vector(); 97 v2TrapListenerVector = new Vector(); 98 v2InformRequestListenerVector = new Vector(); 99 100 receiveThread = new Thread (this); 101 102 errorLog = errorReceiver; 103 104 } 105 106 107 108 111 112 public void setErrorReceiver(PrintWriter errorReceiver) 113 { 114 errorLog = errorReceiver; 115 } 116 117 118 119 public void addv1TrapListener(SNMPv1TrapListener listener) 120 { 121 for (int i = 0; i < v1TrapListenerVector.size(); i++) 123 { 124 if (listener == v1TrapListenerVector.elementAt(i)) 125 { 126 return; 127 } 128 } 129 130 v1TrapListenerVector.add(listener); 132 } 133 134 135 136 public void removev1TrapListener(SNMPv1TrapListener listener) 137 { 138 for (int i = 0; i < v1TrapListenerVector.size(); i++) 140 { 141 if (listener == v1TrapListenerVector.elementAt(i)) 142 { 143 v1TrapListenerVector.removeElementAt(i); 144 break; 145 } 146 } 147 148 } 149 150 151 152 public void addv2TrapListener(SNMPv2TrapListener listener) 153 { 154 for (int i = 0; i < v2TrapListenerVector.size(); i++) 156 { 157 if (listener == v2TrapListenerVector.elementAt(i)) 158 { 159 return; 160 } 161 } 162 163 v2TrapListenerVector.add(listener); 165 } 166 167 168 169 public void removev2TrapListener(SNMPv2TrapListener listener) 170 { 171 for (int i = 0; i < v2TrapListenerVector.size(); i++) 173 { 174 if (listener == v2TrapListenerVector.elementAt(i)) 175 { 176 v2TrapListenerVector.removeElementAt(i); 177 break; 178 } 179 } 180 181 } 182 183 184 185 public void addv2InformRequestListener(SNMPv2InformRequestListener listener) 186 { 187 for (int i = 0; i < v2InformRequestListenerVector.size(); i++) 189 { 190 if (listener == v2InformRequestListenerVector.elementAt(i)) 191 { 192 return; 193 } 194 } 195 196 v2InformRequestListenerVector.add(listener); 198 } 199 200 201 202 public void removev2InformRequestListener(SNMPv2InformRequestListener listener) 203 { 204 for (int i = 0; i < v2InformRequestListenerVector.size(); i++) 206 { 207 if (listener == v2InformRequestListenerVector.elementAt(i)) 208 { 209 v2InformRequestListenerVector.removeElementAt(i); 210 break; 211 } 212 } 213 214 } 215 216 217 218 221 222 public void startReceiving() 223 { 224 if (!receiveThread.isAlive()) 226 { 227 receiveThread = new Thread (this); 228 receiveThread.start(); 229 } 230 } 231 232 233 234 235 238 239 public void stopReceiving() 240 throws SocketException 241 { 242 receiveThread.interrupt(); 244 } 245 246 247 248 249 250 255 256 public void run() 257 { 258 259 int errorStatus = 0; 260 int errorIndex = 0; 261 262 263 264 while (!receiveThread.isInterrupted()) 265 { 266 267 try 268 { 269 270 DatagramPacket inPacket = new DatagramPacket(new byte[receiveBufferSize], receiveBufferSize); 271 272 dSocket.receive(inPacket); 273 274 byte[] encodedMessage = inPacket.getData(); 275 276 277 287 288 289 SNMPMessage receivedMessage = new SNMPMessage(SNMPBERCodec.extractNextTLV(encodedMessage,0).value); 290 291 Object receivedPDU = receivedMessage.getPDUAsObject(); 292 293 if (!(receivedPDU instanceof SNMPv1TrapPDU) && !(receivedPDU instanceof SNMPv2TrapPDU) && !(receivedPDU instanceof SNMPv2InformRequestPDU)) 294 { 295 throw new SNMPBadValueException("PDU received that's not a v1 or v2 trap or inform request; message payload of type " + receivedPDU.getClass().toString()); 296 } 297 298 if (receivedPDU instanceof SNMPv1TrapPDU) 300 { 301 for (int i = 0; i < v1TrapListenerVector.size(); i++) 302 { 303 SNMPv1TrapListener listener = (SNMPv1TrapListener)v1TrapListenerVector.elementAt(i); 304 305 listener.processv1Trap((SNMPv1TrapPDU)receivedPDU); 306 } 307 } 308 else if (receivedPDU instanceof SNMPv2TrapPDU) 309 { 310 for (int i = 0; i < v2TrapListenerVector.size(); i++) 311 { 312 SNMPv2TrapListener listener = (SNMPv2TrapListener)v2TrapListenerVector.elementAt(i); 313 314 listener.processv2Trap((SNMPv2TrapPDU)receivedPDU); 315 } 316 } 317 else if (receivedPDU instanceof SNMPv2InformRequestPDU) 318 { 319 for (int i = 0; i < v2InformRequestListenerVector.size(); i++) 320 { 321 SNMPv2InformRequestListener listener = (SNMPv2InformRequestListener)v2InformRequestListenerVector.elementAt(i); 322 323 listener.processv2InformRequest((SNMPv2InformRequestPDU)receivedPDU); 324 } 325 } 326 327 328 } 329 catch (IOException e) 330 { 331 errorLog.println("IOException during request processing: " + e.toString()); 333 errorLog.flush(); 334 } 335 catch (SNMPBadValueException e) 336 { 337 errorLog.println("SNMPBadValueException during request processing: " + e.toString()); 339 errorLog.flush(); 340 } 341 catch (Exception e) 342 { 343 errorLog.println("Exception during request processing: " + e.toString()); 345 errorLog.flush(); 346 } 347 348 } 349 350 } 351 352 353 354 private String hexByte(byte b) 355 { 356 int pos = b; 357 if (pos < 0) 358 pos += 256; 359 String returnString = new String (); 360 returnString += Integer.toHexString(pos/16); 361 returnString += Integer.toHexString(pos%16); 362 return returnString; 363 } 364 365 366 367 368 369 370 private String getHex(byte theByte) 371 { 372 int b = theByte; 373 374 if (b < 0) 375 b += 256; 376 377 String returnString = new String (Integer.toHexString(b)); 378 379 if (returnString.length()%2 == 1) 381 returnString = "0" + returnString; 382 383 return returnString; 384 } 385 386 387 388 396 397 public void setReceiveBufferSize(int receiveBufferSize) 398 { 399 if (receiveBufferSize >= 484) 400 { 401 this.receiveBufferSize = receiveBufferSize; 402 } 403 else 404 { 405 this.receiveBufferSize = 484; 406 } 407 } 408 409 410 411 414 415 public int getReceiveBufferSize() 416 { 417 return this.receiveBufferSize; 418 } 419 420 421 422 } | Popular Tags |