/** * Parse additional header from a formatted string */ public static NetconfHelloMessageAdditionalHeader fromString(String additionalHeader) { String additionalHeaderTrimmed = additionalHeader.trim(); Matcher matcher = PATTERN.matcher(additionalHeaderTrimmed); Matcher matcher2 = CUSTOM_HEADER_PATTERN.matcher(additionalHeaderTrimmed); Preconditions.checkArgument(matcher.matches(), "Additional header in wrong format %s, expected %s", additionalHeaderTrimmed, PATTERN); String username = matcher.group("username"); String address = matcher.group("address"); String port = matcher.group("port"); String transport = matcher.group("transport"); String sessionIdentifier = "client"; if (matcher2.matches()) { sessionIdentifier = matcher2.group("sessionIdentifier"); } return new NetconfHelloMessageAdditionalHeader(username, address, port, transport, sessionIdentifier); }
@Override @VisibleForTesting public void encode(ChannelHandlerContext ctx, NetconfMessage msg, ByteBuf out) throws IOException, TransformerException { Preconditions.checkState(msg instanceof NetconfHelloMessage, "Netconf message of type %s expected, was %s", NetconfHelloMessage.class, msg.getClass()); Optional<NetconfHelloMessageAdditionalHeader> headerOptional = ((NetconfHelloMessage) msg) .getAdditionalHeader(); // If additional header present, serialize it along with netconf hello message if (headerOptional.isPresent()) { out.writeBytes(headerOptional.get().toFormattedString().getBytes(Charsets.UTF_8)); } super.encode(ctx, msg, out); } }
@Override public Session toManagementSession() { SessionBuilder builder = new SessionBuilder(); builder.setSessionId(getSessionId()); builder.setSourceHost(new Host(new DomainName(header.getAddress()))); Preconditions.checkState(DateAndTime.PATTERN_CONSTANTS.size() == 1); String formattedDateTime = formatDateTime(loginTime); Matcher matcher = dateTimePattern.matcher(formattedDateTime); Preconditions.checkState(matcher.matches(), "Formatted datetime %s does not match pattern %s", formattedDateTime, dateTimePattern); builder.setLoginTime(new DateAndTime(formattedDateTime)); builder.setInBadRpcs(new ZeroBasedCounter32(inRpcFail)); builder.setInRpcs(new ZeroBasedCounter32(inRpcSuccess)); builder.setOutRpcErrors(new ZeroBasedCounter32(outRpcError)); builder.setUsername(header.getUserName()); builder.setTransport(getTransportForString(header.getTransport())); builder.setOutNotifications(new ZeroBasedCounter32(0L)); builder.setKey(new SessionKey(getSessionId())); Session1Builder builder1 = new Session1Builder(); builder1.setSessionIdentifier(header.getSessionIdentifier()); builder.addAugmentation(Session1.class, builder1.build()); return builder.build(); }
private static NetconfMessage getNetconfMessage(final String additionalHeader, final Document doc) throws NetconfDocumentedException { NetconfMessage msg = new NetconfMessage(doc); if(NetconfHelloMessage.isHelloMessage(msg)) { if (additionalHeader != null) { return new NetconfHelloMessage(doc, NetconfHelloMessageAdditionalHeader.fromString(additionalHeader)); } else { return new NetconfHelloMessage(doc); } } return msg; }
@Override protected NetconfServerSession getSession( NetconfServerSessionListener sessionListener, Channel channel, NetconfHelloMessage message) { Optional<NetconfHelloMessageAdditionalHeader> additionalHeader = message .getAdditionalHeader(); NetconfHelloMessageAdditionalHeader parsedHeader; if (additionalHeader.isPresent()) { parsedHeader = additionalHeader.get(); } else { parsedHeader = new NetconfHelloMessageAdditionalHeader(UNKNOWN, getHostName(channel.localAddress()).getValue(), getHostName(channel.localAddress()).getKey(), "tcp", "client"); } LOG.debug("Additional header from hello parsed as {} from {}", parsedHeader, additionalHeader); return new NetconfServerSession(sessionListener, channel, getSessionPreferences().getSessionId(), parsedHeader); }