package com.sequenceiq.cloudbreak.service.stack.flow; import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.service.CloudbreakServiceException; import com.sequenceiq.cloudbreak.service.StackBasedStatusCheckerTask; import net.schmizz.sshj.SSHClient; @Component public class SshCheckerTask extends StackBasedStatusCheckerTask<SshCheckerTaskContext> { private static final Logger LOGGER = LoggerFactory.getLogger(SshCheckerTask.class); @Override public boolean checkStatus(SshCheckerTaskContext sshCheckerTaskContext) { final SSHClient ssh = new SSHClient(); boolean ret = false; try { ssh.addHostKeyVerifier(sshCheckerTaskContext.getHostKeyVerifier()); String user = sshCheckerTaskContext.getUser(); ssh.connect(sshCheckerTaskContext.getPublicIp(), sshCheckerTaskContext.getSshPort()); if (sshCheckerTaskContext.getStack().getCredential().passwordAuthenticationRequired()) { LOGGER.info("Connecting with ssh to: {}, user: {} with password", sshCheckerTaskContext.getPublicIp(), user); ssh.authPassword(user, sshCheckerTaskContext.getStack().getCredential().getLoginPassword()); } else { LOGGER.info("Connecting with ssh to: {}, user: {}, privatekey: {}", sshCheckerTaskContext.getPublicIp(), user, sshCheckerTaskContext .getSshPrivateFileLocation()); ssh.authPublickey(user, sshCheckerTaskContext.getSshPrivateFileLocation()); } ret = true; } catch (Exception e) { LOGGER.info("Failed to connect ssh: {}", e.getMessage()); } finally { try { ssh.disconnect(); } catch (IOException e) { LOGGER.info("Failed to disconnect from ssh: {}", e.getMessage()); } } return ret; } @Override public void handleTimeout(SshCheckerTaskContext sshCheckerTaskContext) { throw new CloudbreakServiceException("Operation timed out. Could not reach ssh connection in time"); } @Override public String successMessage(SshCheckerTaskContext sshCheckerTaskContext) { return "Ssh is up and running tls setup start."; } }