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; import com.google.gson.annotations.Expose; public class BackupRestore extends SystemCommandTask { @Expose private String mode; @Expose private String backupFile; @Expose private boolean restoreOpenslx; @Expose private boolean restoreDozmod; private Output status = new Output(); private static AtomicBoolean isRunning = new AtomicBoolean(); @Override protected boolean initTask() { this.setStatusObject( this.status ); if ( mode == null ) { status.addMessage( "Mode given." ); return false; } if ( !mode.equals( "backup" ) && !mode.equals( "restore" ) ) { status.addMessage( "Invalid mode: " + mode ); return false; } if ( mode.equals( "restore" ) && backupFile == null ) { status.addMessage( "No backup file given to restore!" ); return false; } this.timeoutSeconds = 180; return true; } @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" ); args.add( "-u" ); args.add( "root" ); args.add( Constants.BASEDIR + "/scripts/system-" + mode ); if ( mode.equals( "restore" ) ) { if ( backupFile != null ) { args.add( backupFile ); } if ( restoreDozmod ) { args.add( "dozmod" ); } if ( restoreOpenslx ) { args.add( "openslx" ); } } return args.toArray( new String[ args.size() ] ); } @Override protected boolean processEnded( int exitCode ) { isRunning.set( false ); return exitCode == 0 && ( mode.equals( "restore" ) || status.backupFile != null ); } @Override protected void processStdOut( String line ) { if ( line.startsWith( "Location: " ) ) { status.backupFile = line.substring( 10 ); } else { status.addMessage( line ); } } @Override protected void processStdErr( String line ) { status.addMessage( line ); } class Output { private String messages = null; public String backupFile = null; private void addMessage( String str ) { if ( messages == null ) { messages = str; } else { messages += "\n" + str; } } } }