Chris@5
|
1 <?php
|
Chris@5
|
2
|
Chris@5
|
3 namespace Consolidation\SiteProcess\Transport;
|
Chris@5
|
4
|
Chris@5
|
5 use Consolidation\SiteProcess\SiteProcess;
|
Chris@5
|
6 use Consolidation\SiteProcess\Util\Escape;
|
Chris@5
|
7 use Consolidation\SiteAlias\SiteAliasInterface;
|
Chris@5
|
8 use Consolidation\SiteProcess\Util\Shell;
|
Chris@5
|
9 use Consolidation\Config\ConfigInterface;
|
Chris@5
|
10
|
Chris@5
|
11 /**
|
Chris@5
|
12 * SshTransport knows how to wrap a command such that it runs on a remote
|
Chris@5
|
13 * system via the ssh cli.
|
Chris@5
|
14 */
|
Chris@5
|
15 class SshTransport implements TransportInterface
|
Chris@5
|
16 {
|
Chris@5
|
17 protected $tty;
|
Chris@5
|
18 protected $siteAlias;
|
Chris@5
|
19
|
Chris@5
|
20 public function __construct(SiteAliasInterface $siteAlias)
|
Chris@5
|
21 {
|
Chris@5
|
22 $this->siteAlias = $siteAlias;
|
Chris@5
|
23 }
|
Chris@5
|
24
|
Chris@5
|
25 /**
|
Chris@5
|
26 * @inheritdoc
|
Chris@5
|
27 */
|
Chris@5
|
28 public function configure(SiteProcess $process)
|
Chris@5
|
29 {
|
Chris@5
|
30 $this->tty = $process->isTty();
|
Chris@5
|
31 }
|
Chris@5
|
32
|
Chris@5
|
33 /**
|
Chris@5
|
34 * inheritdoc
|
Chris@5
|
35 */
|
Chris@5
|
36 public function wrap($args)
|
Chris@5
|
37 {
|
Chris@5
|
38 $transport = ['ssh'];
|
Chris@5
|
39 $transportOptions = $this->getTransportOptions();
|
Chris@5
|
40 $commandToExecute = $this->getCommandToExecute($args);
|
Chris@5
|
41
|
Chris@5
|
42 return array_merge(
|
Chris@5
|
43 $transport,
|
Chris@5
|
44 $transportOptions,
|
Chris@5
|
45 $commandToExecute
|
Chris@5
|
46 );
|
Chris@5
|
47 }
|
Chris@5
|
48
|
Chris@5
|
49 /**
|
Chris@5
|
50 * @inheritdoc
|
Chris@5
|
51 */
|
Chris@5
|
52 public function addChdir($cd_remote, $args)
|
Chris@5
|
53 {
|
Chris@5
|
54 return array_merge(
|
Chris@5
|
55 [
|
Chris@5
|
56 'cd',
|
Chris@5
|
57 $cd_remote,
|
Chris@5
|
58 Shell::op('&&'),
|
Chris@5
|
59 ],
|
Chris@5
|
60 $args
|
Chris@5
|
61 );
|
Chris@5
|
62 }
|
Chris@5
|
63
|
Chris@5
|
64 /**
|
Chris@5
|
65 * getTransportOptions returns the transport options for the tranport
|
Chris@5
|
66 * mechanism itself
|
Chris@5
|
67 */
|
Chris@5
|
68 protected function getTransportOptions()
|
Chris@5
|
69 {
|
Chris@5
|
70 $transportOptions = [
|
Chris@5
|
71 Shell::preEscaped($this->siteAlias->get('ssh.options', '-o PasswordAuthentication=no')),
|
Chris@5
|
72 $this->siteAlias->remoteHostWithUser(),
|
Chris@5
|
73 ];
|
Chris@5
|
74 if ($this->tty) {
|
Chris@5
|
75 array_unshift($transportOptions, '-t');
|
Chris@5
|
76 }
|
Chris@5
|
77 return $transportOptions;
|
Chris@5
|
78 }
|
Chris@5
|
79
|
Chris@5
|
80 /**
|
Chris@5
|
81 * getCommandToExecute processes the arguments for the command to
|
Chris@5
|
82 * be executed such that they are appropriate for the transport mechanism.
|
Chris@5
|
83 */
|
Chris@5
|
84 protected function getCommandToExecute($args)
|
Chris@5
|
85 {
|
Chris@5
|
86 // Escape each argument for the target system and then join
|
Chris@5
|
87 $args = Escape::argsForSite($this->siteAlias, $args);
|
Chris@5
|
88 $commandToExecute = implode(' ', $args);
|
Chris@5
|
89
|
Chris@5
|
90 return [$commandToExecute];
|
Chris@5
|
91 }
|
Chris@5
|
92 }
|