1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.openr66.context.task;
21
22 import org.apache.commons.exec.CommandLine;
23 import org.apache.commons.exec.DefaultExecutor;
24 import org.apache.commons.exec.ExecuteWatchdog;
25 import org.apache.commons.exec.PumpStreamHandler;
26 import org.waarp.common.logging.WaarpLogger;
27 import org.waarp.common.logging.WaarpLoggerFactory;
28 import org.waarp.openr66.context.R66Session;
29 import org.waarp.openr66.context.task.localexec.LocalExecClient;
30 import org.waarp.openr66.protocol.configuration.Configuration;
31
32 import java.io.PipedInputStream;
33 import java.io.PipedOutputStream;
34
35
36
37
38 public class ExecTask extends AbstractExecTask {
39
40
41
42
43 private static final WaarpLogger logger =
44 WaarpLoggerFactory.getLogger(ExecTask.class);
45
46
47
48
49
50
51
52 public ExecTask(final String argRule, final int delay,
53 final String argTransfer, final R66Session session) {
54 super(TaskType.EXEC, delay, argRule, argTransfer, session);
55 }
56
57 @Override
58 public final void run() {
59
60
61
62
63
64 logger.debug("Exec with " + argRule + ':' + argTransfer + " and {}",
65 session);
66 final String finalname = applyTransferSubstitutions(argRule);
67
68
69 if (Configuration.configuration.isUseLocalExec() && useLocalExec) {
70 final LocalExecClient localExecClient = new LocalExecClient();
71 if (localExecClient.connect()) {
72 localExecClient.runOneCommand(finalname, delay, waitForValidation,
73 futureCompletion);
74 localExecClient.disconnect();
75 return;
76 }
77 }
78
79 final PrepareCommandExec prepareCommandExec =
80 new PrepareCommandExec(this, finalname, true,
81 waitForValidation).invoke();
82 if (prepareCommandExec.isError()) {
83 return;
84 }
85 final CommandLine commandLine = prepareCommandExec.getCommandLine();
86 final DefaultExecutor defaultExecutor =
87 prepareCommandExec.getDefaultExecutor();
88 final PipedInputStream inputStream = prepareCommandExec.getInputStream();
89 final PipedOutputStream outputStream = prepareCommandExec.getOutputStream();
90 final PumpStreamHandler pumpStreamHandler =
91 prepareCommandExec.getPumpStreamHandler();
92 final ExecuteWatchdog watchdog = prepareCommandExec.getWatchdog();
93
94 if (!waitForValidation) {
95
96 futureCompletion.setSuccess();
97 logger.info("Exec will start but no WAIT with {}", commandLine);
98 }
99
100 final ExecuteCommand executeCommand =
101 new ExecuteCommand(this, commandLine, defaultExecutor, inputStream,
102 outputStream, pumpStreamHandler, null).invoke();
103 if (executeCommand.isError()) {
104 return;
105 }
106 int status = executeCommand.getStatus();
107
108 if (defaultExecutor.isFailure(status) && watchdog != null &&
109 watchdog.killedProcess()) {
110
111 logger.error("Exec is in Time Out");
112 status = -1;
113 }
114 if (status == 0) {
115 if (waitForValidation) {
116 futureCompletion.setSuccess();
117 }
118 logger.info("Exec OK with {}", commandLine);
119 } else if (status == 1) {
120 logger.warn("Exec in warning with " + commandLine);
121 if (waitForValidation) {
122 futureCompletion.setSuccess();
123 }
124 } else {
125 logger.error("Status: " + status + " Exec in error with " + commandLine);
126 if (waitForValidation) {
127 futureCompletion.cancel();
128 }
129 }
130 }
131
132 @Override
133 final void finalizeFromError(final Runnable threadReader, final int status,
134 final CommandLine commandLine,
135 final Exception e) {
136 logger.error("Status: " + status + " Exec in error with " + commandLine +
137 " returns " + e.getMessage());
138 if (waitForValidation) {
139 futureCompletion.setFailure(e);
140 }
141 }
142 }