summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/taskmanager/tasks/BackupRestore.java
blob: 32a5beb8abfe102535e6ed5a040feb2403c4c000 (plain) (tree)
1
2
3
4
5
6

                                      

                           
                                                 
 










                                                     



                                       

                                             

                                                                     
















                                                                                
                                          





                                            



                                                                                         

















                                                                          




                                                      
                                       


































                                                                                                  
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<String> 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;
			}
		}
	}

}