use of org.apache.geode.management.internal.cli.CliAroundInterceptor in project geode by apache.
the class RemoteExecutionStrategy method execute.
public Object execute(ParseResult parseResult) throws RuntimeException {
Result result = null;
try {
Assert.notNull(parseResult, "Parse result required");
if (!GfshParseResult.class.isInstance(parseResult)) {
// TODO: should this message be more specific?
throw new IllegalArgumentException("Command Configuration/Definition error.");
}
GfshParseResult gfshParseResult = (GfshParseResult) parseResult;
Method method = gfshParseResult.getMethod();
if (!isShellOnly(method)) {
Boolean fromShell = CommandExecutionContext.isShellRequest();
boolean sentFromShell = fromShell != null && fromShell.booleanValue();
String interceptorClass = getInterceptor(gfshParseResult.getMethod());
CliAroundInterceptor interceptor = null;
// 1. Pre Execution
if (!sentFromShell && !CliMetaData.ANNOTATION_NULL_VALUE.equals(interceptorClass)) {
try {
interceptor = (CliAroundInterceptor) ClassPathLoader.getLatest().forName(interceptorClass).newInstance();
} catch (InstantiationException e) {
logWrapper.info(e.getMessage());
} catch (IllegalAccessException e) {
logWrapper.info(e.getMessage());
} catch (ClassNotFoundException e) {
logWrapper.info(e.getMessage());
}
if (interceptor != null) {
Result preExecResult = interceptor.preExecution(gfshParseResult);
if (Status.ERROR.equals(preExecResult.getStatus())) {
return preExecResult;
} else if (preExecResult instanceof FileResult) {
FileResult fileResult = (FileResult) preExecResult;
byte[][] fileData = fileResult.toBytes();
CommandExecutionContext.setBytesFromShell(fileData);
}
} else {
return ResultBuilder.createBadConfigurationErrorResult("Interceptor Configuration Error");
}
}
logWrapper.info("Executing " + gfshParseResult.getUserInput());
result = (Result) ReflectionUtils.invokeMethod(gfshParseResult.getMethod(), gfshParseResult.getInstance(), gfshParseResult.getArguments());
if (result != null && Status.ERROR.equals(result.getStatus())) {
logWrapper.info("Error occurred while executing \"" + gfshParseResult.getUserInput() + "\".");
}
if (interceptor != null) {
Result postExecResult = interceptor.postExecution(gfshParseResult, result, null);
if (postExecResult != null) {
if (Status.ERROR.equals(postExecResult.getStatus())) {
logWrapper.warning(postExecResult.toString(), null);
} else if (logWrapper.fineEnabled()) {
logWrapper.fine(String.valueOf(postExecResult));
}
result = postExecResult;
}
// for remote commands with bytes
CommandExecutionContext.setBytesFromShell(null);
}
} else {
throw new IllegalArgumentException("Only Remote command can be executed through " + ManagementService.class.getSimpleName() + ".processCommand() or ManagementMBean's processCommand " + "operation. Please refer documentation for the list of " + "commands.");
}
} catch (RuntimeException e) {
throw e;
}
return result;
}
use of org.apache.geode.management.internal.cli.CliAroundInterceptor in project geode by apache.
the class GfshExecutionStrategy method executeOnRemote.
//////////////// ExecutionStrategy interface Methods End /////////////////////
/**
* Sends the user input (command string) via {@link OperationInvoker} to a remote GemFire node for
* processing & execution.
*
* @param parseResult
*
* @return result of execution/processing of the command
*
* @throws IllegalStateException if gfsh doesn't have an active connection.
*/
private Result executeOnRemote(GfshParseResult parseResult) {
Result commandResult = null;
Object response = null;
if (!shell.isConnectedAndReady()) {
shell.logWarning("Can't execute a remote command without connection. Use 'connect' first to connect.", null);
logWrapper.info("Can't execute a remote command \"" + parseResult.getUserInput() + "\" without connection. Use 'connect' first to connect to GemFire.");
return null;
}
byte[][] fileData = null;
CliAroundInterceptor interceptor = null;
String interceptorClass = getInterceptor(parseResult.getMethod());
// 1. Pre Remote Execution
if (!CliMetaData.ANNOTATION_NULL_VALUE.equals(interceptorClass)) {
try {
interceptor = (CliAroundInterceptor) ClassPathLoader.getLatest().forName(interceptorClass).newInstance();
} catch (InstantiationException | ClassNotFoundException | IllegalAccessException e) {
shell.logWarning("Configuration error", e);
}
if (interceptor != null) {
Result preExecResult = interceptor.preExecution(parseResult);
if (Status.ERROR.equals(preExecResult.getStatus())) {
return preExecResult;
} else if (preExecResult instanceof FileResult) {
FileResult fileResult = (FileResult) preExecResult;
fileData = fileResult.toBytes();
}
} else {
return ResultBuilder.createBadConfigurationErrorResult("Interceptor Configuration Error");
}
}
// 2. Remote Execution
final Map<String, String> env = shell.getEnv();
try {
response = shell.getOperationInvoker().processCommand(new CommandRequest(parseResult, env, fileData));
} catch (NotAuthorizedException e) {
return ResultBuilder.createGemFireUnAuthorizedErrorResult("Unauthorized. Reason : " + e.getMessage());
} catch (Exception e) {
shell.logSevere(e.getMessage(), e);
} finally {
env.clear();
}
if (response == null) {
shell.logWarning("Response was null for: \"" + parseResult.getUserInput() + "\". (gfsh.isConnected=" + shell.isConnectedAndReady() + ")", null);
return ResultBuilder.createBadResponseErrorResult(" Error occurred while " + "executing \"" + parseResult.getUserInput() + "\" on manager. " + "Please check manager logs for error.");
}
// it can also be a Path to a temp file downloaded from the rest http request
if (response instanceof String) {
CommandResponse commandResponse = CommandResponseBuilder.prepareCommandResponseFromJson((String) response);
if (commandResponse.isFailedToPersist()) {
shell.printAsSevere(CliStrings.SHARED_CONFIGURATION_FAILED_TO_PERSIST_COMMAND_CHANGES);
logWrapper.severe(CliStrings.SHARED_CONFIGURATION_FAILED_TO_PERSIST_COMMAND_CHANGES);
}
String debugInfo = commandResponse.getDebugInfo();
if (StringUtils.isNotBlank(debugInfo)) {
// TODO - Abhishek When debug is ON, log response in gfsh logs
// TODO - Abhishek handle \n better. Is it coming from GemFire formatter
debugInfo = debugInfo.replaceAll("\n\n\n", "\n");
debugInfo = debugInfo.replaceAll("\n\n", "\n");
debugInfo = debugInfo.replaceAll("\n", "\n[From Manager : " + commandResponse.getSender() + "]");
debugInfo = "[From Manager : " + commandResponse.getSender() + "]" + debugInfo;
LogWrapper.getInstance().info(debugInfo);
}
commandResult = ResultBuilder.fromJson((String) response);
}
Path tempFile = null;
if (response instanceof Path) {
tempFile = (Path) response;
}
// 3. Post Remote Execution
if (interceptor != null) {
Result postExecResult = interceptor.postExecution(parseResult, commandResult, tempFile);
if (postExecResult != null) {
if (Status.ERROR.equals(postExecResult.getStatus())) {
if (logWrapper.infoEnabled()) {
logWrapper.info("Post execution Result :: " + postExecResult);
}
} else if (logWrapper.fineEnabled()) {
logWrapper.fine("Post execution Result :: " + postExecResult);
}
commandResult = postExecResult;
}
}
return commandResult;
}
Aggregations