All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snmp4j.transport.DefaultSshTransportMapping Maven / Gradle / Ivy

/*_############################################################################
  _## 
  _##  SNMP4J 2 - DefaultSshTransportMapping.java  
  _## 
  _##  Copyright (C) 2003-2016  Frank Fock and Jochen Katz (SNMP4J.org)
  _##  
  _##  Licensed under the Apache License, Version 2.0 (the "License");
  _##  you may not use this file except in compliance with the License.
  _##  You may obtain a copy of the License at
  _##  
  _##      http://www.apache.org/licenses/LICENSE-2.0
  _##  
  _##  Unless required by applicable law or agreed to in writing, software
  _##  distributed under the License is distributed on an "AS IS" BASIS,
  _##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  _##  See the License for the specific language governing permissions and
  _##  limitations under the License.
  _##  
  _##########################################################################*/
package org.snmp4j.transport;

import org.snmp4j.TransportStateReference;
import org.snmp4j.event.CounterEvent;
import org.snmp4j.log.LogAdapter;
import org.snmp4j.log.LogFactory;
import org.snmp4j.mp.CounterSupport;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.SshAddress;
import org.snmp4j.transport.ssh.SshSession;
import org.snmp4j.transport.ssh.SshTransportAdapter;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * The DefaultSshTransportMapping implements a TCP transport
 * mapping with TLS according to RFC 5592 (named SSHTM therein).
 *
 * @author Frank Fock
 * @version 2.0
 * @since 2.0
 */
public class DefaultSshTransportMapping extends AbstractTransportMapping {

  private static final LogAdapter logger =
      LogFactory.getLogger(DefaultSshTransportMapping.class);

  private final Map sessions = new HashMap();
  private SshTransportAdapter transportAdapter;
  private CounterSupport counterSupport;

  public DefaultSshTransportMapping(SshTransportAdapter transportAdapter) {
    this.transportAdapter = transportAdapter;
    this.counterSupport = CounterSupport.getInstance();
  }

  @Override
  public Class getSupportedAddressClass() {
    return SshAddress.class;
  }

  @Override
  public SshAddress getListenAddress() {
    return null;  //To change body of implemented methods use File | Settings | File Templates.
  }

  @Override
  public void sendMessage(SshAddress address, byte[] message,
                          TransportStateReference tmStateReference) throws IOException {
    SessionID sessionKey = new SessionID(tmStateReference.getSecurityName(), address);
    SshSession session = null;
    synchronized (sessions) {
      session = sessions.get(sessionKey);
    }
    if (session == null) {
      if (tmStateReference.isSameSecurity()) {
        logger.warn("Cannot (re)open session because tmStateReference requires 'sameSecurity'");
        throw new IOException("Session '"+address+"' for '"+tmStateReference.getSecurityName()+
                              "' closed/unavailable");
      }
      session =  openSession(address, tmStateReference, maxInboundMessageSize);
    }
  }

  protected SshSession openSession(SshAddress address,
                                   TransportStateReference tmStateReference,
                                   int maxMessageSize) {
    // RFC 5592 §5.3:
    // 1. Increment snmpSshtmSessionOpens counter.
    fireIncrementCounter(new CounterEvent(this, SnmpConstants.snmpSshtmSessionOpens));
    // 2.
    return transportAdapter.openClientSession(tmStateReference, maxMessageSize);
  }

  @Override
  public void close() throws IOException {
    //To change body of implemented methods use File | Settings | File Templates.
  }

  @Override
  public void listen() throws IOException {
    //To change body of implemented methods use File | Settings | File Templates.
  }

  @Override
  public boolean isListening() {
    return false;  //To change body of implemented methods use File | Settings | File Templates.
  }

  protected void fireIncrementCounter(CounterEvent e) {
    counterSupport.fireIncrementCounter(e);
  }

  protected class SessionID {
    private OctetString tmSecurityName;
    private SshAddress address;

    public SessionID(OctetString tmSecurityName, SshAddress address) {
      this.tmSecurityName = tmSecurityName;
      this.address = address;
    }

    @Override
    public String toString() {
      return "DefaultSshTransportMapping.SessionID[" +
          "tmSecurityName=" + tmSecurityName +
          ", address=" + address +
          ']';
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;

      SessionID sessionID = (SessionID) o;

      if (address != null ? !address.equals(sessionID.address) : sessionID.address != null) return false;
      return !(tmSecurityName != null ?
          !tmSecurityName.equals(sessionID.tmSecurityName) :
          sessionID.tmSecurityName != null);
    }

    @Override
    public int hashCode() {
      int result = tmSecurityName != null ? tmSecurityName.hashCode() : 0;
      result = 31 * result + (address != null ? address.hashCode() : 0);
      return result;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy