name = $name; $this->host = $host; $this->username = $username; $this->gateway = $gateway ?: new SecLibGateway($host, $auth, new Filesystem(), $timeout); } /** * Define a set of commands as a task. * * @param string $task * @param string|array $commands * * @return void */ public function define($task, $commands) { $this->tasks[$task] = $commands; return $this; } /** * Run a task against the connection. * * @param string $task * @param \Closure $callback * * @return void */ public function task($task, Closure $callback = null) { if (isset($this->tasks[$task])) { $this->run($this->tasks[$task], $callback); } } /** * Run a set of commands against the connection. * * @param string|array $commands * @param \Closure $callback * * @param int|null $timeout * @return void */ public function run($commands, Closure $callback = null, int $timeout = null) { // First, we will initialize the SSH gateway, and then format the commands so // they can be run. Once we have the commands formatted and the server is // ready to go we will just fire off these commands against the server. $gateway = $this->getGateway(); if ($timeout != null) { $gateway->setTimeout($timeout); } $callback = $this->getCallback($callback); $gateway->run($this->formatCommands($commands)); // After running the commands against the server, we will continue to ask for // the next line of output that is available, and write it them out using // our callback. Once we hit the end of output, we'll bail out of here. while (true) { if (is_null($line = $gateway->nextLine())) { break; } call_user_func($callback, $line, $this); } } /** * Get the gateway implementation. * * @throws \RuntimeException * * @return \Collective\Remote\GatewayInterface */ public function getGateway() { if (!$this->gateway->connected() && !$this->gateway->connect($this->username)) { throw new \RuntimeException('Unable to connect to remote server.'); } return $this->gateway; } /** * Get the display callback for the connection. * * @param \Closure|null $callback * * @return \Closure */ protected function getCallback($callback) { if (!is_null($callback)) { return $callback; } return function ($line) { $this->display($line); }; } /** * Display the given line using the default output. * * @param string $line * * @return void */ public function display($line) { $server = $this->username.'@'.$this->host; $lead = '['.$server.'] ('.$this->name.')'; $this->getOutput()->writeln($lead.' '.$line); } /** * Get the output implementation for the connection. * * @return \Symfony\Component\Console\Output\OutputInterface */ public function getOutput() { if (is_null($this->output)) { $this->output = new NullOutput(); } return $this->output; } /** * Set the output implementation. * * @param \Symfony\Component\Console\Output\OutputInterface $output * * @return void */ public function setOutput(OutputInterface $output) { $this->output = $output; } /** * Format the given command set. * * @param string|array $commands * * @return string */ protected function formatCommands($commands) { return is_array($commands) ? implode(' && ', $commands) : $commands; } /** * Download the contents of a remote file. * * @param string $remote * @param string $local * * @return void */ public function get($remote, $local) { $this->getGateway()->get($remote, $local); } /** * Get the contents of a remote file. * * @param string $remote * * @return string */ public function getString($remote) { return $this->getGateway()->getString($remote); } /** * Upload a local file to the server. * * @param string $local * @param string $remote * * @return void */ public function put($local, $remote) { $this->getGateway()->put($local, $remote); } /** * Upload a string to to the given file on the server. * * @param string $remote * @param string $contents * * @return void */ public function putString($remote, $contents) { $this->getGateway()->putString($remote, $contents); } /** * Check whether a given file exists on the server. * * @param string $remote * * @return bool */ public function exists($remote) { return $this->getGateway()->exists($remote); } /** * Rename a remote file. * * @param string $remote * @param string $newRemote * * @return bool */ public function rename($remote, $newRemote) { return $this->getGateway()->rename($remote, $newRemote); } /** * Delete a remote file from the server. * * @param string $remote * * @return bool */ public function delete($remote) { return $this->getGateway()->delete($remote); } /** * Get the exit status of the last command. * * @return int|bool */ public function status() { return $this->gateway->status(); } public function setTimeout($timeout) { $this->getGateway()->setTimeout($timeout); return $this; } }