mirror of
				https://github.com/hauke68/Magallanes.git
				synced 2025-11-04 00:50:18 +01:00 
			
		
		
		
	Added task to execute arbitrary commands
This commit is contained in:
		
							parent
							
								
									b36f90e80a
								
							
						
					
					
						commit
						50354a3624
					
				
							
								
								
									
										84
									
								
								src/Task/BuiltIn/ExecTask.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/Task/BuiltIn/ExecTask.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
			
		||||
<?php
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the Magallanes package.
 | 
			
		||||
 *
 | 
			
		||||
 * (c) Andrés Montañez <andres@andresmontanez.com>
 | 
			
		||||
 *
 | 
			
		||||
 * For the full copyright and license information, please view the LICENSE
 | 
			
		||||
 * file that was distributed with this source code.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
namespace Mage\Task\BuiltIn;
 | 
			
		||||
 | 
			
		||||
use Mage\Task\Exception\ErrorException;
 | 
			
		||||
use Mage\Task\AbstractTask;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Exec task. Allows you to execute arbitrary commands.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Yanick Witschi <https://github.com/Toflar>
 | 
			
		||||
 */
 | 
			
		||||
class ExecTask extends AbstractTask
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getName()
 | 
			
		||||
    {
 | 
			
		||||
        return 'exec';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return string
 | 
			
		||||
     */
 | 
			
		||||
    public function getDescription()
 | 
			
		||||
    {
 | 
			
		||||
        $options = $this->getOptions();
 | 
			
		||||
 | 
			
		||||
        if ('' !== $options['descr']) {
 | 
			
		||||
            return (string) $options['descr'];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return '[Exec] Executing custom command';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return bool
 | 
			
		||||
     *
 | 
			
		||||
     * @throws ErrorException
 | 
			
		||||
     */
 | 
			
		||||
    public function execute()
 | 
			
		||||
    {
 | 
			
		||||
        $options = $this->getOptions();
 | 
			
		||||
 | 
			
		||||
        if ('' === $options['cmd']) {
 | 
			
		||||
            throw new ErrorException('What about if you gave me a command to execute?');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // If not jailed, it must run as remote command
 | 
			
		||||
        if (false === $options['jail']) {
 | 
			
		||||
            $process = $this->runtime->runRemoteCommand($options['cmd'], false, $options['timeout']);
 | 
			
		||||
            return $process->isSuccessful();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $process = $this->runtime->runCommand($options['cmd'], $options['timeout']);
 | 
			
		||||
        return $process->isSuccessful();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return array
 | 
			
		||||
     */
 | 
			
		||||
    protected function getOptions()
 | 
			
		||||
    {
 | 
			
		||||
        $options = array_merge([
 | 
			
		||||
                'cmd' => '',
 | 
			
		||||
                'descr' => '',
 | 
			
		||||
                'jail' => true,
 | 
			
		||||
                'timeout' => 120
 | 
			
		||||
            ],
 | 
			
		||||
            $this->options
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return $options;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										90
									
								
								tests/Command/BuiltIn/ExecTaskTest.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								tests/Command/BuiltIn/ExecTaskTest.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,90 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
namespace Mage\Tests\Command\BuiltIn;
 | 
			
		||||
 | 
			
		||||
use Mage\Runtime\Runtime;
 | 
			
		||||
use Mage\Task\BuiltIn\ExecTask;
 | 
			
		||||
use PHPUnit_Framework_TestCase as TestCase;
 | 
			
		||||
use Symfony\Component\Process\Process;
 | 
			
		||||
 | 
			
		||||
class ExecTaskTest extends TestCase
 | 
			
		||||
{
 | 
			
		||||
    public function testBasics()
 | 
			
		||||
    {
 | 
			
		||||
        $task = new ExecTask();
 | 
			
		||||
        $this->assertSame('exec', $task->getName());
 | 
			
		||||
        $this->assertSame('[Exec] Executing custom command', $task->getDescription());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testCustomDescription()
 | 
			
		||||
    {
 | 
			
		||||
        $task = new ExecTask();
 | 
			
		||||
        $task->setOptions(['descr' => '[My project] This is my wonderful task']);
 | 
			
		||||
        $this->assertSame('[My project] This is my wonderful task', $task->getDescription());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @expectedException \Mage\Task\Exception\ErrorException
 | 
			
		||||
     */
 | 
			
		||||
    public function testNoCommandProvided()
 | 
			
		||||
    {
 | 
			
		||||
        $task = new ExecTask();
 | 
			
		||||
        $task->execute();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testNonJailedCommand()
 | 
			
		||||
    {
 | 
			
		||||
        $runtime = $this->getMockBuilder(Runtime::class)
 | 
			
		||||
            ->setMethods(['runRemoteCommand'])
 | 
			
		||||
            ->getMock();
 | 
			
		||||
 | 
			
		||||
        $runtime
 | 
			
		||||
            ->expects($this->once())
 | 
			
		||||
            ->method('runRemoteCommand')
 | 
			
		||||
            ->with('rm -rf /')
 | 
			
		||||
            ->willReturn($this->mockProcess(true));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        $task = $this->getTask($runtime);
 | 
			
		||||
        $task->setOptions(['cmd' => 'rm -rf /', 'jail' => false]);
 | 
			
		||||
        $this->assertTrue($task->execute());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testRegularCommand()
 | 
			
		||||
    {
 | 
			
		||||
        $runtime = $this->getMockBuilder(Runtime::class)
 | 
			
		||||
            ->setMethods(['runCommand'])
 | 
			
		||||
            ->getMock();
 | 
			
		||||
 | 
			
		||||
        $runtime
 | 
			
		||||
            ->expects($this->once())
 | 
			
		||||
            ->method('runCommand')
 | 
			
		||||
            ->with('rm -rf /', 10)
 | 
			
		||||
            ->willReturn($this->mockProcess(true));
 | 
			
		||||
 | 
			
		||||
        $task = $this->getTask($runtime);
 | 
			
		||||
        $task->setOptions(['cmd' => 'rm -rf /', 'timeout' => 10]);
 | 
			
		||||
        $task->execute();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function getTask($runtime)
 | 
			
		||||
    {
 | 
			
		||||
        $task = new ExecTask();
 | 
			
		||||
        $task->setRuntime($runtime);
 | 
			
		||||
 | 
			
		||||
        return $task;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private function mockProcess($successful)
 | 
			
		||||
    {
 | 
			
		||||
        $process = $this->getMockBuilder(Process::class)
 | 
			
		||||
            ->disableOriginalConstructor()
 | 
			
		||||
            ->getMock();
 | 
			
		||||
        $process
 | 
			
		||||
            ->expects($this->any())
 | 
			
		||||
            ->method('isSuccessful')
 | 
			
		||||
            ->willReturn($successful);
 | 
			
		||||
 | 
			
		||||
        return $process;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user