1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\App;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Phrase;
use Magento\Framework\Shell\CommandRendererInterface;
use Magento\Framework\Shell\Driver;
use Magento\Framework\ShellInterface;
use Psr\Log\LoggerInterface;
/**
* Class is separate from \Magento|Framework\Shell because logging behavior is different, and relies on ObjectManager
* being available.
*/
class Shell implements ShellInterface
{
/**
* @var \Magento\Framework\Shell\Driver
*/
private $driver;
/**
* @var \Psr\Log\LoggerInterface
*/
private $logger;
/**
* @param Driver $driver
* @param CommandRendererInterface $commandRenderer
* @param LoggerInterface $logger
*/
public function __construct(
Driver $driver,
LoggerInterface $logger
) {
$this->driver = $driver;
$this->logger = $logger;
}
/**
* Execute a command through the command line, passing properly escaped arguments
*
* @param string $command Command with optional argument markers '%s'
* @param string[] $arguments Argument values to substitute markers with
* @throws \Magento\Framework\Exception\LocalizedException If a command returns non-zero exit code
* @return string
*/
public function execute($command, array $arguments = [])
{
try {
$response = $this->driver->execute($command, $arguments);
} catch (LocalizedException $e) {
$this->logger->error($e->getLogMessage());
throw $e;
}
$escapedCommand = $response->getEscapedCommand();
$output = $response->getOutput();
$exitCode = $response->getExitCode();
$logEntry = $escapedCommand . PHP_EOL . $output;
if ($exitCode) {
$this->logger->error($logEntry);
$commandError = new \Exception($output, $exitCode);
throw new LocalizedException(
new Phrase("Command returned non-zero exit code:\n`%1`", [$command]),
$commandError
);
}
$this->logger->info($logEntry);
return $output;
}
}