--- /dev/null
+<?php
+
+namespace Cubeist\Net;
+class SSH2
+{
+
+ protected $_host;
+ protected $_username;
+ protected $_password;
+ protected $_port = 22;
+ protected $_key = null;
+ protected $_connection = null;
+ protected $_sftp = null;
+
+ public function __construct($host, $username, $password, $port = 22)
+ {
+ $this->setHost($host)
+ ->setUsername($username)
+ ->setPassword($password)
+ ->setPort($port);
+ }
+
+ public function getHost()
+ {
+ return $this->_host;
+ }
+
+ public function getUsername()
+ {
+ return $this->_username;
+ }
+
+ public function getPassword()
+ {
+ return $this->_password;
+ }
+
+ public function getPort()
+ {
+ return $this->_port;
+ }
+
+ public function setPort($port)
+ {
+ $this->_port = $port;
+ return $this;
+ }
+
+ public function setHost($host)
+ {
+ $this->_host = $host;
+ return $this;
+ }
+
+ public function setUsername($username)
+ {
+ $this->_username = $username;
+ return $this;
+ }
+
+ public function setPassword($password)
+ {
+ $this->_password = $password;
+ return $this;
+ }
+
+ public function _connect()
+ {
+ if (is_null($this->_connection)) {
+ $this->_connection = ssh2_connect($this->getHost(), $this->getPort());
+ ssh2_auth_password($this->_connection, $this->getUsername(), $this->getPassword());
+ }
+ return $this->_connection;
+ }
+
+ public function getSFTPConnection()
+ {
+ if (is_null($this->_sftp)) {
+ $this->_connect();
+ $this->_sftp = ssh2_sftp($this->_connection);
+ }
+ return $this->_sftp;
+ }
+
+ public function getSFTPWrapper()
+ {
+ return 'ssh2.sftp://' . $this->getSFTPConnection() . '/';
+ }
+
+ public function filePutContents($filename, $data)
+ {
+ $dir = dirname($filename);
+ $this->mkdir($dir);
+ file_put_contents($this->_filename($filename), $data);
+ }
+
+ public function fileGetContents($filename)
+ {
+ return file_get_contents($this->_filename($filename));
+ }
+
+ public function fileReplaceContents($string, $replacement, $filename)
+ {
+ $contents = $this->fileGetContents($filename);
+ file_put_contents('/tmp/get', $contents);
+ $contents = str_replace($string, $replacement, $contents);
+ file_put_contents('/tmp/replaced', $string . "\n\n" . $replacement . "\n\n" . $contents);
+ $this->filePutContents($filename, $contents);
+ }
+
+ protected function _filename($filename)
+ {
+ return $this->getSFTPWrapper() . ltrim($this->_escapeCygwin($filename), '/');
+ }
+
+ public function filesize($filename)
+ {
+ return filesize($this->_filename($filename));
+ }
+
+ public function file_exists($filename)
+ {
+ return file_exists($this->_filename($filename));
+ }
+
+ public function mkdir($dirname, $mode = 0777, $recursive = true)
+ {
+ if (!$this->file_exists($dirname)) {
+ return ssh2_sftp_mkdir($this->getSFTPConnection(), $dirname, $mode, $recursive);
+ }
+ return true;
+ }
+
+ public function exec($commande)
+ {
+ // http://www.php.net/manual/fr/function.ssh2-exec.php#99089
+ $stream = ssh2_exec($this->_connect(), $commande);
+ $errorStream = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
+
+ // Enable blocking for both streams
+ stream_set_blocking($errorStream, true);
+ stream_set_blocking($stream, true);
+
+ // Whichever of the two below commands is listed first will receive its appropriate output. The second command receives nothing
+ $res = array('output' => stream_get_contents($stream),
+ 'error' => stream_get_contents($errorStream));
+
+ // Close the streams
+ fclose($errorStream);
+ fclose($stream);
+ return $res;
+ }
+
+ protected function _escapeCygwin($url)
+ {
+ $url = preg_replace('/\/([a-z]):\//i', '/cygdrive/\1/', '/' . $url);
+ return $url;
+ }
+
+}