Project creation
This commit is contained in:
parent
70233c5be8
commit
ffe716d19a
55
build.gradle
Normal file
55
build.gradle
Normal file
@ -0,0 +1,55 @@
|
||||
group 'net.soti.go.plugin'
|
||||
|
||||
apply plugin: 'java'
|
||||
|
||||
sourceCompatibility = 1.8 // java 8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
url 'http://sotiartifacts:8081/artifactory/globalmaven/'
|
||||
}
|
||||
mavenLocal()
|
||||
}
|
||||
|
||||
jar {
|
||||
from(configurations.compile) {
|
||||
into "lib/"
|
||||
}
|
||||
archiveName project.name + '.' + project.version +'.jar'
|
||||
}
|
||||
|
||||
version = rootProject.version
|
||||
def projectName = rootProject.group + '.' + rootProject.name
|
||||
def pluginDesc = [
|
||||
id : projectName,
|
||||
version : rootProject.version,
|
||||
goCdVersion: '16.12.0',
|
||||
name : 'SOTI Powershell GoCD task plugin',
|
||||
description: 'GoCD task plugin that execute powershell',
|
||||
vendorName : 'SOTI Inc',
|
||||
vendorUrl : 'https://www.soti.net'
|
||||
]
|
||||
|
||||
println "ProjectName = {$rootProject.name}, this.name = {$name}, version {$rootProject.version}"
|
||||
processResources {
|
||||
from("resource-templates") {
|
||||
filesMatching('plugin.xml') {
|
||||
println pluginDesc
|
||||
expand pluginDesc
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly group: 'cd.go.plugin', name: 'go-plugin-api', version: '16.11.0'
|
||||
compile group: 'com.google.guava', name: 'guava', version: '19.0'
|
||||
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.4'
|
||||
compile group: 'commons-io', name: 'commons-io', version: '2.4'
|
||||
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
|
||||
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.2'
|
||||
|
||||
testCompile group: 'junit', name: 'junit', version: '4.12'
|
||||
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
|
||||
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.0.96-beta'
|
||||
}
|
1
gradle.properties
Normal file
1
gradle.properties
Normal file
@ -0,0 +1 @@
|
||||
version=1.0-SNAPSHOT
|
31
resource-templates/plugin.xml
Normal file
31
resource-templates/plugin.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<!--
|
||||
~ Copyright 2016 ThoughtWorks, Inc.
|
||||
~
|
||||
~ Licensed 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.
|
||||
-->
|
||||
|
||||
<go-plugin id="${id}" version="1">
|
||||
<about>
|
||||
<name>${name}</name>
|
||||
<version>${version}</version>
|
||||
<target-go-version>${goCdVersion}</target-go-version>
|
||||
<target-os>
|
||||
<value>Windows</value>
|
||||
</target-os>
|
||||
<description>${description}</description>
|
||||
<vendor>
|
||||
<name>${vendorName}</name>
|
||||
<url>${vendorUrl}</url>
|
||||
</vendor>
|
||||
</about>
|
||||
</go-plugin>
|
2
settings.gradle
Normal file
2
settings.gradle
Normal file
@ -0,0 +1,2 @@
|
||||
rootProject.name = 'task.powershell'
|
||||
|
@ -0,0 +1,27 @@
|
||||
package net.ws.go.plugin.task.powershell;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import com.thoughtworks.go.plugin.api.GoPluginIdentifier;
|
||||
|
||||
public interface Constants {
|
||||
// The type of this extension
|
||||
String EXTENSION_TYPE = "task";
|
||||
|
||||
// The extension point API version that this plugin understands
|
||||
String API_VERSION = "1.0";
|
||||
|
||||
String REQUEST_CONFIGURATION = "configuration";
|
||||
String REQUEST_VALIDATION = "validate";
|
||||
String REQUEST_TASK_VIEW = "view";
|
||||
String REQUEST_EXECUTION = "execute";
|
||||
|
||||
GoPluginIdentifier PLUGIN_IDENTIFIER = new GoPluginIdentifier(EXTENSION_TYPE, Collections.singletonList(API_VERSION));
|
||||
|
||||
String ERROR_ACTION_KEY = "errorAction";
|
||||
String SCRIPT_KEY = "script";
|
||||
String CPU_ARCHITECTURE_KEY = "cpuArch";
|
||||
|
||||
String SUCCESS = "success";
|
||||
String MESSAGE = "message";
|
||||
}
|
@ -0,0 +1,104 @@
|
||||
package net.ws.go.plugin.task.powershell;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import net.ws.go.plugin.task.powershell.config.PluginConfig;
|
||||
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.thoughtworks.go.plugin.api.GoApplicationAccessor;
|
||||
import com.thoughtworks.go.plugin.api.GoPlugin;
|
||||
import com.thoughtworks.go.plugin.api.GoPluginIdentifier;
|
||||
import com.thoughtworks.go.plugin.api.annotation.Extension;
|
||||
import com.thoughtworks.go.plugin.api.exceptions.UnhandledRequestTypeException;
|
||||
import com.thoughtworks.go.plugin.api.logging.Logger;
|
||||
import com.thoughtworks.go.plugin.api.request.GoPluginApiRequest;
|
||||
import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse;
|
||||
import org.apache.http.HttpStatus;
|
||||
|
||||
import static net.ws.go.plugin.task.powershell.Constants.*;
|
||||
import static net.ws.go.plugin.task.powershell.PowerShellTaskExtension.*;
|
||||
import static net.ws.go.plugin.task.powershell.Utils.isWindows;
|
||||
|
||||
@Extension
|
||||
public class PowerShellTask implements GoPlugin {
|
||||
static final Logger LOG = Logger.getLoggerFor(PowerShellTask.class);
|
||||
|
||||
@Override
|
||||
public void initializeGoApplicationAccessor(GoApplicationAccessor goApplicationAccessor) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public GoPluginApiResponse handle(GoPluginApiRequest requestMessage) throws UnhandledRequestTypeException {
|
||||
GoPluginApiResponse response = createGoResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Should not reachable.");
|
||||
LOG.info(String.format("Get request [%s] %n body[%s]", requestMessage.requestName(), requestMessage.requestBody()));
|
||||
|
||||
try {
|
||||
if (requestMessage.requestName().equals(REQUEST_CONFIGURATION)) {
|
||||
response = PluginConfig.getConfiguration();
|
||||
} else if (requestMessage.requestName().equals(REQUEST_VALIDATION)) {
|
||||
Map<String, Object> res = new HashMap<>();
|
||||
response = createGoResponse(HttpStatus.SC_OK, res);
|
||||
} else if (requestMessage.requestName().equals(REQUEST_TASK_VIEW)) {
|
||||
response = handleView();
|
||||
} else if (requestMessage.requestName().equals(REQUEST_EXECUTION)) {
|
||||
response = handleExecute(requestMessage.requestBody());
|
||||
} else {
|
||||
LOG.error(String.format("UnhandledRequestTypeException - requestName::%s", requestMessage.requestName()));
|
||||
throw new UnhandledRequestTypeException(requestMessage.requestName());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOG.error("Exception on handling", e);
|
||||
}
|
||||
|
||||
LOG.info("Response" + response.responseCode());
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GoPluginIdentifier pluginIdentifier() {
|
||||
return PLUGIN_IDENTIFIER;
|
||||
}
|
||||
|
||||
|
||||
private GoPluginApiResponse handleExecute(String requestBody) {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put(SUCCESS, false);
|
||||
if (isWindows()) {
|
||||
String scriptFilePath = null;
|
||||
|
||||
try {
|
||||
|
||||
Map<String, Map> requestMap = new GsonBuilder().create().fromJson(requestBody, Map.class);
|
||||
|
||||
scriptFilePath = creteTempScriptFile(requestMap);
|
||||
int exitCode = executeScript(requestMap, scriptFilePath);
|
||||
|
||||
if (exitCode == 0) {
|
||||
response.put(SUCCESS, true);
|
||||
addMessage(response, "Script completed successfully.");
|
||||
} else {
|
||||
addMessage(response, "Script completed with exit code: [" + exitCode + "].");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
addMessage(response, "Script execution interrupted. Reason::" + e);
|
||||
}
|
||||
Utils.deleteFile(scriptFilePath);
|
||||
|
||||
} else {
|
||||
addMessage(response, "Assigned agent is not Windows machine.");
|
||||
}
|
||||
|
||||
return createGoResponse(HttpStatus.SC_OK, response);
|
||||
}
|
||||
|
||||
private GoPluginApiResponse handleView() throws IOException {
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("displayValue", "PowerShell");
|
||||
response.put("template", Utils.readResource("/task.template.html"));
|
||||
return createGoResponse(HttpStatus.SC_OK, response);
|
||||
}
|
||||
}
|
@ -0,0 +1,114 @@
|
||||
package net.ws.go.plugin.task.powershell;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
||||
import net.ws.go.plugin.task.powershell.config.model.CpuArchitecture;
|
||||
import net.ws.go.plugin.task.powershell.config.model.ErrorActions;
|
||||
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse;
|
||||
import com.thoughtworks.go.plugin.api.task.JobConsoleLogger;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import static net.ws.go.plugin.task.powershell.Constants.*;
|
||||
|
||||
final class PowerShellTaskExtension {
|
||||
private PowerShellTaskExtension() {
|
||||
|
||||
}
|
||||
|
||||
static String creteTempScriptFile(Map<String, Map> requestMap) throws IOException {
|
||||
String fileName = createTempFileName(getEnvironments(requestMap));
|
||||
String workingDirectory = getWorkingDir(requestMap);
|
||||
String scriptValue = getConfig(requestMap, SCRIPT_KEY);
|
||||
String errorAction = getConfig(requestMap, ERROR_ACTION_KEY);
|
||||
if (StringUtils.isBlank(errorAction)) {
|
||||
errorAction = ErrorActions.SILENTLY_CONTINUE.getActionString();
|
||||
}
|
||||
|
||||
File file = new File(Utils.getScriptPath(workingDirectory, fileName));
|
||||
StringBuilder script = new StringBuilder("$script:ErrorActionPreference = [System.Management.Automation.ActionPreference]::");
|
||||
script.append(ErrorActions.fromString(errorAction).getActionString()).append(System.getProperty("line.separator"));
|
||||
script.append(Utils.cleanupScript(scriptValue));
|
||||
FileUtils.writeStringToFile(file, script.toString());
|
||||
|
||||
return file.getAbsolutePath();
|
||||
}
|
||||
|
||||
static int executeScript(Map<String, Map> requestMap, String scriptFileName) throws IOException, InterruptedException {
|
||||
return executeCommand(getWorkingDir(requestMap),
|
||||
getEnvironments(requestMap),
|
||||
Utils.getPowerShellPath(CpuArchitecture.fromString(getConfig(requestMap, CPU_ARCHITECTURE_KEY))),
|
||||
"-ExecutionPolicy", "RemoteSigned", "-NonInteractive", "-Command",
|
||||
scriptFileName);
|
||||
}
|
||||
|
||||
static void addMessage(Map<String, Object> response, String message) {
|
||||
JobConsoleLogger.getConsoleLogger().printLine(String.format("[PowerShell-executor] %s", message));
|
||||
response.put(MESSAGE, message);
|
||||
}
|
||||
|
||||
static GoPluginApiResponse createGoResponse(final int responseCode, Object response) {
|
||||
final String json = response == null ? null : new GsonBuilder().create().toJson(response);
|
||||
return new GoPluginApiResponse() {
|
||||
@Override
|
||||
public int responseCode() {
|
||||
return responseCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> responseHeaders() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String responseBody() {
|
||||
return json;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static Map<String, Map<String, String>> getConfigMap(Map<String, Map> requestMap) {
|
||||
return (Map<String, Map<String, String>>) requestMap.get("config");
|
||||
}
|
||||
|
||||
private static Map<String, String> getEnvironments(Map<String, Map> requestMap) {
|
||||
return (Map<String, String>) getContext(requestMap).get("environmentVariables");
|
||||
}
|
||||
|
||||
private static String getWorkingDir(Map<String, Map> requestMap) {
|
||||
return (String) getContext(requestMap).get("workingDirectory");
|
||||
}
|
||||
|
||||
private static Map<String, Object> getContext(Map<String, Map> requestMap) {
|
||||
return (Map<String, Object>) requestMap.get("context");
|
||||
}
|
||||
|
||||
private static String getConfig(Map<String, Map> requestMap, String key) {
|
||||
return getConfigMap(requestMap).get(key).get("value");
|
||||
}
|
||||
|
||||
private static int executeCommand(String workingDirectory, Map<String, String> environmentVariables, String... command) throws IOException, InterruptedException {
|
||||
ProcessBuilder processBuilder = new ProcessBuilder(command);
|
||||
processBuilder.directory(new File(workingDirectory));
|
||||
if (environmentVariables != null && !environmentVariables.isEmpty()) {
|
||||
processBuilder.environment().putAll(environmentVariables);
|
||||
}
|
||||
Process process = processBuilder.start();
|
||||
|
||||
JobConsoleLogger.getConsoleLogger().readOutputOf(process.getInputStream());
|
||||
JobConsoleLogger.getConsoleLogger().readErrorOf(process.getErrorStream());
|
||||
|
||||
return process.waitFor();
|
||||
}
|
||||
|
||||
private static String createTempFileName(Map<String, String> environmentVariables) {
|
||||
return String.format("%s%s_%s%s_%s.ps1",
|
||||
environmentVariables.get("GO_PIPELINE_NAME"), environmentVariables.get("GO_PIPELINE_LABEL"),
|
||||
environmentVariables.get("GO_STAGE_NAME"), environmentVariables.get("GO_STAGE_COUNTER"),
|
||||
environmentVariables.get("GO_JOB_NAME"));
|
||||
}
|
||||
}
|
71
src/main/java/net/ws/go/plugin/task/powershell/Utils.java
Normal file
71
src/main/java/net/ws/go/plugin/task/powershell/Utils.java
Normal file
@ -0,0 +1,71 @@
|
||||
package net.ws.go.plugin.task.powershell;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.ws.go.plugin.task.powershell.config.model.CpuArchitecture;
|
||||
|
||||
import com.google.common.io.CharStreams;
|
||||
import com.thoughtworks.go.plugin.api.task.JobConsoleLogger;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
final class Utils {
|
||||
private static final HashMap<CpuArchitecture, String> PS_PATH = new HashMap<>();
|
||||
private static final String PS_PATH_TEMPLATE = "%s\\%s\\WindowsPowerShell\\v1.0\\powershell.exe";
|
||||
|
||||
static {
|
||||
String arch = System.getProperty("os.arch");
|
||||
String sysRoot = System.getenv("SystemRoot");
|
||||
sysRoot = StringUtils.isEmpty(sysRoot) ? "C:\\WINDOWS" : sysRoot;
|
||||
|
||||
if (arch.contains("64")) {
|
||||
PS_PATH.put(CpuArchitecture.X86, String.format(PS_PATH_TEMPLATE, sysRoot, "SysWOW64"));
|
||||
PS_PATH.put(CpuArchitecture.X64, String.format(PS_PATH_TEMPLATE, sysRoot, "system32"));
|
||||
} else {
|
||||
PS_PATH.put(CpuArchitecture.X86, String.format(PS_PATH_TEMPLATE, sysRoot, "system32"));
|
||||
PS_PATH.put(CpuArchitecture.X64, String.format(PS_PATH_TEMPLATE, sysRoot, "sysnative"));
|
||||
}
|
||||
}
|
||||
|
||||
private Utils() {
|
||||
|
||||
}
|
||||
|
||||
static String getPowerShellPath(CpuArchitecture cpuArchitecture) {
|
||||
return PS_PATH.get(cpuArchitecture);
|
||||
}
|
||||
|
||||
static boolean isWindows() {
|
||||
String osName = System.getProperty("os.name");
|
||||
boolean isWindows = StringUtils.containsIgnoreCase(osName, "windows");
|
||||
JobConsoleLogger.getConsoleLogger().printLine("[script-executor] OS detected: '" + osName + "'. Is Windows? " + isWindows);
|
||||
return isWindows;
|
||||
}
|
||||
|
||||
static String readResource(String resourceFile) {
|
||||
try (InputStreamReader reader = new InputStreamReader(Utils.class.getResourceAsStream(resourceFile), StandardCharsets.UTF_8)) {
|
||||
return CharStreams.toString(reader);
|
||||
} catch (IOException e) {
|
||||
PowerShellTask.LOG.error("Could not find resource " + resourceFile, e);
|
||||
throw new RuntimeException("Could not find resource " + resourceFile, e);
|
||||
}
|
||||
}
|
||||
|
||||
static String getScriptPath(String workingDirectory, String scriptFileName) {
|
||||
return workingDirectory + "/" + scriptFileName;
|
||||
}
|
||||
|
||||
static String cleanupScript(String scriptValue) {
|
||||
return scriptValue.replaceAll("(\\r\\n|\\n|\\r)", System.getProperty("line.separator"));
|
||||
}
|
||||
|
||||
static void deleteFile(String scriptFile) {
|
||||
if (!StringUtils.isBlank(scriptFile)) {
|
||||
FileUtils.deleteQuietly(new File(scriptFile));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package net.ws.go.plugin.task.powershell.config;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import net.ws.go.plugin.task.powershell.config.model.CpuArchitecture;
|
||||
import net.ws.go.plugin.task.powershell.config.model.ErrorActions;
|
||||
import net.ws.go.plugin.task.powershell.config.model.Field;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.thoughtworks.go.plugin.api.response.DefaultGoPluginApiResponse;
|
||||
import com.thoughtworks.go.plugin.api.response.GoPluginApiResponse;
|
||||
import net.ws.go.plugin.task.powershell.Constants;
|
||||
|
||||
public class PluginConfig {
|
||||
private static final Gson GSON = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
|
||||
|
||||
static final Map<String, Field> FIELDS = new LinkedHashMap<>();
|
||||
|
||||
private static final Field ERROR_ACTION = new Field(Constants.ERROR_ACTION_KEY, "Error Action Preference",
|
||||
ErrorActions.STOP.getActionString(), true, false, "0");
|
||||
private static final Field SCRIPT = new Field(Constants.SCRIPT_KEY, "Script",
|
||||
null, true, false, "1");
|
||||
private static final Field CPU_ARCHITECTURE = new Field(Constants.CPU_ARCHITECTURE_KEY, "CPU Architecture",
|
||||
CpuArchitecture.X64.name().toLowerCase(), true, false, "2");
|
||||
|
||||
static {
|
||||
FIELDS.put(ERROR_ACTION.getKey(), ERROR_ACTION);
|
||||
FIELDS.put(SCRIPT.getKey(), SCRIPT);
|
||||
FIELDS.put(CPU_ARCHITECTURE.getKey(), CPU_ARCHITECTURE);
|
||||
}
|
||||
|
||||
public static GoPluginApiResponse getConfiguration() throws Exception {
|
||||
Map<String, Object> map = getKeyValueMap();
|
||||
return DefaultGoPluginApiResponse.success(map.size() > 0 ? GSON.toJson(map) : null);
|
||||
}
|
||||
|
||||
private static Map<String, Object> getKeyValueMap() {
|
||||
Map<String, Object> keyValueMap = new HashMap<>();
|
||||
keyValueMap.putAll(FIELDS);
|
||||
return keyValueMap;
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package net.ws.go.plugin.task.powershell.config.model;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public enum CpuArchitecture {
|
||||
X86,
|
||||
X64;
|
||||
|
||||
CpuArchitecture() {
|
||||
|
||||
}
|
||||
|
||||
public static CpuArchitecture fromString(String architectureName) {
|
||||
if (!StringUtils.isEmpty(architectureName)) {
|
||||
for (CpuArchitecture value : CpuArchitecture.values()) {
|
||||
if (StringUtils.equalsIgnoreCase(value.name(), architectureName)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package net.ws.go.plugin.task.powershell.config.model;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public enum ErrorActions {
|
||||
STOP(Constants.STOP),
|
||||
CONTINUE(Constants.CONTINUE),
|
||||
IGNORE(Constants.IGNORE),
|
||||
SILENTLY_CONTINUE(Constants.SILENTLY_CONTINUE),
|
||||
SUSPEND(Constants.SUSPEND),
|
||||
INQUIRE(Constants.INQUIRE);
|
||||
|
||||
private final String actionString;
|
||||
|
||||
ErrorActions(String actionString) {
|
||||
this.actionString = actionString;
|
||||
}
|
||||
|
||||
public static ErrorActions fromString(String actionType) {
|
||||
if(!StringUtils.isEmpty(actionType)) {
|
||||
for(ErrorActions action : ErrorActions.values()) {
|
||||
if(StringUtils.equalsIgnoreCase(action.actionString, actionType)) {
|
||||
return action;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getActionString() {
|
||||
return actionString;
|
||||
}
|
||||
|
||||
private static class Constants {
|
||||
static final String STOP = "Stop";
|
||||
static final String CONTINUE = "Continue";
|
||||
static final String IGNORE = "Ignore";
|
||||
static final String SILENTLY_CONTINUE = "SilentlyContinue";
|
||||
static final String SUSPEND = "Suspend";
|
||||
static final String INQUIRE = "Inquire";
|
||||
|
||||
private Constants() {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package net.ws.go.plugin.task.powershell.config.model;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class Field {
|
||||
private final String key;
|
||||
|
||||
@Expose
|
||||
@SerializedName("display-name")
|
||||
String displayName;
|
||||
|
||||
@Expose
|
||||
@SerializedName("default-value")
|
||||
private String defaultValue;
|
||||
|
||||
@Expose
|
||||
@SerializedName("required")
|
||||
protected Boolean required;
|
||||
|
||||
@Expose
|
||||
@SerializedName("secure")
|
||||
private Boolean secure;
|
||||
|
||||
@Expose
|
||||
@SerializedName("display-order")
|
||||
private String displayOrder;
|
||||
|
||||
public Field(String key, String displayName, String defaultValue, Boolean required, Boolean secure, String displayOrder) {
|
||||
this.key = key;
|
||||
this.displayName = displayName;
|
||||
this.defaultValue = defaultValue;
|
||||
this.required = required;
|
||||
this.secure = secure;
|
||||
this.displayOrder = displayOrder;
|
||||
}
|
||||
|
||||
public Map<String, String> validate(String input) {
|
||||
HashMap<String, String> result = new HashMap<>();
|
||||
String validationError = doValidate(input);
|
||||
if (StringUtils.isNotBlank(validationError)) {
|
||||
result.put("key", key);
|
||||
result.put("message", validationError);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
protected String doValidate(String input) {
|
||||
if (required && StringUtils.isBlank(input)) {
|
||||
return displayName + " must not be blank.";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
}
|
20
src/main/resources/task.template.html
Normal file
20
src/main/resources/task.template.html
Normal file
@ -0,0 +1,20 @@
|
||||
<div class="form_item_block">
|
||||
<label>Error Action Preference:<span class="asterisk">*</span></label>
|
||||
<select ng-model="errorAction" ng-required="true" >
|
||||
<option value="Stop">Stop</option>
|
||||
<option value="SilentlyContinue">SilentlyContinue</option>
|
||||
<option value="Continue">Continue</option>
|
||||
<option value="Ignore">Ignore</option>
|
||||
<option value="Suspend">Suspend</option>
|
||||
<option value="Inquire">Inquire</option>
|
||||
</select>
|
||||
<label>Script:<span class="asterisk">*</span></label>
|
||||
<textarea ng-model="script" ng-required="true" rows="14" cols="60"></textarea>
|
||||
<span class="form_error" ng-show="GOINPUTNAME[script].$error.server">{{ GOINPUTNAME[script].$error.server }}</span>
|
||||
<span class="form_error" ng-show="GOINPUTNAME[cpuArch].$error.server">{{ GOINPUTNAME[cpuArch].$error.server }}</span>
|
||||
<label>CPU Architecture:<span class="asterisk">*</span></label>
|
||||
<select ng-model="cpuArch" ng-required="true" >
|
||||
<option value="x86">x86</option>
|
||||
<option value="x64">x64</option>
|
||||
</select>
|
||||
</div>
|
Loading…
Reference in New Issue
Block a user