package org.openslx.taskmanager.tasks; import java.util.ArrayList; import java.util.List; import org.openslx.taskmanager.api.SystemCommandTask; import com.google.gson.annotations.Expose; public class Systemctl extends SystemCommandTask { /** * What to do: start, stop... */ @Expose private String operation; @Expose String service; private StatusObject status = new StatusObject(); @Override protected String[] initCommandLine() { boolean allowAll = false; boolean asRoot = true; // Check if operation is allowed switch ( operation ) { case "start": case "stop": case "enable": case "disable": case "restart": case "status": break; case "show": case "is-active": allowAll = true; asRoot = false; break; default: status.addMsg( "Unknown operation: " + operation ); return null; } if ( !allowAll ) { // Check if service is allowed switch ( service ) { case "dmsd": case "dnbd3-server": 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; } } List params = new ArrayList<>(); if ( asRoot ) { params.add( "/usr/bin/sudo" ); params.add( "-n" ); params.add( "-u" ); params.add( "root" ); } params.add( "/bin/systemctl" ); params.add( operation ); params.add( service ); this.timeoutSeconds = 15; return params.toArray( new String[ params.size() ] ); } private boolean errorIfNull( String check, String message ) { if ( check == null ) status.addMsg( message ); return check == null; } @Override protected boolean processEnded( int exitCode ) { return exitCode == 0; } @Override protected void processStdOut( String line ) { status.addMsg( line ); } @Override protected void processStdErr( String line ) { status.addMsg( line ); } @Override protected boolean initTask() { this.setStatusObject( this.status ); return !errorIfNull( operation, "No operation given" ); } class StatusObject { private String messages = ""; public void addMsg( String str ) { messages = messages + "\n" + str; } } }