From 2469aaed02281c58173d3cfbde88482690c3d6af Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 28 Sep 2015 18:01:53 +0200 Subject: Allow only one running instance of critical tasks --- .../openslx/taskmanager/tasks/BackupRestore.java | 8 ++++++++ .../org/openslx/taskmanager/tasks/CompileIPxe.java | 23 ++++++++++++++++------ .../openslx/taskmanager/tasks/LdadpLauncher.java | 8 ++++++++ .../openslx/taskmanager/tasks/MountVmStore.java | 9 +++++++++ .../org/openslx/taskmanager/tasks/Systemctl.java | 7 +++++++ 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openslx/taskmanager/tasks/BackupRestore.java b/src/main/java/org/openslx/taskmanager/tasks/BackupRestore.java index 20f5363..9501e43 100644 --- a/src/main/java/org/openslx/taskmanager/tasks/BackupRestore.java +++ b/src/main/java/org/openslx/taskmanager/tasks/BackupRestore.java @@ -2,6 +2,7 @@ package org.openslx.taskmanager.tasks; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import org.openslx.satserver.util.Constants; import org.openslx.taskmanager.api.SystemCommandTask; @@ -20,6 +21,8 @@ public class BackupRestore extends SystemCommandTask private boolean restoreDozmod; private Output status = new Output(); + + private static AtomicBoolean isRunning = new AtomicBoolean(); @Override protected boolean initTask() @@ -44,6 +47,10 @@ public class BackupRestore extends SystemCommandTask @Override protected String[] initCommandLine() { + if (!isRunning.compareAndSet( false, true )) { + status.addMessage( "Another operation is already in progress." ); + return null; + } List args = new ArrayList<>(); args.add( "/usr/bin/sudo" ); args.add( "-n" ); @@ -67,6 +74,7 @@ public class BackupRestore extends SystemCommandTask @Override protected boolean processEnded( int exitCode ) { + isRunning.set( false ); return exitCode == 0 && ( mode.equals( "restore" ) || status.backupFile != null ); } diff --git a/src/main/java/org/openslx/taskmanager/tasks/CompileIPxe.java b/src/main/java/org/openslx/taskmanager/tasks/CompileIPxe.java index 70ae195..f3ebc82 100644 --- a/src/main/java/org/openslx/taskmanager/tasks/CompileIPxe.java +++ b/src/main/java/org/openslx/taskmanager/tasks/CompileIPxe.java @@ -4,6 +4,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; @@ -29,6 +30,8 @@ public class CompileIPxe extends AbstractTask private Output status = new Output(); + private static AtomicBoolean isRunning = new AtomicBoolean(); + @Override protected boolean initTask() { @@ -49,12 +52,20 @@ public class CompileIPxe extends AbstractTask @Override protected boolean execute() { - boolean ret = true; - if ( !updateMenu() ) - ret = false; - if ( !updateIpxe() ) - ret = false; - return ret; + if (!isRunning.compareAndSet( false, true )) { + status.error = "Another operation is already in progress."; + return false; + } + try { + boolean ret = true; + if ( !updateMenu() ) + ret = false; + if ( !updateIpxe() ) + ret = false; + return ret; + } finally { + isRunning.set( false ); + } } private boolean updateMenu() diff --git a/src/main/java/org/openslx/taskmanager/tasks/LdadpLauncher.java b/src/main/java/org/openslx/taskmanager/tasks/LdadpLauncher.java index 725b7ab..34f7b07 100644 --- a/src/main/java/org/openslx/taskmanager/tasks/LdadpLauncher.java +++ b/src/main/java/org/openslx/taskmanager/tasks/LdadpLauncher.java @@ -3,6 +3,7 @@ package org.openslx.taskmanager.tasks; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import org.openslx.satserver.util.Constants; import org.openslx.taskmanager.api.SystemCommandTask; @@ -15,6 +16,8 @@ public class LdadpLauncher extends SystemCommandTask private int[] ids = null; private Output status = new Output(); + + private static AtomicBoolean isRunning = new AtomicBoolean(); @Override protected boolean initTask() @@ -30,6 +33,10 @@ public class LdadpLauncher extends SystemCommandTask @Override protected String[] initCommandLine() { + if (!isRunning.compareAndSet( false, true )) { + status.addMessage( "Another operation is already in progress." ); + return null; + } List args = new ArrayList<>(); args.addAll( Arrays.asList( new String[] { "/usr/bin/sudo", @@ -48,6 +55,7 @@ public class LdadpLauncher extends SystemCommandTask @Override protected boolean processEnded( int exitCode ) { + isRunning.set( false ); return exitCode == 0; } diff --git a/src/main/java/org/openslx/taskmanager/tasks/MountVmStore.java b/src/main/java/org/openslx/taskmanager/tasks/MountVmStore.java index ded2a1f..5d075d6 100644 --- a/src/main/java/org/openslx/taskmanager/tasks/MountVmStore.java +++ b/src/main/java/org/openslx/taskmanager/tasks/MountVmStore.java @@ -1,5 +1,7 @@ package org.openslx.taskmanager.tasks; +import java.util.concurrent.atomic.AtomicBoolean; + import org.openslx.satserver.util.Constants; import org.openslx.taskmanager.api.SystemCommandTask; @@ -17,6 +19,8 @@ public class MountVmStore extends SystemCommandTask private String password = null; private Output status = new Output(); + + private static AtomicBoolean isRunning = new AtomicBoolean(); @Override protected boolean initTask() @@ -37,6 +41,10 @@ public class MountVmStore extends SystemCommandTask @Override protected String[] initCommandLine() { + if (!isRunning.compareAndSet( false, true )) { + status.addMessage("Another operation is already in progress."); + return null; + } return new String[] { "/usr/bin/sudo", "-n", @@ -52,6 +60,7 @@ public class MountVmStore extends SystemCommandTask @Override protected boolean processEnded( int exitCode ) { + isRunning.set( false ); if ( exitCode != 0 ) status.addMessage( "Failed with exit code " + exitCode ); return exitCode == 0; diff --git a/src/main/java/org/openslx/taskmanager/tasks/Systemctl.java b/src/main/java/org/openslx/taskmanager/tasks/Systemctl.java index 43df01b..a63ece3 100644 --- a/src/main/java/org/openslx/taskmanager/tasks/Systemctl.java +++ b/src/main/java/org/openslx/taskmanager/tasks/Systemctl.java @@ -28,6 +28,7 @@ public class Systemctl extends SystemCommandTask case "stop": case "enable": case "disable": + case "restart": break; default: status.addMsg( "Unknown operation: " + operation ); @@ -36,6 +37,12 @@ public class Systemctl extends SystemCommandTask switch ( service ) { case "dmsd": break; + case "taskmanager": + if ( !operation.equals( "restart" ) ) { + status.addMsg( "Error: Service taskmanager can only be restarted." ); + return null; + } + break; default: status.addMsg( "Unknown service: " + operation ); return null; -- cgit v1.2.3-55-g7522