org.eclipse.che.plugin.ssh.key.script.SshScript.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.plugin.ssh.key.script.SshScript.java

Source

/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.plugin.ssh.key.script;

import com.google.common.io.Files;

import org.apache.commons.io.FileUtils;
import org.eclipse.che.api.core.ServerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Implementation of script that provide ssh connection
 *
 * @author Anton Korneta
 * @author Alexander Andrienko
 */
public abstract class SshScript {

    private static final Logger LOG = LoggerFactory.getLogger(SshScript.class);

    private static final String DEFAULT_KEY_NAME = "identity";

    private byte[] sshKey;
    private String host;
    private File rootFolder;
    private File sshScriptFile;

    public SshScript(String host, byte[] sshKey) throws ServerException {
        this.rootFolder = Files.createTempDir();
        this.host = host;
        this.sshKey = sshKey;
        this.sshScriptFile = storeSshScript(writePrivateKeyFile().getPath());
    }

    /**
     * Writes private SSH key into file.
     *
     * @return file that contains SSH key
     * @throws ServerException
     *         if other error occurs
     */
    private File writePrivateKeyFile() throws ServerException {
        final File keyDirectory = new File(rootFolder, host);
        if (!keyDirectory.exists()) {
            keyDirectory.mkdirs();
        }

        final File keyFile = new File(keyDirectory, DEFAULT_KEY_NAME);
        try (FileOutputStream fos = new FileOutputStream(keyFile)) {
            fos.write(sshKey);
        } catch (IOException e) {
            LOG.error("Can't store ssh key. ", e);
            throw new ServerException("Can't store ssh key. ");
        }
        protectPrivateKeyFile(keyFile);
        return keyFile;
    }

    /**
     * Stores ssh script that will be executed with all commands that need ssh.
     *
     * @param keyPath
     *         path to ssh key
     * @return file that contains script for ssh commands
     * @throws ServerException
     *         when any error with ssh script storing occurs
     */
    private File storeSshScript(String keyPath) throws ServerException {
        File sshScriptFile = new File(rootFolder, getSshKeyFileName());
        try (FileOutputStream fos = new FileOutputStream(sshScriptFile)) {
            fos.write(getSshScriptTemplate().replace("$ssh_key", keyPath).getBytes());
        } catch (IOException e) {
            LOG.error("It is not possible to store {} ssh key", keyPath);
            throw new ServerException("Can't store SSH key");
        }
        if (!sshScriptFile.setExecutable(true)) {
            LOG.error("Can't make {} executable", sshScriptFile);
            throw new ServerException("Can't set permissions to SSH key");
        }
        return sshScriptFile;
    }

    /**
     * Get ssh key file name
     * @return ssh key file name
     */
    protected abstract String getSshKeyFileName();

    /**
     * Get ssh script template
     * @return ssh script template for loading loading ssh key
     */
    protected abstract String getSshScriptTemplate();

    /**
     * Set file permission attributes for protection sshKey file
     *
     * @param sshKey ssh key file
     * @throws ServerException
     */
    protected abstract void protectPrivateKeyFile(File sshKey) throws ServerException;

    /**
     * Get sshScript File
     *
     * @return sshScript file
     */
    public File getSshScriptFile() {
        return sshScriptFile;
    }

    /**
     * Remove script folder with sshScript and sshKey
     *
     * @throws ServerException
     *         when any error with ssh script deleting occurs
     */
    public void delete() throws ServerException {
        try {
            FileUtils.deleteDirectory(rootFolder);
        } catch (IOException ioEx) {
            throw new ServerException("Can't remove SSH script directory", ioEx);
        }
    }
}