/* * 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.brooklyn.util.core.internal.ssh; import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKey; import static org.apache.brooklyn.core.config.ConfigKeys.newStringConfigKey; import java.io.OutputStream; import java.util.List; import java.util.Map; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.util.os.Os; import org.apache.brooklyn.util.time.Duration; /** Methods for executing things in an environment (localhost process, or ssh) */ public interface ShellTool { // config which applies to sessions public static final ConfigKey<String> PROP_LOCAL_TEMP_DIR = newStringConfigKey( "localTempDir", "The directory on the local machine (i.e. running brooklyn) for writing temp files", Os.mergePaths(Os.tmp(), "brooklyn-"+Os.user()+"-ssh-tmp")); // config which applies to calls: public static final ConfigKey<Boolean> PROP_RUN_AS_ROOT = newConfigKey("runAsRoot", "When running a script, whether to run as root", Boolean.FALSE); public static final ConfigKey<OutputStream> PROP_OUT_STREAM = newConfigKey(OutputStream.class, "out", "Stream to which to capture stdout"); public static final ConfigKey<OutputStream> PROP_ERR_STREAM = newConfigKey(OutputStream.class, "err", "Stream to which to capture stderr"); public static final ConfigKey<Boolean> PROP_NO_EXTRA_OUTPUT = newConfigKey("noExtraOutput", "Suppresses any decorative output such as result code which some tool commands insert", false); public static final ConfigKey<String> PROP_SEPARATOR = newConfigKey("separator", "string to insert between caller-supplied commands being executed as commands", " ; "); public static final ConfigKey<String> PROP_SCRIPT_DIR = newConfigKey("scriptDir", "directory where scripts should be copied", "/tmp"); public static final ConfigKey<String> PROP_SCRIPT_HEADER = newConfigKey("scriptHeader", "lines to insert at the start of scripts generated for caller-supplied commands for script execution", "#!/bin/bash -e\n"); public static final ConfigKey<String> PROP_DIRECT_HEADER = newConfigKey("directHeader", "commands to run at the target before any caller-supplied commands for direct execution", "exec bash -e"); ConfigKey<Boolean> PROP_NO_DELETE_SCRIPT = newConfigKey("noDeleteAfterExec", "Retains the generated script file after executing the commands instead of deleting it", false); ConfigKey<String> PROP_SUMMARY = ConfigKeys.newStringConfigKey("summary", "Provides a human-readable summary, used in file generation etc"); ConfigKey<Duration> PROP_EXEC_TIMEOUT = newConfigKey("execTimeout", "Timeout when executing a script", Duration.PRACTICALLY_FOREVER); ConfigKey<Boolean> PROP_EXEC_ASYNC = newConfigKey("execAsync", "Executes the script asynchronously, and then polls for the result (and for stdout/stderr)", false); ConfigKey<Duration> PROP_EXEC_ASYNC_POLLING_TIMEOUT = newConfigKey("execAsyncPollTimeout", "Timeout per poll when executing a script asynchronously", Duration.ONE_MINUTE); /** * Executes the set of commands in a shell script. Blocks until completion. * <p> * * Optional properties are the same common ones as for {@link #execCommands(Map, List, Map)} with the addition of: * <ul> * <li>{@link #PROP_RUN_AS_ROOT} * <li>{@link #PROP_SCRIPT_DIR} * </ul> * * @return exit status of script */ public int execScript(Map<String,?> props, List<String> commands, Map<String,?> env); /** * @see #execScript(Map, List, Map) */ public int execScript(Map<String,?> props, List<String> commands); /** * Executes the set of commands using ssh exec. * * This is generally more efficient than ssh shell mode (cf {@link #execScript(Map, List, Map)}), * but is not suitable if you need env values which are only set on a fully-fledged shell, * or if you want the entire block executed with root permission. * * Common optional properties (which also apply to {@link #execScript(Map, List, Map)}) are: * <ul> * <li>{@link #PROP_OUT_STREAM} * <li>{@link #PROP_ERR_STREAM} * <li>{@link #PROP_SEPARATOR} (for some modes) * <li>{@link #PROP_NO_EXTRA_OUTPUT} (often there is no extra output here) * </ul> * * Note that {@link #PROP_RUN_AS_ROOT} is <i>not</i> typically supported here. Prefer {@link #execScript(Map, List, Map)}). * * @return exit status of commands */ public int execCommands(Map<String,?> properties, List<String> commands, Map<String,?> env); /** * @see #execCommands(Map, List, Map) */ public int execCommands(Map<String,?> properties, List<String> commands); }