package com.wonesys.emsModule.alarms;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import uk.co.westhawk.snmp.event.TrapEvent;
import uk.co.westhawk.snmp.event.TrapListener;
import uk.co.westhawk.snmp.stack.DecodingException;
import uk.co.westhawk.snmp.stack.DefaultTrapContext;
import uk.co.westhawk.snmp.stack.Pdu;
import uk.co.westhawk.snmp.stack.PduException;
import uk.co.westhawk.snmp.stack.SnmpContext;
import uk.co.westhawk.snmp.stack.SnmpContextPool;
import uk.co.westhawk.snmp.stack.SnmpContextv2c;
import uk.co.westhawk.snmp.stack.varbind;
/**
* <p>
* Title:
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2003
* </p>
* <p>
* Company:
* </p>
*
* @author unascribed
* @version 1.0
*/
public class SnmpTrapListener implements TrapListener {
Log log = LogFactory.getLog(SnmpTrapListener.class);
// Oid's
// General OIDs
static final String enterprise = "1.3.6.1.4.1.9.";
static final String sysUpTime = "1.3.6.1.2.1.1.3.0";
static final String mplsTunnelUp = "1.3.6.1.4.1.15289.2.1.3.0.1";
static final String mplsTunnelDown = "1.3.6.1.4.1.15289.2.1.3.0.2";
// Trap OIDs
static final String VTPNotificationsVLANCreated = enterprise
+ "9.46.2.0.10";
static final String VTPNotificationsVLANDeleted = enterprise
+ "9.46.2.0.11";
static final String SNMPTrapsColdStart = "1.3.6.1.6.3.1.1.5.1";
static final String SNMPTrapsWarmStart = "1.3.6.1.6.3.1.1.5.2";
static final String SNMPTrapsLinkDown = "1.3.6.1.6.3.1.1.5.3";
static final String SNMPTrapsLinkUp = "1.3.6.1.6.3.1.1.5.4";
static final String SNMPTrapsAuthFailure = "1.3.6.1.6.3.1.1.5.5";
// Fi Oid's
private int port = 162;
private BufferedWriter out;
DefaultTrapContext trapContext;
// SnmpContextv2c context;
AlarmsControler alarmsControler;
public SnmpTrapListener(int port, AlarmsControler alarmsControler) {
this.port = port;
this.alarmsControler = alarmsControler;
}
public void rcv() throws IOException {
// context = new SnmpContextv2c("127.0.0.1", port,
// SnmpContext.STANDARD_SOCKET);
trapContext = DefaultTrapContext.getInstance(port,
SnmpContextPool.STANDARD_SOCKET);
trapContext.addTrapListener(this);
log.debug("WoneView-AlarmListener On");
}
public String returnValue(String s) {
return s.substring(s.toString().indexOf(":") + 2, s.toString().length());
}
public String returnOid(String s) {
return s.substring(0, s.toString().indexOf(":"));
}
public void trapReceived(TrapEvent evt) {
log.debug("trap received");
int ver = evt.getVersion();
String hostaddr = evt.getHostAddress();
/*
* S'ha tret el context fora i s'han afegit destroy() fora, per evitar el IOException que no mola.
*
* Idea: Obrir el context nomes un cop al iniciar i fer servir el mateix sempre.
*/
String log_entry = "hostaddr = " + hostaddr + ", ver = " + ver + ", deco = "
+ evt.isDecoded();
log.debug(log_entry);
// EscriptorFitxers.writeLogTraps( log );
Pdu trapPdu = null;
String voodoo = ", received ";
boolean decoded = false;
String community = "publica";
byte[] mess = null;
try {
if (ver == 0) // snmp v1
{
SnmpContext context = new SnmpContext(hostaddr, port,
SnmpContext.STANDARD_SOCKET);
context.setCommunity(community);
trapPdu = context.processIncomingTrap(evt.getMessage());
context.destroy();
decoded = true;
int genericTrap = ((uk.co.westhawk.snmp.stack.TrapPduv1) trapPdu)
.getGenericTrap();
procesTrap(hostaddr, trapPdu, evt.isDecoded(), genericTrap);
} else {
SnmpContextv2c context = new SnmpContextv2c(hostaddr, port,
SnmpContext.STANDARD_SOCKET);
context.setCommunity(community);
trapPdu = context.processIncomingTrap(evt.getMessage());
// context.destroy();
decoded = true;
procesTrap(hostaddr, trapPdu, evt.isDecoded());
}
} catch (DecodingException ex) {
if (AlarmsControler.debug)
log.debug("SnmpTrapListener: Decoding exception: "
+ ex.getMessage(), ex);
String dm = ex.getMessage();
if (dm.startsWith("Wrong community: expected")) {
if (AlarmsControler.debug)
log.debug("SnmpTrapListener: Wrong community");
int sloc = dm.lastIndexOf(voodoo);
if (sloc > 0) {
sloc += voodoo.length();
community = dm.substring(sloc);
decoded = false;
}
}
} catch (IOException ex) {
// context.destroy();
// System.out.println(ex.toString());
if (AlarmsControler.debug)
log.debug("", ex);
}
if (!decoded)
try {
if (ver == 0) // snmp v1
{
SnmpContext context = new SnmpContext(hostaddr, port,
SnmpContext.STANDARD_SOCKET);
context.setCommunity(community);
trapPdu = context.processIncomingTrap(evt.getMessage());
context.destroy();
decoded = true;
int genericTrap = ((uk.co.westhawk.snmp.stack.TrapPduv1) trapPdu)
.getGenericTrap();
procesTrap(hostaddr, trapPdu, evt.isDecoded(), genericTrap);
} else {
SnmpContextv2c context = new SnmpContextv2c(hostaddr, port,
SnmpContext.STANDARD_SOCKET);
context.setCommunity(community);
trapPdu = context.processIncomingTrap(evt.getMessage());
// context.destroy();
decoded = true;
procesTrap(hostaddr, trapPdu, evt.isDecoded());
}
} catch (DecodingException ex) {
if (AlarmsControler.debug)
log.debug("", ex);
} catch (IOException ex) {
if (AlarmsControler.debug)
log.debug("", ex);
}
}
public void procesTrap(String hostaddr, Pdu trapPdu, boolean decoded) {
procesTrap(hostaddr, trapPdu, decoded, 0);
}
public void procesTrap(String hostaddr, Pdu trapPdu, boolean decoded,
int genericTrap) {
varbind[] b = null;
String trap = trapPdu.toString();
String str = "\t";
StringTokenizer tok = new StringTokenizer(trap, "[,]");
while (tok.hasMoreTokens())
str = str + tok.nextToken() + " ";
// System.out.println(tok.nextToken());
try {
b = trapPdu.getResponseVarbinds();
// String snmpTrap = returnValue(b[1].toString());
String values = "";
String oids = "";
// System.out.println(hostaddr);
for (int i = 0; i < b.length; i++) {
char[] chars = returnValue(b[i].toString()).toCharArray();
if (chars.length >= 1) {
if (chars[0] == 0x00)
values += "0x00" + "#";
else
values += returnValue(b[i].toString()) + "#";
oids += returnOid(b[i].toString()) + "#";
}
if (AlarmsControler.debug)
log.debug("SnmpTrapListener: Value " + i + " is "
+ returnValue(b[i].toString()));
}
// System.out.println(hostaddr + " " /*+ b.toString()*/ + " " +
// str);
String str1 = "";
String str2 = "";
if (0 < b.length)
str1 = returnValue(b[0].toString());
else
str1 = String.valueOf(genericTrap);
if (1 < b.length)
str2 = returnValue(b[1].toString());
else
str2 = String.valueOf(genericTrap);
// alarmafacaderemote.newAlarm(hostaddr,str1 , str2, values, oids);
alarmsControler.registerAlarm(str2, hostaddr, values, oids);
} catch (PduException pdue) {
// EscriptorFitxers.writeLogExcepcions(pdue.toString());
// System.out.println(pdue);
if (AlarmsControler.debug)
log.debug("SnmpTrapListener:PDU Exception: "
+ pdue.getMessage());
} catch (Exception e) {
// e.printStackTrace();
if (AlarmsControler.debug)
log.debug("SnmpTrapListener: Unkown Exception:", e);
}
}
}