| /** |
| * Licensed to jclouds, Inc. (jclouds) under one or more |
| * contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. jclouds 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.jclouds.scriptbuilder.domain; |
| |
| import java.net.URI; |
| import java.util.Map; |
| |
| import com.google.common.collect.ImmutableList; |
| import com.google.common.collect.ImmutableMultimap; |
| import com.google.common.collect.ImmutableSet; |
| import com.google.common.collect.Multimap; |
| |
| /** |
| * Statements used in shell scripts. |
| * |
| * @author Adrian Cole |
| */ |
| public class Statements { |
| private static final Kill KILL = new Kill(); |
| |
| public static Statement newStatementList(Statement... statements) { |
| return new StatementList(statements); |
| } |
| |
| public static Statement switchArg(int arg, Map<String, Statement> valueToActions) { |
| return new SwitchArg(arg, valueToActions); |
| } |
| |
| public static Statement rm(final String path) { |
| return new Statement() { |
| |
| @Override |
| public Iterable<String> functionDependencies(OsFamily family) { |
| return ImmutableList.of(); |
| } |
| |
| @Override |
| public String render(OsFamily family) { |
| if (family == OsFamily.WINDOWS) |
| return exec(String.format("{rm} %s 2{closeFd}", path)).render(family); |
| else |
| return exec(String.format("{rm} %s", path)).render(family); |
| } |
| |
| }; |
| } |
| |
| public static Statement call(String function, String... args) { |
| return new Call(function, args); |
| } |
| |
| public static Statement appendFile(String path, String line, String delimiter) { |
| return AppendFile.builder().path(path).lines(ImmutableSet.of(line)).delimiter(delimiter).build(); |
| } |
| |
| public static Statement appendFile(String path, Iterable<String> lines) { |
| return AppendFile.builder().path(path).lines(lines).build(); |
| } |
| |
| public static Statement appendFile(String path, Iterable<String> lines, String delimiter) { |
| return AppendFile.builder().path(path).lines(lines).delimiter(delimiter).build(); |
| } |
| |
| public static Statement createOrOverwriteFile(String path, Iterable<String> lines) { |
| return CreateOrOverwriteFile.builder().path(path).lines(lines).build(); |
| } |
| |
| public static Statement createOrOverwriteFile(String path, Iterable<String> lines, String delimiter) { |
| return CreateOrOverwriteFile.builder().path(path).lines(lines).delimiter(delimiter).build(); |
| } |
| |
| /** |
| * @param exports |
| * variable names to export in UPPER_UNDERSCORE case format |
| */ |
| public static CreateRunScript createRunScript(String instanceName, Iterable<String> exports, String pwd, |
| Iterable<Statement> statements) {// TODO: convert so |
| // that |
| // createRunScript |
| // can take from a |
| // variable |
| return new CreateRunScript(instanceName, exports, pwd, statements); |
| } |
| |
| /** |
| * Stores the pid into the variable {@code FOUND_PID} if successful. |
| * |
| * @param args |
| * - what to search for in the process tree. |
| */ |
| public static Statement findPid(String args) { |
| return new Call("findPid", args); |
| } |
| |
| /** |
| * |
| * Runs the script in a way that it can be matched later with |
| * {@link #findPid} |
| * |
| * @param instanceName |
| * - what to match the process on |
| * @param script |
| * - what to run in the background |
| * @param logDir |
| * - where to write the following logs: |
| * <ol> |
| * <li>stdout.log</li> |
| * <li>stderr.log</li> |
| * </ol> |
| */ |
| public static Statement forget(String instanceName, String script, String logDir) { |
| return new Call("forget", instanceName, script, logDir); |
| } |
| |
| /** |
| * Kills the pid and subprocesses related to the variable {@code FOUND_PID} |
| * if set. |
| * |
| * @see #findPid |
| */ |
| public static Statement kill() { |
| return KILL; |
| } |
| |
| /** |
| * statement can have multiple newlines, note you should use {@code lf} to be |
| * portable |
| * |
| * @see ShellToken |
| */ |
| public static Statement interpret(String... portableStatements) { |
| return new InterpretableStatement(portableStatements); |
| } |
| |
| /** |
| * interprets and adds a newline to the statement |
| */ |
| public static Statement exec(String portableStatement) { |
| return interpret(portableStatement + "{lf}"); |
| } |
| |
| /** |
| * untar, ungzip the data received from the request parameters. |
| * |
| * @param method |
| * http method: ex GET |
| * @param endpoint |
| * uri corresponding to the request |
| * @param headers |
| * request headers to send |
| * @param directory |
| */ |
| public static Statement extractTargzIntoDirectory(String method, URI endpoint, Multimap<String, String> headers, |
| String directory) { |
| return new PipeHttpResponseToTarxpzfIntoDirectory(method, endpoint, headers, directory); |
| } |
| |
| /** |
| * like {@link #extractTargzIntoDirectory(URI, String)} except that it |
| * flattens the first directory in the archive |
| * |
| * For example, {@code apache-maven-3.0.4-bin.tar.gz} normally extracts |
| * directories like {@code ./apache-maven-3.0.4/bin}. This command eliminates |
| * the intermediate directory, in the example {@code ./apache-maven-3.0.4/} |
| * |
| * @param tgz remote ref to download |
| * @param dest path where the files in the intermediate directory will end |
| */ |
| public static Statement extractTargzAndFlattenIntoDirectory(URI tgz, String dest) { |
| return new StatementList(ImmutableSet.<Statement> builder() |
| .add(exec("mkdir /tmp/$$")) |
| .add(extractTargzIntoDirectory(tgz, "/tmp/$$")) |
| .add(exec("mkdir -p " + dest)) |
| .add(exec("mv /tmp/$$/*/* " + dest)) |
| .add(exec("rm -rf /tmp/$$")).build()); |
| } |
| |
| public static Statement extractTargzIntoDirectory(URI targz, String directory) { |
| return extractTargzIntoDirectory("GET", targz, ImmutableMultimap.<String, String> of(), directory); |
| } |
| |
| /** |
| * unzip the data received from the request parameters. |
| * |
| * @param method |
| * http method: ex GET |
| * @param endpoint |
| * uri corresponding to the request |
| * @param headers |
| * request headers to send |
| * @param directory |
| */ |
| public static Statement extractZipIntoDirectory(String method, URI endpoint, Multimap<String, String> headers, |
| String directory) { |
| return new UnzipHttpResponseIntoDirectory(method, endpoint, headers, directory); |
| } |
| |
| public static Statement saveHttpResponseTo(URI source, String dir, String file) { |
| return new SaveHttpResponseTo(dir, file, "GET", source, ImmutableMultimap.<String, String> of()); |
| } |
| |
| /** |
| * exec the data received from the request parameters. |
| * |
| * @param method |
| * http method: ex GET |
| * @param endpoint |
| * uri corresponding to the request |
| * @param headers |
| * request headers to send |
| */ |
| public static Statement pipeHttpResponseToBash(String method, URI endpoint, Multimap<String, String> headers) { |
| return new PipeHttpResponseToBash(method, endpoint, headers); |
| } |
| } |