package org.opennms.netmgt.snmp.mock;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.core.utils.LogUtils;
import org.opennms.netmgt.snmp.CollectionTracker;
import org.opennms.netmgt.snmp.SnmpAgentAddress;
import org.opennms.netmgt.snmp.SnmpAgentConfig;
import org.opennms.netmgt.snmp.SnmpObjId;
import org.opennms.netmgt.snmp.SnmpStrategy;
import org.opennms.netmgt.snmp.SnmpTrapBuilder;
import org.opennms.netmgt.snmp.SnmpV1TrapBuilder;
import org.opennms.netmgt.snmp.SnmpV2TrapBuilder;
import org.opennms.netmgt.snmp.SnmpV3TrapBuilder;
import org.opennms.netmgt.snmp.SnmpV3User;
import org.opennms.netmgt.snmp.SnmpValue;
import org.opennms.netmgt.snmp.SnmpValueFactory;
import org.opennms.netmgt.snmp.SnmpWalker;
import org.opennms.netmgt.snmp.TrapNotificationListener;
import org.opennms.netmgt.snmp.TrapProcessorFactory;
import org.springframework.core.io.Resource;
public class MockSnmpStrategy implements SnmpStrategy {
private static final SnmpValue[] EMPTY_SNMP_VALUE_ARRAY = new SnmpValue[0];
// TOG's enterprise ID
private static int s_enterpriseId = 5813;
private static Map<SnmpAgentAddress,PropertyOidContainer> m_loaders = new HashMap<SnmpAgentAddress,PropertyOidContainer>();
public MockSnmpStrategy() {
}
@Override
public SnmpWalker createWalker(final SnmpAgentConfig agentConfig, final String name, final CollectionTracker tracker) {
LogUtils.debugf(this, "createWalker(%s/%d, %s, %s)", InetAddressUtils.str(agentConfig.getAddress()), agentConfig.getPort(), name, tracker.getClass().getName());
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
return new MockSnmpWalker(aa, agentConfig.getVersion(), m_loaders.get(aa), name, tracker, agentConfig.getMaxVarsPerPdu());
}
@Override
public SnmpValue set(final SnmpAgentConfig agentConfig, final SnmpObjId oid, final SnmpValue value) {
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
if (!m_loaders.containsKey(aa)) {
return null;
}
return m_loaders.get(aa).set(oid, value);
}
@Override
public SnmpValue[] set(final SnmpAgentConfig agentConfig, final SnmpObjId[] oids, final SnmpValue[] values) {
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
if (!m_loaders.containsKey(aa)) {
return new SnmpValue[values.length];
}
return m_loaders.get(aa).set(oids, values);
}
@Override
public SnmpValue get(final SnmpAgentConfig agentConfig, final SnmpObjId oid) {
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
if (!m_loaders.containsKey(aa)) {
return null;
}
SnmpValue val = m_loaders.get(aa).findValueForOid(oid);
if (val.isNull()) {
return null;
}
return val;
}
@Override
public SnmpValue[] get(final SnmpAgentConfig agentConfig, final SnmpObjId[] oids) {
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
final PropertyOidContainer container = m_loaders.get(aa);
if (container == null) return new SnmpValue[oids.length];
final List<SnmpValue> values = new ArrayList<SnmpValue>();
for (final SnmpObjId oid : oids) {
values.add(container.findValueForOid(oid));
}
return values.toArray(EMPTY_SNMP_VALUE_ARRAY);
}
@Override
public SnmpValue getNext(final SnmpAgentConfig agentConfig, final SnmpObjId oid) {
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
if (!m_loaders.containsKey(aa)) {
return null;
}
final PropertyOidContainer container = m_loaders.get(aa);
return container.findNextValueForOid(oid);
}
@Override
public SnmpValue[] getNext(final SnmpAgentConfig agentConfig, final SnmpObjId[] oids) {
final SnmpAgentAddress aa = new SnmpAgentAddress(agentConfig.getAddress(), agentConfig.getPort());
if (!m_loaders.containsKey(aa)) {
return null;
}
final PropertyOidContainer container = m_loaders.get(aa);
final List<SnmpValue> values = new ArrayList<SnmpValue>();
for (final SnmpObjId oid : oids) {
values.add(container.findNextValueForOid(oid));
}
return values.toArray(EMPTY_SNMP_VALUE_ARRAY);
}
@Override
public SnmpValue[] getBulk(final SnmpAgentConfig agentConfig, final SnmpObjId[] oids) {
return getNext(agentConfig, oids);
}
@Override
public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, final InetAddress address, final int snmpTrapPort) throws IOException {
LogUtils.warnf(this, "Can't register for traps. No network in the MockSnmpStrategy!");
}
@Override
public void registerForTraps(final TrapNotificationListener listener, final TrapProcessorFactory processorFactory, final int snmpTrapPort) throws IOException {
LogUtils.warnf(this, "Can't register for traps. No network in the MockSnmpStrategy!");
}
@Override
public void registerForTraps(TrapNotificationListener listener, TrapProcessorFactory processorFactory, InetAddress address, int snmpTrapPort, List<SnmpV3User> snmpv3Users) throws IOException {
LogUtils.warnf(this, "Can't register for traps. No network in the MockSnmpStrategy!");
}
@Override
public void unregisterForTraps(final TrapNotificationListener listener, final InetAddress address, final int snmpTrapPort) throws IOException {
}
@Override
public void unregisterForTraps(final TrapNotificationListener listener, final int snmpTrapPort) throws IOException {
}
@Override
public SnmpValueFactory getValueFactory() {
return new MockSnmpValueFactory();
}
@Override
public SnmpV1TrapBuilder getV1TrapBuilder() {
throw new UnsupportedOperationException("Not yet implemented!");
// return new NullSnmpV1TrapBuilder();
}
@Override
public SnmpTrapBuilder getV2TrapBuilder() {
throw new UnsupportedOperationException("Not yet implemented!");
// return new NullSnmpTrapBuilder();
}
@Override
public SnmpV3TrapBuilder getV3TrapBuilder() {
throw new UnsupportedOperationException("Not yet implemented!");
// return new NullSnmpV3TrapBuilder();
}
@Override
public SnmpV2TrapBuilder getV2InformBuilder() {
throw new UnsupportedOperationException("Not yet implemented!");
// return new NullSnmpV2TrapBuilder();
}
@Override
public SnmpV3TrapBuilder getV3InformBuilder() {
throw new UnsupportedOperationException("Not yet implemented!");
// return new NullSnmpV3TrapBuilder();
}
@Override
public byte[] getLocalEngineID() {
// lovingly stolen from SNMP4J
final byte[] engineID = new byte[5];
engineID[0] = (byte) (0x80 | ((s_enterpriseId >> 24) & 0xFF));
engineID[1] = (byte) ((s_enterpriseId >> 16) & 0xFF);
engineID[2] = (byte) ((s_enterpriseId >> 8) & 0xFF);
engineID[3] = (byte) (s_enterpriseId & 0xFF);
byte[] ip = new byte[0];
ip = InetAddressUtils.getLocalHostAddress().getAddress();
if (ip.length == 4) {
// IPv4
engineID[4] = 1;
} else if (ip.length == 16) {
// IPv6
engineID[4] = 2;
} else {
// Text
engineID[4] = 4;
}
return ArrayUtils.addAll(engineID, ip);
}
public static void setDataForAddress(final SnmpAgentAddress agentAddress, final Resource resource) throws IOException {
m_loaders.put(agentAddress, new PropertyOidContainer(resource));
}
public static void removeHost(final SnmpAgentAddress agentAddr) {
m_loaders.remove(agentAddr);
}
public static void resetData() {
m_loaders.clear();
}
}