-
Notifications
You must be signed in to change notification settings - Fork 83
/
Copy pathShell.php
113 lines (99 loc) · 2.77 KB
/
Shell.php
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\MagentoCloud\Shell;
use Magento\MagentoCloud\App\Logger\Sanitizer;
use Magento\MagentoCloud\Filesystem\SystemList;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Exception\LogicException;
/**
* @inheritdoc
*/
class Shell implements ShellInterface
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var SystemList
*/
private $systemList;
/**
* @var ProcessFactory
*/
private $processFactory;
/**
* @var Sanitizer
*/
private $sanitizer;
/**
* @param LoggerInterface $logger
* @param SystemList $systemList
* @param ProcessFactory $processFactory
* @param Sanitizer $sanitizer
*/
public function __construct(
LoggerInterface $logger,
SystemList $systemList,
ProcessFactory $processFactory,
Sanitizer $sanitizer
) {
$this->logger = $logger;
$this->systemList = $systemList;
$this->processFactory = $processFactory;
$this->sanitizer = $sanitizer;
}
/**
* {@inheritDoc}
*
* If your command contains pipe please use the next construction for correct logging:
*
* ```php
* $this->shell->execute('/bin/bash -c "set -o pipefail; firstCommand | secondCommand"');
* ```
*
* `commandline` should be always a string as symfony/process package v2.x doesn't support array-type `commandLine`
*/
public function execute(string $command, array $args = []): ProcessInterface
{
try {
if ($args) {
$command .= ' ' . implode(' ', array_map('escapeshellarg', $args));
}
$process = $this->processFactory->create([
'command' => $command,
'cwd' => $this->systemList->getMagentoRoot(),
'timeout' => null
]);
$this->logger->debug($process->getCommandLine());
$process->execute();
} catch (ProcessException $e) {
throw new ShellException(
$this->sanitizer->sanitize($e->getMessage()),
$e->getCode()
);
}
$this->handleOutput($process);
return $process;
}
/**
* Logs command output
*
* @param ProcessInterface $process
* @return void
*/
private function handleOutput(ProcessInterface $process)
{
try {
if ($output = $process->getOutput()) {
$this->logger->debug($output);
}
} catch (LogicException $exception) {
$this->logger->error('Can\'t get command output: ' . $exception->getMessage());
}
}
}