Fix SNMP traps processing
This commit is contained in:
parent
8706bd9c3c
commit
cd46ebe53a
@ -37,7 +37,7 @@ import org.snmp4j.mp.MPv3;
|
||||
import org.snmp4j.security.SecurityModels;
|
||||
import org.snmp4j.security.SecurityProtocols;
|
||||
import org.snmp4j.security.USM;
|
||||
import org.snmp4j.smi.Address;
|
||||
import org.snmp4j.smi.IpAddress;
|
||||
import org.snmp4j.smi.OctetString;
|
||||
import org.snmp4j.smi.TcpAddress;
|
||||
import org.snmp4j.smi.UdpAddress;
|
||||
@ -327,24 +327,31 @@ public class SnmpTransportService implements TbTransportService, CommandResponde
|
||||
}
|
||||
|
||||
/*
|
||||
* SNMP notifications handler
|
||||
*
|
||||
* TODO: add check for host uniqueness when saving device (for backward compatibility - only for the ones using from-device RPC requests)
|
||||
*
|
||||
* NOTE: SNMP TRAPs support won't work properly when there is more than one SNMP transport,
|
||||
* due to load-balancing of requests from devices: session might not be on this instance
|
||||
* */
|
||||
* SNMP notifications handler
|
||||
*
|
||||
* TODO: add check for host uniqueness when saving device (for backward compatibility - only for the ones using from-device RPC requests)
|
||||
*
|
||||
* NOTE: SNMP TRAPs support won't work properly when there is more than one SNMP transport,
|
||||
* due to load-balancing of requests from devices: session might not be on this instance
|
||||
* */
|
||||
@Override
|
||||
public void processPdu(CommandResponderEvent event) {
|
||||
Address sourceAddress = event.getPeerAddress();
|
||||
DeviceSessionContext sessionContext = transportContext.getSessions().stream()
|
||||
.filter(session -> session.getTarget().getAddress().equals(sourceAddress))
|
||||
.findFirst().orElse(null);
|
||||
if (sessionContext == null) {
|
||||
log.warn("SNMP TRAP processing failed: couldn't find device session for address {}", sourceAddress);
|
||||
IpAddress sourceAddress = (IpAddress) event.getPeerAddress();
|
||||
List<DeviceSessionContext> sessions = transportContext.getSessions().stream()
|
||||
.filter(session -> ((IpAddress) session.getTarget().getAddress()).getInetAddress().equals(sourceAddress.getInetAddress()))
|
||||
.collect(Collectors.toList());
|
||||
if (sessions.isEmpty()) {
|
||||
log.warn("Couldn't find device session for SNMP TRAP for address {}", sourceAddress);
|
||||
return;
|
||||
} else if (sessions.size() > 1) {
|
||||
for (DeviceSessionContext sessionContext : sessions) {
|
||||
transportService.errorEvent(sessionContext.getTenantId(), sessionContext.getDeviceId(), SnmpCommunicationSpec.TO_SERVER_RPC_REQUEST.getLabel(),
|
||||
new IllegalStateException("Found multiple devices for host " + sourceAddress.getInetAddress().getHostAddress()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
DeviceSessionContext sessionContext = sessions.get(0);
|
||||
try {
|
||||
processIncomingTrap(sessionContext, event);
|
||||
} catch (Throwable e) {
|
||||
@ -356,11 +363,11 @@ public class SnmpTransportService implements TbTransportService, CommandResponde
|
||||
private void processIncomingTrap(DeviceSessionContext sessionContext, CommandResponderEvent event) {
|
||||
PDU pdu = event.getPDU();
|
||||
if (pdu == null) {
|
||||
log.warn("Got empty trap from device {}", sessionContext.getDeviceId());
|
||||
log.warn("[{}] Received empty SNMP trap", sessionContext.getDeviceId());
|
||||
throw new IllegalArgumentException("Received TRAP with no data");
|
||||
}
|
||||
|
||||
log.debug("Processing SNMP trap from device {} (PDU: {}}", sessionContext.getDeviceId(), pdu);
|
||||
log.debug("[{}] Processing SNMP trap: {}", sessionContext.getDeviceId(), pdu);
|
||||
SnmpCommunicationConfig communicationConfig = sessionContext.getProfileTransportConfiguration().getCommunicationConfigs().stream()
|
||||
.filter(config -> config.getSpec() == SnmpCommunicationSpec.TO_SERVER_RPC_REQUEST).findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("No config found for to-server RPC requests"));
|
||||
|
||||
@ -805,7 +805,7 @@ public class DefaultTransportService extends TransportActivityManager implements
|
||||
.setEntityIdLSB(deviceId.getId().getLeastSignificantBits())
|
||||
.setServiceId(serviceInfoProvider.getServiceId())
|
||||
.setMethod(method)
|
||||
.setError(ExceptionUtils.getStackTrace(error)))
|
||||
.setError(ExceptionUtils.getRootCauseMessage(error)))
|
||||
.build();
|
||||
try {
|
||||
sendToCore(tenantId, deviceId, msg, deviceId.getId(), TransportServiceCallback.EMPTY);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user