package org.openslx.taskmanager.tasks; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import org.openslx.satserver.util.Constants; import org.openslx.satserver.util.Util; import org.openslx.taskmanager.api.SystemCommandTask; import com.btr.proxy.util.Logger; import com.google.gson.annotations.Expose; public class MountVmStore extends SystemCommandTask { @Expose private String address = null; @Expose private String type = null; @Expose private String opts = null; @Expose private String username = null; @Expose private String password = null; @Expose private boolean localNfs = true; private Output status = new Output(); private static AtomicBoolean isRunning = new AtomicBoolean(); @Override protected boolean initTask() { this.setStatusObject( this.status ); if ( this.address == null || this.type == null ) { status.addMessage( "Address or type not given." ); return false; } if ( this.username == null ) this.username = ""; if ( this.password == null ) this.password = ""; this.timeoutSeconds = 60; return true; } @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", "-u", "root", Constants.BASEDIR + "/scripts/mount-store", "images", this.address, }; } @Override protected void initEnvironment( Map environment ) { environment.put( "TM_USERNAME", this.username ); environment.put( "TM_PASSWORD", this.password ); environment.put( "TM_NOLOCALNFS", this.localNfs ? "" : "1" ); if ( !Util.isEmpty( this.opts ) ) { environment.put( "TM_MOUNT_OPTIONS", this.opts ); } } @Override protected boolean processEnded( int exitCode ) { isRunning.set( false ); if ( exitCode != 0 ) status.addMessage( "Failed with exit code " + exitCode ); status.exitCode = exitCode; return exitCode == 0; } @Override protected void processStdOut( String line ) { status.addMessage( line ); } @Override protected void processStdErr( String line ) { status.addMessage( line ); } class Output { public String messages = null; public int exitCode = -111; private void addMessage( String str ) { if ( messages == null ) { messages = str; } else { messages += "\n" + str; } } } }