Author: echatellier Date: 2014-06-16 17:21:40 +0200 (Mon, 16 Jun 2014) New Revision: 4016 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4016 Log: Support jsch proxy command to allow using caparmor outside ifremer network Added: trunk/src/main/java/fr/ifremer/isisfish/util/ssh/ProxyCommand.java Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java Modified: trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-06-16 11:46:42 UTC (rev 4015) +++ trunk/src/main/java/fr/ifremer/isisfish/IsisConfig.java 2014-06-16 15:21:40 UTC (rev 4016) @@ -181,7 +181,9 @@ public IsisConfig() { for (Option o : Option.values()) { - setDefaultOption(o.key, o.defaultValue); + if (o.defaultValue != null) { + setDefaultOption(o.key, o.defaultValue); + } } for (Action a : Action.values()) { @@ -666,11 +668,15 @@ setOption(Option.SSH_KEY_FILE.key, sshFile.getAbsolutePath()); } - /*public boolean isUseVCS() { - String value = getOption(Option.VCS_TYPE.key); - boolean result = !VCSNone.TYPE_NONE.equals(value); + /** + * La proxy command a ajouter pour pouvoir contacter le serveur cible. + * + * @return ssh proxy command + */ + public String getSimulatorSshProxyCommand() { + String result = getOption(Option.SIMULATOR_SSH_PROXYCOMMAND.key); return result; - }*/ + } /** * Get launch.ui option value. @@ -1014,6 +1020,8 @@ SIMULATOR_SSH_MAXTHREADS("simulation.ssh.max.threads", n("isisfish.config.main.simulation.ssh.max.threads.description"), "1"), /** Serveur accessible par SSH : mémoire (Xmx) allouée pour les process java sur caparmor */ SIMULATOR_SSH_MAXMEMORY("simulation.ssh.max.memory", n("isisfish.config.main.simulation.ssh.max.memory.description"), "2000M"), + /** Serveur accessible par SSH : la proxy commande a ajouter pour ouvrir la connexion. */ + SIMULATOR_SSH_PROXYCOMMAND("simulation.ssh.proxy.command", n("isisfish.config.main.simulation.ssh.proxy.command.description"), null), /** Application locale (for i18n init). */ LOCALE("locale", n("isisfish.config.main.locale.description"), "fr_FR"), Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java 2014-06-16 11:46:42 UTC (rev 4015) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SSHSimulatorLauncher.java 2014-06-16 15:21:40 UTC (rev 4016) @@ -57,6 +57,7 @@ import fr.ifremer.isisfish.simulator.SimulationControl; import fr.ifremer.isisfish.util.ssh.InvalidPassphraseException; import fr.ifremer.isisfish.util.ssh.ProgressMonitor; +import fr.ifremer.isisfish.util.ssh.ProxyCommand; import fr.ifremer.isisfish.util.ssh.SSHAgent; import fr.ifremer.isisfish.util.ssh.SSHException; import fr.ifremer.isisfish.util.ssh.SSHUserInfo; @@ -301,7 +302,7 @@ sshSession, control.getId(), simulationPrescript); // start simulation if necessary (multi jobs) ... - startSimulation(simulationItem, simulationid, simulationRemotePath, remoteResultZip, simulationPreScriptPath); + startSimulation(sshSession, simulationItem, simulationid, simulationRemotePath, remoteResultZip, simulationPreScriptPath); } catch (Exception e) { if (log.isErrorEnabled()) { @@ -565,6 +566,12 @@ Session session = jsch.getSession(username, host, port); + // add proxy command if specified + String proxyCommand = IsisFish.config.getSimulatorSshProxyCommand(); + if (StringUtils.isNotBlank(proxyCommand)) { + session.setProxy(new ProxyCommand(proxyCommand)); + } + // username and password will be given via UserInfo interface. SSHUserInfo ui = new SSHUserInfo(); if (sshKeyUsed) { @@ -987,6 +994,7 @@ * * Current simulation can be started later with a PBS multi job. * + * @param session ssh session * @param simulationItem simulation item (needed for additionnal info, simulation, number, indenpendant, etc...) * @param simulationid simulation id * @param simulationRemoteZipPath simulation preparation (input) zip path @@ -995,7 +1003,7 @@ * * @throws Exception */ - protected void startSimulation(SimulationItem simulationItem, String simulationid, String simulationRemoteZipPath, String remoteResultZip, String simulationPreScriptPath) throws Exception { + protected void startSimulation(Session session, SimulationItem simulationItem, String simulationid, String simulationRemoteZipPath, String remoteResultZip, String simulationPreScriptPath) throws Exception { // standalone simulation // no question, generate script, launch it each time @@ -1003,12 +1011,12 @@ // single simulation File simulationPSBScript = getLaunchSimulationScriptFile(simulationid, simulationRemoteZipPath, true, remoteResultZip, simulationPreScriptPath, false); - String scriptRemotePath = uploadSimulationScript(sshSession, simulationid, simulationPSBScript); + String scriptRemotePath = uploadSimulationScript(session, simulationid, simulationPSBScript); // prescript uploaded, delete simulationPSBScript.delete(); - sendStartSimulationRequest(sshSession, simulationid, scriptRemotePath, -1); + sendStartSimulationRequest(session, simulationid, scriptRemotePath, -1); } else { // standalone, on do it for last simulation @@ -1022,13 +1030,13 @@ // multiples jobs simulation File simulationPSBScript = getLaunchSimulationScriptFile(shortSimulationId, simulationRemoteZipPath, simulationItem.isStandaloneSimulationZip(), remoteResultZip, simulationPreScriptPath, true); - String scriptRemotePath = uploadSimulationScript(sshSession, shortSimulationId, simulationPSBScript); + String scriptRemotePath = uploadSimulationScript(session, shortSimulationId, simulationPSBScript); // prescript uploaded, delete simulationPSBScript.delete(); // file will be named with shortSimulationId (instead of simulationId) - sendStartSimulationRequest(sshSession, shortSimulationId, scriptRemotePath, simulationItem.getSimulationNumber()); + sendStartSimulationRequest(session, shortSimulationId, scriptRemotePath, simulationItem.getSimulationNumber()); } else { if (log.isDebugEnabled()) { Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java 2014-06-16 11:46:42 UTC (rev 4015) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/config/SSHLauncherConfigAction.java 2014-06-16 15:21:40 UTC (rev 4016) @@ -47,6 +47,7 @@ import fr.ifremer.isisfish.IsisFish; import fr.ifremer.isisfish.util.ssh.InvalidPassphraseException; +import fr.ifremer.isisfish.util.ssh.ProxyCommand; import fr.ifremer.isisfish.util.ssh.SSHAgent; import fr.ifremer.isisfish.util.ssh.SSHException; import fr.ifremer.isisfish.util.ssh.SSHUserInfo; @@ -287,6 +288,10 @@ } Session session = jsch.getSession(currentSSHUsername, host, port); + String proxyCommand = IsisFish.config.getSimulatorSshProxyCommand(); + if (StringUtils.isNotBlank(proxyCommand)) { + session.setProxy(new ProxyCommand(proxyCommand)); + } // username and password will be given via UserInfo interface. SSHUserInfo ui = new SSHUserInfo(); @@ -441,7 +446,11 @@ } Session session = jsch.getSession(currentSSHUsername, host, port); - + String proxyCommand = IsisFish.config.getSimulatorSshProxyCommand(); + if (StringUtils.isNotBlank(proxyCommand)) { + session.setProxy(new ProxyCommand(proxyCommand)); + } + // username and password will be given via UserInfo interface. SSHUserInfo ui = new SSHUserInfo(); if (sshKeyUsed) { Added: trunk/src/main/java/fr/ifremer/isisfish/util/ssh/ProxyCommand.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/util/ssh/ProxyCommand.java (rev 0) +++ trunk/src/main/java/fr/ifremer/isisfish/util/ssh/ProxyCommand.java 2014-06-16 15:21:40 UTC (rev 4016) @@ -0,0 +1,84 @@ +/* + * #%L + * IsisFish + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2014 Ifremer, Code Lutin, Chatellier Eric + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +package fr.ifremer.isisfish.util.ssh; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +import com.jcraft.jsch.Proxy; +import com.jcraft.jsch.SocketFactory; + +/** + * Implementation du proxy commande pour pouvoir utiliser un proxy local dans le + * but de faire un rebond à travers un serveur intermédiaire. + * + * @author Eric Chatellier + */ +public class ProxyCommand implements Proxy { + protected String command; + protected Process p = null; + protected InputStream in = null; + protected OutputStream out = null; + + public ProxyCommand(String command) { + this.command = command; + } + + public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws Exception { + String fullCommand = command.replace("%h", host); + fullCommand = fullCommand.replace("%p", new Integer(port).toString()); + p = Runtime.getRuntime().exec(fullCommand); + in = p.getInputStream(); + out = p.getOutputStream(); + } + + public Socket getSocket() { + return null; + } + + public InputStream getInputStream() { + return in; + } + + public OutputStream getOutputStream() { + return out; + } + + public void close() { + try { + if (p != null) { + p.getErrorStream().close(); + p.getOutputStream().close(); + p.getInputStream().close(); + p.destroy(); + p = null; + } + } catch (IOException e) { + } + } +} Property changes on: trunk/src/main/java/fr/ifremer/isisfish/util/ssh/ProxyCommand.java ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision HeadURL