summaryrefslogtreecommitdiffstats
path: root/api/src
diff options
context:
space:
mode:
Diffstat (limited to 'api/src')
-rw-r--r--api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java7
-rw-r--r--api/src/main/java/org/openslx/taskmanager/api/Environment.java69
-rw-r--r--api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java41
3 files changed, 94 insertions, 23 deletions
diff --git a/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java b/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
index 18cbe76..43240ce 100644
--- a/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
+++ b/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
@@ -2,7 +2,8 @@ package org.openslx.taskmanager.api;
import java.util.UUID;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.openslx.taskmanager.api.TaskStatus.StatusCode;
import com.google.gson.annotations.Expose;
@@ -11,7 +12,7 @@ public abstract class AbstractTask implements Runnable
{
private static final long RELEASE_DELAY = 10l * 60l * 1000l;
- private static final Logger LOG = Logger.getLogger( AbstractTask.class );
+ private static final Logger LOG = LogManager.getLogger( AbstractTask.class );
/*
* To be set from task invocation (json data)
@@ -199,7 +200,7 @@ public abstract class AbstractTask implements Runnable
this.status.statusCode = StatusCode.PARENT_FAILED;
LOG.debug( "Parent " + this.parentTask + " of " + this.id + " failed." );
}
- this.parentTask = null;
+ this.parent = null;
break;
default:
break;
diff --git a/api/src/main/java/org/openslx/taskmanager/api/Environment.java b/api/src/main/java/org/openslx/taskmanager/api/Environment.java
new file mode 100644
index 0000000..e5705db
--- /dev/null
+++ b/api/src/main/java/org/openslx/taskmanager/api/Environment.java
@@ -0,0 +1,69 @@
+package org.openslx.taskmanager.api;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ * Holds the environment that tasks running a system command *should*
+ * use. The environment is read from a config file.
+ */
+public class Environment
+{
+
+ private static final Logger log = LogManager.getLogger( Environment.class );
+
+ private static Map<String, String> env = null;
+
+ public static boolean load( String fileName )
+ {
+ if ( env != null )
+ throw new RuntimeException( "Already loaded" );
+ try {
+ Pattern regex = Pattern.compile( "^([a-zA-Z0-9_]+)(|=.*)$" );
+ FileReader fileReader = new FileReader( fileName );
+ BufferedReader bufferedReader = new BufferedReader( fileReader );
+
+ Map<String, String> env = new LinkedHashMap<>();
+ String line = null;
+ while ( ( line = bufferedReader.readLine() ) != null ) {
+ Matcher m = regex.matcher( line );
+ if ( !m.matches() )
+ continue;
+ String name = m.group( 1 );
+ String value = m.group( 2 );
+ if ( value.isEmpty() ) {
+ value = System.getenv( name );
+ } else {
+ value = value.substring( 1 );
+ }
+ if ( value != null ) {
+ env.put( name, value );
+ }
+ }
+
+ bufferedReader.close();
+
+ Environment.env = Collections.unmodifiableMap( env );
+ log.info( "Loaded " + env.size() + " environment lines." );
+ } catch ( IOException e ) {
+ log.info( "Could not load environment definition from " + fileName + ". Processes might use the same environment as this thread." );
+ return false;
+ }
+ return true;
+ }
+
+ public static Map<String, String> get()
+ {
+ return env;
+ }
+
+}
diff --git a/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java b/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
index 18c8ecc..4754dca 100644
--- a/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
+++ b/api/src/main/java/org/openslx/taskmanager/api/SystemCommandTask.java
@@ -7,13 +7,15 @@ import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
public abstract class SystemCommandTask extends AbstractTask
{
- private static final Logger log = Logger.getLogger( SystemCommandTask.class );
+ private static final Logger log = LogManager.getLogger( SystemCommandTask.class );
private String[] command = null;
@@ -39,8 +41,8 @@ public abstract class SystemCommandTask extends AbstractTask
if ( command == null || command.length == 0 ) {
return processEnded( -1 );
}
- for (String a : command) {
- if (a == null) {
+ for ( String a : command ) {
+ if ( a == null ) {
log.warn( "An argument from initCommandLine is null: " + Arrays.toString( command ) );
return processEnded( -5 );
}
@@ -48,7 +50,12 @@ public abstract class SystemCommandTask extends AbstractTask
ProcessBuilder pb = new ProcessBuilder( command );
pb.directory( new File( "/" ) );
- initEnvironment( pb.environment() );
+ Map<String, String> env = pb.environment();
+ if ( Environment.get() != null ) {
+ env.clear();
+ env.putAll( Environment.get() );
+ }
+ initEnvironment( env );
try {
@@ -104,23 +111,15 @@ public abstract class SystemCommandTask extends AbstractTask
// Wait for everything
int retval = 124; // Default to 124, which is what the timeout util does
- if ( this.timeoutSeconds <= 0 ) {
- retval = process.waitFor();
- } else {
- int togo = timeoutSeconds * 10;
- while ( togo-- > 0 ) {
- try {
+ try {
+ if ( this.timeoutSeconds <= 0 ) {
+ retval = process.waitFor();
+ } else {
+ if ( process.waitFor( this.timeoutSeconds, TimeUnit.SECONDS ) ) {
retval = process.exitValue();
- break;
- } catch ( IllegalThreadStateException e1 ) {
- // Still running....
- try {
- Thread.sleep( 100 );
- } catch ( Exception e2 ) {
- // Bummer....
- }
}
}
+ } catch ( IllegalThreadStateException e1 ) {
}
try {
stdout.join( 500 );
@@ -149,8 +148,9 @@ public abstract class SystemCommandTask extends AbstractTask
Thread.currentThread().interrupt();
return false;
} finally {
- if ( process != null )
+ if ( process != null ) {
process.destroy();
+ }
}
}
@@ -211,6 +211,7 @@ public abstract class SystemCommandTask extends AbstractTask
/**
* Override this to modify the environment of the process to be started.
+ *
* @param environment
*/
protected void initEnvironment( Map<String, String> environment )