mirror of
				https://github.com/Chouchen/Shikiryu_Backup.git
				synced 2021-06-30 16:02:14 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Shikiryu\Backup\Backup;
 | 
						|
 | 
						|
use phpseclib\Crypt\RSA;
 | 
						|
use phpseclib\Net\SFTP as LibSFTP;
 | 
						|
use phpseclib\Net\SSH2;
 | 
						|
 | 
						|
class SFTP extends BackupAbstract
 | 
						|
{
 | 
						|
    use IsDistantTrait;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var LibSFTP
 | 
						|
     */
 | 
						|
    private $connection;
 | 
						|
    /** @var string */
 | 
						|
    protected $host;
 | 
						|
    /** @var int */
 | 
						|
    protected $port = 22;
 | 
						|
    /** @var string */
 | 
						|
    protected $login;
 | 
						|
    /** @var string */
 | 
						|
    protected $password;
 | 
						|
    /** @var string */
 | 
						|
    protected $key;
 | 
						|
 | 
						|
    public function __construct($config = [])
 | 
						|
    {
 | 
						|
        if (!isset($config['files'])) {
 | 
						|
            throw new \Exception('Files needs a "files" configuration.');
 | 
						|
        }
 | 
						|
        $filesToBackup = $config['files'];
 | 
						|
        if (!empty($filesToBackup) && is_array($filesToBackup)) {
 | 
						|
            $names = array_map('basename', $filesToBackup);
 | 
						|
            $this->files_to_backup = array_combine($filesToBackup, $names);
 | 
						|
        }
 | 
						|
 | 
						|
        parent::__construct($config);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function preBuild()
 | 
						|
    {
 | 
						|
        // TODO: Implement preBuild() method.
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function postBuild()
 | 
						|
    {
 | 
						|
        // TODO: Implement postBuild() method.
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function build()
 | 
						|
    {
 | 
						|
        // TODO: Implement build() method.
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     * @throws \Exception
 | 
						|
     */
 | 
						|
    public function isValid()
 | 
						|
    {
 | 
						|
        if (empty($this->password) && empty($this->key)) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
        define('NET_SSH2_LOGGING', SSH2::LOG_COMPLEX);
 | 
						|
        $this->connection = new LibSFTP($this->host, $this->port);
 | 
						|
        if (!empty($this->key)) {
 | 
						|
            $this->password = new RSA();
 | 
						|
            $this->password->loadKey(file_get_contents($this->key));
 | 
						|
        }
 | 
						|
        if (!$this->connection->login($this->login, $this->password)) {
 | 
						|
            throw new \Exception(sprintf('I can\'t connect to the SFTP %s', $this->host));
 | 
						|
        }
 | 
						|
 | 
						|
        $this->connection->enableQuietMode();
 | 
						|
        $this->connection->exec('whoami');
 | 
						|
 | 
						|
        return $this->connection->getStdError() === '' && $this->connection->read() !== '';
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return Files
 | 
						|
     */
 | 
						|
    public function retrieve()
 | 
						|
    {
 | 
						|
        $tmp_files = [];
 | 
						|
        foreach ($this->files_to_backup as $path => $name) {
 | 
						|
            $tmp_file = TEMP_DIR.$name;
 | 
						|
            $tmp_files[] = $tmp_file;
 | 
						|
            $this->connection->get($path, $tmp_file);
 | 
						|
        }
 | 
						|
        unset($tmp_file);
 | 
						|
        try {
 | 
						|
            $tmp_backup = new Files(['files' => $tmp_files]);
 | 
						|
            unset($tmp_files);
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            echo $e->getMessage();
 | 
						|
        }
 | 
						|
 | 
						|
        return $tmp_backup;
 | 
						|
    }
 | 
						|
}
 |