Return-Path: X-Original-To: apmail-camel-commits-archive@www.apache.org Delivered-To: apmail-camel-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D97C39FEC for ; Mon, 30 Jan 2012 11:13:17 +0000 (UTC) Received: (qmail 71762 invoked by uid 500); 30 Jan 2012 11:13:17 -0000 Delivered-To: apmail-camel-commits-archive@camel.apache.org Received: (qmail 71716 invoked by uid 500); 30 Jan 2012 11:13:17 -0000 Mailing-List: contact commits-help@camel.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@camel.apache.org Delivered-To: mailing list commits@camel.apache.org Received: (qmail 71709 invoked by uid 99); 30 Jan 2012 11:13:17 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 30 Jan 2012 11:13:17 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 30 Jan 2012 11:13:13 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 2881023888E4 for ; Mon, 30 Jan 2012 11:12:53 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1237603 [1/2] - in /camel/trunk: apache-camel/ apache-camel/src/main/descriptors/ components/ components/camel-routebox/ components/camel-routebox/src/test/resources/ components/camel-ssh/ components/camel-ssh/src/ components/camel-ssh/src... Date: Mon, 30 Jan 2012 11:12:51 -0000 To: commits@camel.apache.org From: davsclaus@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120130111253.2881023888E4@eris.apache.org> Author: davsclaus Date: Mon Jan 30 11:12:49 2012 New Revision: 1237603 URL: http://svn.apache.org/viewvc?rev=1237603&view=rev Log: CAMEL-4713: New camel-ssh component. Thanks to Scott and Jason for their contribution. Added: camel/trunk/components/camel-ssh/ (with props) camel/trunk/components/camel-ssh/pom.xml (with props) camel/trunk/components/camel-ssh/src/ camel/trunk/components/camel-ssh/src/main/ camel/trunk/components/camel-ssh/src/main/java/ camel/trunk/components/camel-ssh/src/main/java/org/ camel/trunk/components/camel-ssh/src/main/java/org/apache/ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java (with props) camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java (with props) camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java (with props) camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java (with props) camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java (with props) camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html (with props) camel/trunk/components/camel-ssh/src/main/resources/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/component/ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/component/ssh camel/trunk/components/camel-ssh/src/test/ camel/trunk/components/camel-ssh/src/test/java/ camel/trunk/components/camel-ssh/src/test/java/org/ camel/trunk/components/camel-ssh/src/test/java/org/apache/ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java (with props) camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java (with props) camel/trunk/components/camel-ssh/src/test/resources/ camel/trunk/components/camel-ssh/src/test/resources/dsaprivkey.pem camel/trunk/components/camel-ssh/src/test/resources/hostkey.pem camel/trunk/components/camel-ssh/src/test/resources/log4j.properties (with props) camel/trunk/examples/camel-example-ssh/ (with props) camel/trunk/examples/camel-example-ssh/README.txt (with props) camel/trunk/examples/camel-example-ssh/pom.xml (with props) camel/trunk/examples/camel-example-ssh/src/ camel/trunk/examples/camel-example-ssh/src/main/ camel/trunk/examples/camel-example-ssh/src/main/resources/ camel/trunk/examples/camel-example-ssh/src/main/resources/META-INF/ camel/trunk/examples/camel-example-ssh/src/main/resources/META-INF/LICENSE.txt (with props) camel/trunk/examples/camel-example-ssh/src/main/resources/META-INF/NOTICE.txt (with props) camel/trunk/examples/camel-example-ssh/src/main/resources/META-INF/spring/ camel/trunk/examples/camel-example-ssh/src/main/resources/META-INF/spring/camelContext.xml (with props) camel/trunk/examples/camel-example-ssh/src/main/resources/features.xml (with props) camel/trunk/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSshTest.java - copied, changed from r1237572, camel/trunk/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelSqlTest.java Modified: camel/trunk/apache-camel/pom.xml camel/trunk/apache-camel/src/main/descriptors/common-bin.xml camel/trunk/components/camel-routebox/ (props changed) camel/trunk/components/camel-routebox/src/test/resources/log4j.properties camel/trunk/components/pom.xml camel/trunk/examples/pom.xml camel/trunk/parent/pom.xml camel/trunk/platforms/karaf/features/src/main/resources/features.xml Modified: camel/trunk/apache-camel/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/pom.xml?rev=1237603&r1=1237602&r2=1237603&view=diff ============================================================================== --- camel/trunk/apache-camel/pom.xml (original) +++ camel/trunk/apache-camel/pom.xml Mon Jan 30 11:12:49 2012 @@ -439,6 +439,10 @@ org.apache.camel + camel-ssh + + + org.apache.camel camel-stax Modified: camel/trunk/apache-camel/src/main/descriptors/common-bin.xml URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/src/main/descriptors/common-bin.xml?rev=1237603&r1=1237602&r2=1237603&view=diff ============================================================================== --- camel/trunk/apache-camel/src/main/descriptors/common-bin.xml (original) +++ camel/trunk/apache-camel/src/main/descriptors/common-bin.xml Mon Jan 30 11:12:49 2012 @@ -128,6 +128,7 @@ org.apache.camel:camel-spring-security org.apache.camel:camel-spring-ws org.apache.camel:camel-sql + org.apache.camel:camel-ssh org.apache.camel:camel-stax org.apache.camel:camel-stream org.apache.camel:camel-stringtemplate Propchange: camel/trunk/components/camel-routebox/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Mon Jan 30 11:12:49 2012 @@ -14,3 +14,4 @@ eclipse-classes *.ipr *.iml *.iws +*.idea Modified: camel/trunk/components/camel-routebox/src/test/resources/log4j.properties URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-routebox/src/test/resources/log4j.properties?rev=1237603&r1=1237602&r2=1237603&view=diff ============================================================================== --- camel/trunk/components/camel-routebox/src/test/resources/log4j.properties (original) +++ camel/trunk/components/camel-routebox/src/test/resources/log4j.properties Mon Jan 30 11:12:49 2012 @@ -1,20 +1,35 @@ +## --------------------------------------------------------------------------- +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You 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. +## --------------------------------------------------------------------------- # -# The logging properties used for eclipse testing, We want to see debug output on the console. +# The logging properties used during tests.. # -log4j.rootLogger=INFO, file +log4j.rootLogger=INFO, out -log4j.logger.org.springframework=WARN -#log4j.logger.org.apache.camel=DEBUG +#log4j.logger.org.apache.camel.component.routebox=DEBUG # CONSOLE appender not used by default -log4j.appender.out=org.apache.log4j.ConsoleAppender -log4j.appender.out.layout=org.apache.log4j.PatternLayout -log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n -#log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n # File appender -log4j.appender.file=org.apache.log4j.FileAppender -log4j.appender.file.layout=org.apache.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=%d %-5p %c{1} - %m %n -log4j.appender.file.file=target/camel-routebox.log +log4j.appender.out=org.apache.log4j.FileAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n +log4j.appender.out.file=target/camel-routebox-test.log +log4j.appender.out.append=true Propchange: camel/trunk/components/camel-ssh/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Mon Jan 30 11:12:49 2012 @@ -0,0 +1,17 @@ +.pmd +.checkstyle +.ruleset +target +.settings +.classpath +.project +.wtpmodules +prj.el +.jdee_classpath +.jdee_sources +velocity.log +eclipse-classes +*.ipr +*.iml +*.iws +*.idea Added: camel/trunk/components/camel-ssh/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/pom.xml?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/pom.xml (added) +++ camel/trunk/components/camel-ssh/pom.xml Mon Jan 30 11:12:49 2012 @@ -0,0 +1,88 @@ + + + + + 4.0.0 + + + org.apache.camel + camel-parent + 2.10-SNAPSHOT + ../../parent + + + camel-ssh + bundle + Camel :: SSH + Camel SSH support + + + org.apache.camel.component.ssh.* + + + + + org.apache.camel + camel-core + + + org.apache.mina + mina-core + ${mina2-version} + + + org.apache.sshd + sshd-core + ${sshd-version} + + + + + org.apache.camel + camel-test + test + + + + org.bouncycastle + bcpg-jdk16 + ${bouncycastle-version} + test + + + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + test + + + log4j + log4j + test + + + + Propchange: camel/trunk/components/camel-ssh/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/pom.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: camel/trunk/components/camel-ssh/pom.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Added: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java (added) +++ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,121 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import java.net.URI; +import java.util.Map; + +import org.apache.camel.Endpoint; +import org.apache.camel.impl.DefaultComponent; +import org.apache.sshd.common.KeyPairProvider; + +/** + * Represents the component that manages {@link SshEndpoint}. + */ +public class SshComponent extends DefaultComponent { + private SshConfiguration configuration; + + @Override + protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { + SshConfiguration newConfig; + + if (configuration == null) { + newConfig = new SshConfiguration(new URI(uri)); + } else { + newConfig = configuration.copy(); + } + + SshEndpoint endpoint = new SshEndpoint(uri, this, newConfig); + setProperties(endpoint.getConfiguration(), parameters); + return endpoint; + } + + public SshConfiguration getConfiguration() { + if (configuration == null) { + configuration = new SshConfiguration(); + } + return configuration; + } + + public void setConfiguration(SshConfiguration configuration) { + this.configuration = configuration; + } + + public String getHost() { + return getConfiguration().getHost(); + } + + public void setHost(String host) { + getConfiguration().setHost(host); + } + + public int getPort() { + return getConfiguration().getPort(); + } + + public void setPort(int port) { + getConfiguration().setPort(port); + } + + public String getUsername() { + return getConfiguration().getUsername(); + } + + public void setUsername(String username) { + getConfiguration().setUsername(username); + } + + public String getPassword() { + return getConfiguration().getPassword(); + } + + public void setPassword(String password) { + getConfiguration().setPassword(password); + } + + public String getPollCommand() { + return getConfiguration().getPollCommand(); + } + + public void setPollCommand(String pollCommand) { + getConfiguration().setPollCommand(pollCommand); + } + + public KeyPairProvider getKeyPairProvider() { + return getConfiguration().getKeyPairProvider(); + } + + public void setKeyPairProvider(KeyPairProvider keyPairProvider) { + getConfiguration().setKeyPairProvider(keyPairProvider); + } + + public String getKeyType() { + return getConfiguration().getKeyType(); + } + + public void setKeyType(String keyType) { + getConfiguration().setKeyType(keyType); + } + + public long getTimeout() { + return getConfiguration().getTimeout(); + } + + public void setTimeout(long timeout) { + getConfiguration().setTimeout(timeout); + } +} Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshComponent.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java (added) +++ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,189 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import java.net.URI; + +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.util.ObjectHelper; +import org.apache.sshd.common.KeyPairProvider; + +public class SshConfiguration implements Cloneable { + public static final int DEFAULT_SSH_PORT = 22; + + private String username; + private String host; + private int port = DEFAULT_SSH_PORT; + private String password; + private String pollCommand; + private KeyPairProvider keyPairProvider; + private String keyType; + private long timeout = 30000; + + public SshConfiguration() { + } + + public SshConfiguration(URI uri) { + configure(uri); + } + + public void configure(URI uri) { + // UserInfo can contain both username and password as: user:pwd@sshserver + // see: http://en.wikipedia.org/wiki/URI_scheme + String username = uri.getUserInfo(); + String pw = null; + if (username != null && username.contains(":")) { + pw = ObjectHelper.after(username, ":"); + username = ObjectHelper.before(username, ":"); + } + if (username != null) { + setUsername(username); + } + if (pw != null) { + setPassword(pw); + } + + setHost(uri.getHost()); + + // URI.getPort returns -1 if port not defined, else use default port + int uriPort = uri.getPort(); + if (uriPort != -1) { + setPort(uriPort); + } + } + + public SshConfiguration copy() { + try { + return (SshConfiguration) clone(); + } catch (CloneNotSupportedException e) { + throw new RuntimeCamelException(e); + } + } + + public String getUsername() { + return username; + } + + /** + * Sets the username to use in logging into the remote SSH server. + * + * @param username String representing login username. + */ + public void setUsername(String username) { + this.username = username; + } + + public String getHost() { + return host; + } + + /** + * Sets the hostname of the remote SSH server. + * + * @param host String representing hostname of SSH server. + */ + public void setHost(String host) { + this.host = host; + } + + public int getPort() { + return port; + } + + /** + * Sets the port number for the remote SSH server. + * + * @param port int representing port number on remote host. Defaults to 22. + */ + public void setPort(int port) { + this.port = port; + } + + public String getPassword() { + return password; + } + + /** + * Sets the password to use in connecting to remote SSH server. + * Requires keyPairProvider to be set to null. + * + * @param password String representing password for username at remote host. + */ + public void setPassword(String password) { + this.password = password; + } + + public String getPollCommand() { + return pollCommand; + } + + /** + * Sets the command string to send to the remote SSH server during every poll cycle. + * Only works with camel-ssh component being used as a consumer, i.e. from("ssh://...") + * + * @param pollCommand String representing the command to send. + */ + public void setPollCommand(String pollCommand) { + this.pollCommand = pollCommand; + } + + public KeyPairProvider getKeyPairProvider() { + return keyPairProvider; + } + + /** + * Sets the KeyPairProvider reference to use when connecting using Certificates to the remote SSH Server. + * + * @param keyPairProvider KeyPairProvider reference to use in authenticating. If set to 'null', + * then will attempt to connect using username/password settings. + * + * @see KeyPairProvider + */ + public void setKeyPairProvider(KeyPairProvider keyPairProvider) { + this.keyPairProvider = keyPairProvider; + } + + public String getKeyType() { + return keyType; + } + + /** + * Sets the key type to pass to the KeyPairProvider as part of authentication. + * KeyPairProvider.loadKey(...) will be passed this value. + * + * @param keyType String defining the type of KeyPair to use for authentication. + * + * @see KeyPairProvider + */ + public void setKeyType(String keyType) { + this.keyType = keyType; + } + + public long getTimeout() { + return timeout; + } + + /** + * Sets the timeout in milliseconds to wait in establishing the remote SSH server connection. + * Defaults to 30000 milliseconds. + * + * @param timeout long millisconeds to wait. + */ + public void setTimeout(long timeout) { + this.timeout = timeout; + } +} Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConfiguration.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java (added) +++ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.impl.ScheduledPollConsumer; + +public class SshConsumer extends ScheduledPollConsumer { + private final SshEndpoint endpoint; + + public SshConsumer(SshEndpoint endpoint, Processor processor) { + super(endpoint, processor); + this.endpoint = endpoint; + } + + @Override + protected int poll() throws Exception { + String command = endpoint.getPollCommand(); + byte[] result = endpoint.sendExecCommand(command); + + Exchange exchange = endpoint.createExchange(); + exchange.getIn().setBody(result); + + try { + // send message to next processor in the route + getProcessor().process(exchange); + return 1; // number of messages polled + } finally { + // log exception if an exception occurred and was not handled + if (exchange.getException() != null) { + getExceptionHandler().handleException("Error processing exchange", exchange, exchange.getException()); + } + } + } +} Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshConsumer.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java (added) +++ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,227 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.security.KeyPair; + +import org.apache.camel.Consumer; +import org.apache.camel.Processor; +import org.apache.camel.Producer; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.impl.ScheduledPollEndpoint; +import org.apache.sshd.ClientChannel; +import org.apache.sshd.ClientSession; +import org.apache.sshd.SshClient; +import org.apache.sshd.client.future.AuthFuture; +import org.apache.sshd.client.future.ConnectFuture; +import org.apache.sshd.client.future.OpenFuture; +import org.apache.sshd.common.KeyPairProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Represents an SSH endpoint. + */ +public class SshEndpoint extends ScheduledPollEndpoint { + protected final transient Logger log = LoggerFactory.getLogger(getClass()); + + private SshClient client; + private SshConfiguration sshConfiguration; + + public SshEndpoint() { + } + + public SshEndpoint(String uri, SshComponent component) { + super(uri, component); + } + + public SshEndpoint(String uri, SshComponent component, SshConfiguration configuration) { + super(uri, component); + this.sshConfiguration = configuration; + } + + @Override + public Producer createProducer() throws Exception { + return new SshProducer(this); + } + + @Override + public Consumer createConsumer(Processor processor) throws Exception { + SshConsumer consumer = new SshConsumer(this, processor); + configureConsumer(consumer); + return consumer; + } + + @Override + public boolean isSingleton() { + // SshClient is not thread-safe to be shared + return false; + } + + public byte[] sendExecCommand(String command) throws Exception { + byte[] result = null; + + if (getConfiguration() == null) { + throw new IllegalStateException("Configuration must be set"); + } + + ConnectFuture connectFuture = client.connect(getHost(), getPort()); + + // Wait getTimeout milliseconds for connect operation to complete + connectFuture.await(getTimeout()); + + if (!connectFuture.isDone() || !connectFuture.isConnected()) { + final String msg = "Failed to connect to " + getHost() + ":" + getPort() + " within timeout " + getTimeout() + "ms"; + log.debug(msg); + throw new RuntimeCamelException(msg); + } + + log.debug("Connected to {}:{}", getHost(), getPort()); + + AuthFuture authResult; + ClientSession session = connectFuture.getSession(); + + final KeyPairProvider keyPairProvider = getKeyPairProvider(); + if (keyPairProvider != null) { + log.debug("Attempting to authenticate username '{}' using Key...", getUsername()); + KeyPair pair = keyPairProvider.loadKey(getKeyType()); + authResult = session.authPublicKey(getUsername(), pair); + } else { + log.debug("Attempting to authenticate username '{}' using Password...", getUsername()); + authResult = session.authPassword(getUsername(), getPassword()); + } + + authResult.await(getTimeout()); + + if (!authResult.isDone() || authResult.isFailure()) { + log.debug("Failed to authenticate"); + throw new RuntimeCamelException("Failed to authenticate username " + getUsername()); + } + + ClientChannel channel = session.createChannel(ClientChannel.CHANNEL_EXEC, command); + + ByteArrayInputStream in = new ByteArrayInputStream(new byte[]{0}); + channel.setIn(in); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + channel.setOut(out); + + ByteArrayOutputStream err = new ByteArrayOutputStream(); + channel.setErr(err); + + OpenFuture openFuture = channel.open(); + openFuture.await(getTimeout()); + if (openFuture.isOpened()) { + channel.waitFor(ClientChannel.CLOSED, 0); + result = out.toByteArray(); + } + + return result; + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + + client = SshClient.setUpDefaultClient(); + client.start(); + } + + @Override + protected void doStop() throws Exception { + if (client != null) { + client.stop(); + client = null; + } + + super.doStop(); + } + + public SshConfiguration getConfiguration() { + return sshConfiguration; + } + + public void setConfiguration(SshConfiguration configuration) { + this.sshConfiguration = configuration; + } + + public String getHost() { + return getConfiguration().getHost(); + } + + public void setHost(String host) { + getConfiguration().setHost(host); + } + + public int getPort() { + return getConfiguration().getPort(); + } + + public void setPort(int port) { + getConfiguration().setPort(port); + } + + public String getUsername() { + return getConfiguration().getUsername(); + } + + public void setUsername(String username) { + getConfiguration().setUsername(username); + } + + public String getPassword() { + return getConfiguration().getPassword(); + } + + public void setPassword(String password) { + getConfiguration().setPassword(password); + } + + public String getPollCommand() { + return getConfiguration().getPollCommand(); + } + + public void setPollCommand(String pollCommand) { + getConfiguration().setPollCommand(pollCommand); + } + + public KeyPairProvider getKeyPairProvider() { + return getConfiguration().getKeyPairProvider(); + } + + public void setKeyPairProvider(KeyPairProvider keyPairProvider) { + getConfiguration().setKeyPairProvider(keyPairProvider); + } + + public String getKeyType() { + return getConfiguration().getKeyType(); + } + + public void setKeyType(String keyType) { + getConfiguration().setKeyType(keyType); + } + + public long getTimeout() { + return getConfiguration().getTimeout(); + } + + public void setTimeout(long timeout) { + getConfiguration().setTimeout(timeout); + } +} Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshEndpoint.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java (added) +++ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,48 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.camel.CamelExchangeException; +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.impl.DefaultProducer; + +public class SshProducer extends DefaultProducer { + private SshEndpoint endpoint; + + public SshProducer(SshEndpoint endpoint) { + super(endpoint); + this.endpoint = endpoint; + } + + @Override + public void process(Exchange exchange) throws Exception { + final Message in = exchange.getIn(); + String command = in.getMandatoryBody(String.class); + + try { + byte[] result = endpoint.sendExecCommand(command); + exchange.getOut().setBody(result); + } catch (Exception e) { + throw new CamelExchangeException("Cannot execute command: " + command, exchange, e); + } + + // propagate headers and attachments + exchange.getOut().getHeaders().putAll(in.getHeaders()); + exchange.getOut().setAttachments(in.getAttachments()); + } +} \ No newline at end of file Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/SshProducer.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html (added) +++ camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html Mon Jan 30 11:12:49 2012 @@ -0,0 +1,25 @@ + + + + + + +Defines the SSH Component + + + Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: camel/trunk/components/camel-ssh/src/main/java/org/apache/camel/component/ssh/package.html ------------------------------------------------------------------------------ svn:mime-type = text/html Added: camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/component/ssh URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/component/ssh?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/component/ssh (added) +++ camel/trunk/components/camel-ssh/src/main/resources/META-INF/services/org/apache/camel/component/ssh Mon Jan 30 11:12:49 2012 @@ -0,0 +1,18 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# + +class=org.apache.camel.component.ssh.SshComponent Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.sshd.server.PasswordAuthenticator; +import org.apache.sshd.server.session.ServerSession; + +public class BogusPasswordAuthenticator implements PasswordAuthenticator { + + @Override + public boolean authenticate(String username, String password, ServerSession session) { + return username != null && username.equals(password); + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPasswordAuthenticator.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import java.security.PublicKey; + +import org.apache.sshd.server.PublickeyAuthenticator; +import org.apache.sshd.server.session.ServerSession; + +public class BogusPublickeyAuthenticator implements PublickeyAuthenticator { + + @Override + public boolean authenticate(String username, PublicKey key, ServerSession session) { + return true; + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/BogusPublickeyAuthenticator.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,90 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.apache.sshd.server.Command; +import org.apache.sshd.server.CommandFactory; +import org.apache.sshd.server.Environment; +import org.apache.sshd.server.ExitCallback; + +public class EchoCommandFactory implements CommandFactory { + + @Override + public Command createCommand(String command) { + return new EchoCommand(command); + } + + protected static class EchoCommand implements Command, Runnable { + private String command; + private InputStream in; + private OutputStream out; + private OutputStream err; + private ExitCallback callback; + private Thread thread; + + public EchoCommand(String command) { + this.command = command; + } + + @Override + public void setInputStream(InputStream in) { + this.in = in; + } + + @Override + public void setOutputStream(OutputStream out) { + this.out = out; + } + + @Override + public void setErrorStream(OutputStream err) { + this.err = err; + } + + @Override + public void setExitCallback(ExitCallback callback) { + this.callback = callback; + } + + @Override + public void start(Environment env) throws IOException { + thread = new Thread(this, "EchoCommand"); + thread.start(); + } + + @Override + public void destroy() { + thread.interrupt(); + } + + @Override + public void run() { + try { + out.write(command.getBytes()); + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + callback.onExit(0); + } + } + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/EchoCommandFactory.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +public class SshComponentConsumerTest extends SshComponentTestSupport { + + @Test + public void testPollingConsumer() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived("test\r"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() { + from("ssh://smx:smx@localhost:" + port + "?useFixedDelay=true&delay=5000&pollCommand=test%0D") + .to("mock:result"); + } + }; + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentConsumerTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,81 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +public class SshComponentErrorHandlingTest extends SshComponentTestSupport { + + @Test + public void testRedelivery() throws Exception { + final String msg = "test\n"; + + MockEndpoint mockError = getMockEndpoint("mock:error"); + mockError.expectedMinimumMessageCount(0); + + MockEndpoint mock = getMockEndpoint("mock:success"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived(msg); + mock.expectedHeaderReceived(Exchange.REDELIVERED, true); + + sshd.stop(); + + template.sendBody("direct:redeliver", msg); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() { + errorHandler(deadLetterChannel("mock:error") + .maximumRedeliveries(3) + .redeliveryDelay(0L) // speedup unit test by not waiting between redeliveries + .onRedelivery(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + final Message in = exchange.getIn(); + final int count = in.getHeader(Exchange.REDELIVERY_COUNTER, Integer.class); + final int maxCount = in.getHeader(Exchange.REDELIVERY_MAX_COUNTER, Integer.class); + + log.info("Redelivery count = {}", count); + + // Restart the sshd server before the last redelivery attempt + if (count >= (maxCount - 1)) { + if (sshd != null) { + sshd.start(); + log.info("Restarting SSHD"); + } + } + } + })); + + from("direct:redeliver") + .tracing() + .to("ssh://smx:smx@localhost:" + port) + .to("mock:success"); + } + }; + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentErrorHandlingTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,123 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.sshd.common.KeyPairProvider; +import org.apache.sshd.common.keyprovider.FileKeyPairProvider; +import org.junit.Test; + +public class SshComponentProducerTest extends SshComponentTestSupport { + + @Test + public void testProducer() throws Exception { + final String msg = "test\n"; + + MockEndpoint mock = getMockEndpoint("mock:password"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived(msg); + + template.sendBody("direct:ssh", msg); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testReconnect() throws Exception { + final String msg = "test\n"; + + MockEndpoint mock = getMockEndpoint("mock:password"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived(msg); + + template.sendBody("direct:ssh", msg); + + assertMockEndpointsSatisfied(); + + sshd.stop(); + sshd.start(); + + mock.reset(); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived(msg); + + template.sendBody("direct:ssh", msg); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testRsa() throws Exception { + final String msg = "test\n"; + + MockEndpoint mock = getMockEndpoint("mock:rsa"); + mock.expectedMinimumMessageCount(1); + mock.expectedBodiesReceived(msg); + + template.sendBody("direct:ssh-rsa", msg); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testConnectionTimeout() throws Exception { + final String msg = "test\n"; + + MockEndpoint mock = getMockEndpoint("mock:password"); + mock.expectedMinimumMessageCount(0); + + MockEndpoint mockError = getMockEndpoint("mock:error"); + mockError.expectedMinimumMessageCount(1); + + sshd.stop(); + sshd = null; + + template.sendBody("direct:ssh", msg); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() { + onException(Exception.class) + .handled(true) + .to("mock:error"); + + from("direct:ssh") + .to("ssh://smx:smx@localhost:" + port + "?timeout=3000") + .to("mock:password"); + + SshComponent sshComponent = new SshComponent(); + sshComponent.setHost("localhost"); + sshComponent.setPort(port); + sshComponent.setUsername("smx"); + sshComponent.setKeyPairProvider(new FileKeyPairProvider(new String[]{"src/test/resources/hostkey.pem"})); + sshComponent.setKeyType(KeyPairProvider.SSH_RSA); + + getContext().addComponent("ssh-rsa", sshComponent); + + from("direct:ssh-rsa") + .to("ssh-rsa:test") + .to("mock:rsa"); + } + }; + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentProducerTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import org.apache.camel.test.AvailablePortFinder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.sshd.SshServer; +import org.apache.sshd.common.keyprovider.FileKeyPairProvider; + +public class SshComponentTestSupport extends CamelTestSupport { + protected SshServer sshd; + protected int port; + + @Override + public void setUp() throws Exception { + port = AvailablePortFinder.getNextAvailable(22000); + + sshd = SshServer.setUpDefaultServer(); + sshd.setPort(port); + sshd.setKeyPairProvider(new FileKeyPairProvider(new String[]{"src/test/resources/hostkey.pem"})); + sshd.setCommandFactory(new TestEchoCommandFactory()); + sshd.setPasswordAuthenticator(new BogusPasswordAuthenticator()); + sshd.setPublickeyAuthenticator(new BogusPublickeyAuthenticator()); + sshd.start(); + + super.setUp(); + } + + @Override + public void tearDown() throws Exception { + super.tearDown(); + + if (sshd != null) { + sshd.stop(true); + Thread.sleep(50); + } + } +} Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/SshComponentTestSupport.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java (added) +++ camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java Mon Jan 30 11:12:49 2012 @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.camel.component.ssh; + +import java.util.concurrent.CountDownLatch; + +import org.apache.sshd.server.Command; + +public class TestEchoCommandFactory extends EchoCommandFactory { + + @Override + public Command createCommand(String command) { + return new TestEchoCommand(command); + } + + public static class TestEchoCommand extends EchoCommand { + public static CountDownLatch latch = new CountDownLatch(1); + + public TestEchoCommand(String command) { + super(command); + } + + @Override + public void destroy() { + if (latch != null) { + latch.countDown(); + } + super.destroy(); + } + } +} \ No newline at end of file Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/java/org/apache/camel/component/ssh/TestEchoCommandFactory.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-ssh/src/test/resources/dsaprivkey.pem URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/resources/dsaprivkey.pem?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/resources/dsaprivkey.pem (added) +++ camel/trunk/components/camel-ssh/src/test/resources/dsaprivkey.pem Mon Jan 30 11:12:49 2012 @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBuwIBAAKBgQDEA7leYDKyJOFJU3h0uPpWN52iTpJk8+IM53Vc/91k7pBIjjka ++MP24BMh+sI2SRhxg2AtvwnzRRBVJWzEA4+tuCI6WukgeDQtSNp3YuWzOMefZ6Wb +SAk1Y4goZb7nyqV9HZSFNSqUFQRZM10L768VURBlerNqR//GqdVd8bp7lwIVAM39 +h6x2DeXbqUM8iOi01bh5jpLFAoGAEi1oFGFMEZXH/hCX+Y2VE5WvR+fBaoS9WuZl +3E0wsWPzQhbL13yD+6Htxd3XoQvrHnzyrIgi2AiAmr3mLokQbZ3d92IxEBcNB/0p +nVi020TXSeD/lWkpk5FRvgBiJ82/LeC2Lj6cssznX73aLUhR0tsSoJoXxas0sQKa +/UJgq5wCgYAtgeY99J0JxplWGSyGY/1DUpgzhdgpLdDA/o/qIjBEeHXN0QX4Ajoa +vHggJ2SwNtAxbQedBxqmB3mquFRtpfEP5zGzsVx5HHnljSH8u0SqEoLnYKFpluwh +tZ/Q3F2NHslXw8Hw+pIaPe4PAINQPAu3U+BknNUkGpLg8zU6h5+B+wIVAKRqeps1 +Xl7MxZcSZp7FnmmmMecB +-----END DSA PRIVATE KEY----- Added: camel/trunk/components/camel-ssh/src/test/resources/hostkey.pem URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/resources/hostkey.pem?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/resources/hostkey.pem (added) +++ camel/trunk/components/camel-ssh/src/test/resources/hostkey.pem Mon Jan 30 11:12:49 2012 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDdfIWeSV4o68dRrKSzFd/Bk51E65UTmmSrmW0O1ohtzi6HzsDP +jXgCtlTt3FqTcfFfI92IlTr4JWqC9UK1QT1ZTeng0MkPQmv68hDANHbt5CpETZHj +W5q4OOgWhVvj5IyOC2NZHtKlJBkdsMAa15ouOOJLzBvAvbqOR/yUROsEiQIDAQAB +AoGBANG3JDW6NoP8rF/zXoeLgLCj+tfVUPSczhGFVrQkAk4mWfyRkhN0WlwHFOec +K89MpkV1ij/XPVzU4MNbQ2yod1KiDylzvweYv+EaEhASCmYNs6LS03punml42SL9 +97tOmWfVJXxlQoLiY6jHPU97vTc65k8gL+gmmrpchsW0aqmZAkEA/c8zfmKvY37T +cxcLLwzwsqqH7g2KZGTf9aRmx2ebdW+QKviJJhbdluDgl1TNNFj5vCLznFDRHiqJ +wq0wkZ39cwJBAN9l5v3kdXj21UrurNPdlV0n2GZBt2vblooQC37XHF97r2zM7Ou+ +Lg6MyfJClyguhWL9dxnGbf3btQ0l3KDstxMCQCRaiEqjAfIjWVATzeNIXDWLHXso +b1kf5cA+cwY+vdKdTy4IeUR+Y/DXdvPWDqpf0C11aCVMohdLCn5a5ikFUycCQDhV +K/BuAallJNfmY7JxN87r00fF3ojWMJnT/fIYMFFrkQrwifXQWTDWE76BSDibsosJ +u1TGksnm8zrDh2UVC/0CQFrHTiSl/3DHvWAbOJawGKg46cnlDcAhSyV8Frs8/dlP +7YGG3eqkw++lsghqmFO6mRUTKsBmiiB2wgLGhL5pyYY= +-----END RSA PRIVATE KEY----- Added: camel/trunk/components/camel-ssh/src/test/resources/log4j.properties URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ssh/src/test/resources/log4j.properties?rev=1237603&view=auto ============================================================================== --- camel/trunk/components/camel-ssh/src/test/resources/log4j.properties (added) +++ camel/trunk/components/camel-ssh/src/test/resources/log4j.properties Mon Jan 30 11:12:49 2012 @@ -0,0 +1,35 @@ +## --------------------------------------------------------------------------- +## Licensed to the Apache Software Foundation (ASF) under one or more +## contributor license agreements. See the NOTICE file distributed with +## this work for additional information regarding copyright ownership. +## The ASF licenses this file to You 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. +## --------------------------------------------------------------------------- + +# +# The logging properties used during tests.. +# +log4j.rootLogger=INFO, out + +#log4j.logger.org.apache.camel.component.ssh=DEBUG + +# CONSOLE appender not used by default +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + +# File appender +log4j.appender.out=org.apache.log4j.FileAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n +log4j.appender.out.file=target/camel-ssh-test.log +log4j.appender.out.append=true Propchange: camel/trunk/components/camel-ssh/src/test/resources/log4j.properties ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ssh/src/test/resources/log4j.properties ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: camel/trunk/components/camel-ssh/src/test/resources/log4j.properties ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: camel/trunk/components/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/components/pom.xml?rev=1237603&r1=1237602&r2=1237603&view=diff ============================================================================== --- camel/trunk/components/pom.xml (original) +++ camel/trunk/components/pom.xml Mon Jan 30 11:12:49 2012 @@ -136,6 +136,7 @@ camel-spring-security camel-spring-ws camel-sql + camel-ssh camel-stax camel-stream camel-stringtemplate Propchange: camel/trunk/examples/camel-example-ssh/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Mon Jan 30 11:12:49 2012 @@ -0,0 +1,17 @@ +.pmd +.checkstyle +.ruleset +target +.settings +.classpath +.project +.wtpmodules +prj.el +.jdee_classpath +.jdee_sources +velocity.log +eclipse-classes +*.ipr +*.iml +*.iws +*.idea Added: camel/trunk/examples/camel-example-ssh/README.txt URL: http://svn.apache.org/viewvc/camel/trunk/examples/camel-example-ssh/README.txt?rev=1237603&view=auto ============================================================================== --- camel/trunk/examples/camel-example-ssh/README.txt (added) +++ camel/trunk/examples/camel-example-ssh/README.txt Mon Jan 30 11:12:49 2012 @@ -0,0 +1,42 @@ +SSH Example +===================== + +This example shows how use SSH with Camel. It can be run using Maven. + +This example is built assuming you have a running Apache ServiceMix container with the default SSH port 8101 and +username / password of smx/smx. + +Running from cmd line outside OSGi container +============================================ + +You will need to compile this example first: + mvn compile + +To run the example using Maven type + mvn camel:run + +To stop the example hit ctrl + c + + + +Running inside OSGi container +============================= + +You will need to compile and install this example first: + mvn compile install + +If using Apache Karaf / Apache ServiceMix you can install this example +from the shell + + > features:addurl mvn:org.apache.camel/camel-example-ssh//xml/features + > features:install camel-example-ssh + +If you hit any problems please let us know on the Camel Forums + http://camel.apache.org/discussion-forums.html + +Please help us make Apache Camel better - we appreciate any feedback you +may have. Enjoy! + +------------------------ +The Camel riders! + Propchange: camel/trunk/examples/camel-example-ssh/README.txt ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/examples/camel-example-ssh/README.txt ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: camel/trunk/examples/camel-example-ssh/pom.xml URL: http://svn.apache.org/viewvc/camel/trunk/examples/camel-example-ssh/pom.xml?rev=1237603&view=auto ============================================================================== --- camel/trunk/examples/camel-example-ssh/pom.xml (added) +++ camel/trunk/examples/camel-example-ssh/pom.xml Mon Jan 30 11:12:49 2012 @@ -0,0 +1,121 @@ + + + + + + + 4.0.0 + + + org.apache.camel + examples + 2.10-SNAPSHOT + .. + + + camel-example-ssh + bundle + Camel :: Example :: SSH + A simple SSH example which creates a bundle that can be dropped into any OSGi container + + + org.apache.camel.example.ssh.* + + + + + + org.apache.camel + camel-core + + + org.apache.camel + camel-spring + + + org.apache.camel + camel-ssh + + + org.apache.mina + mina-core + ${mina2-version} + + + + + org.slf4j + slf4j-simple + ${slf4j-version} + + + + + + + + + org.apache.felix + maven-bundle-plugin + true + + + + org.apache.camel.component.ssh, + * + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + attach-artifacts + package + + attach-artifact + + + + + target/classes/features.xml + xml + features + + + + + + + + + + org.apache.camel + camel-maven-plugin + + + + + + Propchange: camel/trunk/examples/camel-example-ssh/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/examples/camel-example-ssh/pom.xml ------------------------------------------------------------------------------ svn:keywords = Rev Date Propchange: camel/trunk/examples/camel-example-ssh/pom.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml