X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fimpl%2FNetconfServerSessionNegotiator.java;h=0dd79e2723c32034df26c79583c83bdbe117a793;hp=01ac018b3eadc3ee85d6ffd7a5e12fb8cbaf2daa;hb=304dec89fd7a13b42e821ca51b08bca93d7dc540;hpb=ac65af650d550ae56dd02b660e1c5eef24b78740 diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiator.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiator.java index 01ac018b3e..0dd79e2723 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiator.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiator.java @@ -9,90 +9,99 @@ package org.opendaylight.controller.netconf.impl; import com.google.common.base.Optional; -import com.google.common.base.Preconditions; import io.netty.channel.Channel; +import io.netty.channel.local.LocalAddress; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; -import org.opendaylight.controller.netconf.api.NetconfMessage; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.AbstractMap; +import java.util.Map; +import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfServerSessionPreferences; -import org.opendaylight.controller.netconf.util.AbstractNetconfSessionNegotiator; -import org.opendaylight.protocol.framework.SessionListener; +import org.opendaylight.controller.netconf.nettyutil.AbstractNetconfSessionNegotiator; +import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessage; +import org.opendaylight.controller.netconf.util.messages.NetconfHelloMessageAdditionalHeader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +public class NetconfServerSessionNegotiator + extends + AbstractNetconfSessionNegotiator { -public class NetconfServerSessionNegotiator extends - AbstractNetconfSessionNegotiator { + private static final Logger LOG = LoggerFactory.getLogger(NetconfServerSessionNegotiator.class); - static final Logger logger = LoggerFactory.getLogger(NetconfServerSessionNegotiator.class); + private static final String UNKNOWN = "unknown"; - private static final AdditionalHeader DEFAULT_HEADER = new AdditionalHeader(); + protected NetconfServerSessionNegotiator( + NetconfServerSessionPreferences sessionPreferences, + Promise promise, Channel channel, + Timer timer, NetconfServerSessionListener sessionListener, + long connectionTimeoutMillis) { + super(sessionPreferences, promise, channel, timer, sessionListener, + connectionTimeoutMillis); + } - protected NetconfServerSessionNegotiator(NetconfServerSessionPreferences sessionPreferences, - Promise promise, Channel channel, Timer timer, SessionListener sessionListener) { - super(sessionPreferences, promise, channel, timer, sessionListener); + @Override + protected void handleMessage(NetconfHelloMessage netconfMessage) + throws NetconfDocumentedException { + NetconfServerSession session = getSessionForHelloMessage(netconfMessage); + replaceHelloMessageInboundHandler(session); + // Negotiation successful after all non hello messages were processed + negotiationSuccessful(session); } @Override - protected NetconfServerSession getSession(SessionListener sessionListener, Channel channel, NetconfMessage message) { - Optional additionalHeader = message.getAdditionalHeader(); + protected NetconfServerSession getSession( + NetconfServerSessionListener sessionListener, Channel channel, + NetconfHelloMessage message) { + Optional additionalHeader = message + .getAdditionalHeader(); - AdditionalHeader parsedHeader; + NetconfHelloMessageAdditionalHeader parsedHeader; if (additionalHeader.isPresent()) { - parsedHeader = new AdditionalHeader(additionalHeader.get()); + parsedHeader = additionalHeader.get(); } else { - parsedHeader = DEFAULT_HEADER; + + parsedHeader = new NetconfHelloMessageAdditionalHeader(UNKNOWN, + getHostName(channel.localAddress()).getValue(), + getHostName(channel.localAddress()).getKey(), "tcp", + "client"); + } - logger.debug("Additional header from hello parsed as {} from {}", parsedHeader, additionalHeader); - return new NetconfServerSession(sessionListener, channel, sessionPreferences.getSessionId(), parsedHeader); + LOG.debug("Additional header from hello parsed as {} from {}", + parsedHeader, additionalHeader); + + return new NetconfServerSession(sessionListener, channel, + getSessionPreferences().getSessionId(), parsedHeader); } - static class AdditionalHeader { - - private static final Pattern pattern = Pattern - .compile("\\[(?[^;]+);(?
[0-9\\.]+)[:/](?[0-9]+);(?[a-z]+)[^\\]]+\\]"); - private final String username; - private final String address; - private final String transport; - - public AdditionalHeader(String addHeaderAsString) { - addHeaderAsString = addHeaderAsString.trim(); - Matcher matcher = pattern.matcher(addHeaderAsString); - Preconditions.checkArgument(matcher.matches(), "Additional header in wrong format %s, expected %s", - addHeaderAsString, pattern); - this.username = matcher.group("username"); - this.address = matcher.group("address"); - this.transport = matcher.group("transport"); - } + /** + * @param socketAddress + * type of socket address LocalAddress, or + * InetSocketAddress, for others returns unknown + * @return Map two values - port and host of socket address + */ + protected static Map.Entry getHostName( + SocketAddress socketAddress) { - private AdditionalHeader() { - this.username = this.address = "unknown"; - this.transport = "ssh"; - } + if (socketAddress instanceof InetSocketAddress) { - String getUsername() { - return username; - } + InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress; - String getAddress() { - return address; - } + return new AbstractMap.SimpleImmutableEntry<>( + Integer.toString(inetSocketAddress.getPort()), + inetSocketAddress.getHostString()); - String getTransport() { - return transport; - } + } else if (socketAddress instanceof LocalAddress) { + + return new AbstractMap.SimpleImmutableEntry<>(UNKNOWN, + ((LocalAddress) socketAddress).id()); - @Override - public String toString() { - final StringBuffer sb = new StringBuffer("AdditionalHeader{"); - sb.append("username='").append(username).append('\''); - sb.append(", address='").append(address).append('\''); - sb.append(", transport='").append(transport).append('\''); - sb.append('}'); - return sb.toString(); } + return new AbstractMap.SimpleImmutableEntry<>(UNKNOWN, UNKNOWN); + } + }