diff options
Diffstat (limited to 'api/src/main')
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 ) |