Added options and Dropbox

This commit is contained in:
Shikiryu 2015-08-18 17:02:37 +02:00
parent bf551dd6ff
commit 41391be79c
7 changed files with 223 additions and 48 deletions

View File

@ -40,16 +40,20 @@ class Scenario {
$this->transport = TransportFactory::build($this->backup, $scenario['transport']); $this->transport = TransportFactory::build($this->backup, $scenario['transport']);
} }
/**
* check if backup is valid and then launch the transfer
*
* @see BackupAbstract::isValid
* @see TransportAbstract::send
*
* @throws \Exception
*/
public function send() public function send()
{ {
try { if ($this->backup->isValid()) {
if ($this->backup->isValid()) { $this->transport->send();
$this->transport->send(); } else {
} else { throw new \Exception("Backup configuration is invalid.");
throw new \Exception("Backup configuration is invalid.");
}
} catch (\Exception $e) {
throw $e;
} }
} }

View File

@ -0,0 +1,48 @@
<?php
namespace Shikiryu\Backup\Transport;
use Dropbox\Client;
use Shikiryu\Backup\Transport\TransportAbstract;
class Dropbox extends TransportAbstract
{
private $dropbox;
protected $token = '';
protected $app = '';
protected $folder = '';
public function __construct($backup, $config)
{
parent::__construct($backup, $config);
$this->dropbox = new Client($this->token, $this->app);
}
/**
* @return bool
*/
public function send()
{
$sent = true;
$files = $this->backup->getFilesToBackup();
foreach ($files as $file => $name) {
$file = fopen($file, 'r');
$upload = $this->dropbox->uploadFile($this->folder.'/'.$name, \Dropbox\WriteMode::force(), $file);
if (!$upload) {
$sent = false;
echo 'DROPBOX upload manquée de '.$file.' vers '.$this->folder.$name;
}
}
$streams = $this->backup->getStreamsToBackup();
foreach ($streams as $stream => $name) {
$upload = $this->dropbox->uploadFileFromString($this->folder.'/'.$name, \Dropbox\WriteMode::force(), $stream);
if (!$upload) {
$sent = false;
echo 'DROPBOX upload manquée de '.$file.' vers '.$this->folder.$name;
}
}
return $sent;
}
}

View File

@ -5,19 +5,25 @@ namespace Shikiryu\Backup\Backup;
abstract class BackupAbstract abstract class BackupAbstract
{ {
protected $_filesToBackup; protected $options;
protected $_streamsToBackup; /** @var string[] */
protected $_filesToBackup = [];
/** @var string[] */
protected $_streamsToBackup = [];
/** /**
* @param array $config * @param array $config
*/ */
function __construct($config = array()) function __construct($config = array())
{ {
$this->options = !empty($config['options']) ? $config['options'] : [];
unset($config['options']);
foreach ($config as $name => $value) { foreach ($config as $name => $value) {
$this->$name = $value; $this->$name = $value;
} }
$this->_filesToBackup = array(); $this->init();
$this->_streamsToBackup = array();
} }
/** /**
@ -47,6 +53,93 @@ abstract class BackupAbstract
return $this->_streamsToBackup; return $this->_streamsToBackup;
} }
/**
* Check if all files got the minimum given size.
*
* @param int $fs
*
* @return bool
*/
public function checkMinimumFilesize($fs)
{
foreach ($this->_filesToBackup as $file => $name) {
if (filesize($file) < $fs) {
return false;
}
}
foreach ($this->_streamsToBackup as $name => $file) {
if (mb_strlen($file, 'utf-8') < $fs) {
return false;
}
}
return true;
}
protected function init()
{
$this->preBuild();
$this->build();
$this->postBuild();
$this->applyOptions();
}
abstract protected function preBuild();
abstract protected function postBuild();
abstract protected function build();
abstract public function isValid();
/**
* @return $this
*/
protected function applyOptions()
{
// TODO isValid here ?
foreach($this->options as $name => $value)
{
$method = sprintf('setOption%s', ucfirst($name));
if (method_exists($this, $method)) {
call_user_func([$this, $method], $value);
}
}
return $this;
}
/**
* Zip every backup files and streams into one zip
* Enabled via options
*
* @return $this
* @throws \Exception
*/
protected function setOptionZip()
{
$zip = new \ZipArchive();
$zip_name = sprintf('%s.zip', (!empty($this->options['name']) ? $this->options['name'] : time())); // Zip name
if (touch(TEMP_DIR.$zip_name) === false) {
throw new \Exception('Backup::Zip::Permission denied.');
}
if ($zip->open(TEMP_DIR.$zip_name, \ZIPARCHIVE::OVERWRITE)==TRUE) {
foreach($this->_filesToBackup as $file => $name)
{
$zip->addFile($file, $name); // Adding files into zip
}
foreach($this->_streamsToBackup as $file => $name)
{
$zip->addFromString($file, $name); // Adding streams into zip
}
$zip->close();
} else {
throw new \Exception('Backup::Zip::Can\'t zip the given backup.');
}
$this->_filesToBackup = [TEMP_DIR.$zip_name => $zip_name];
$this->_streamsToBackup = [];
return $this;
}
/** /**
* Add the current date with the given format into the files names * Add the current date with the given format into the files names
* *
@ -54,8 +147,11 @@ abstract class BackupAbstract
* *
* @return $this * @return $this
*/ */
public function addDate($format = 'Ymd') protected function setOptionAddDate($format = 'Ymd')
{ {
if ($format === true) {
$format = 'Ymd';
}
$tmpFiles = array(); $tmpFiles = array();
foreach ($this->_filesToBackup as $file => $name) { foreach ($this->_filesToBackup as $file => $name) {
$nameA = explode('.', $name); $nameA = explode('.', $name);
@ -82,8 +178,11 @@ abstract class BackupAbstract
* *
* @return $this * @return $this
*/ */
public function addTime($format = 'his') protected function setOptionAddTime($format = 'his')
{ {
if ($format === true) {
$format = 'his';
}
$tmpFiles = array(); $tmpFiles = array();
foreach ($this->_filesToBackup as $file => $name) { foreach ($this->_filesToBackup as $file => $name) {
$nameA = explode('.', $name); $nameA = explode('.', $name);
@ -103,38 +202,17 @@ abstract class BackupAbstract
return $this; return $this;
} }
function backupToDropbox()
{
}
/** /**
* Check if all files got the minimum given size. * @param $name
* * @throws \Exception
* @param int $fs
*
* @return bool
*/ */
function checkMinimumFilesize($fs) protected function setOptionName($name)
{ {
foreach ($this->_filesToBackup as $file => $name) { if (empty($this->options['zip'])) {
if (filesize($file) < $fs) { throw new \Exception('name option is for zip only.');
return false;
}
} }
foreach ($this->_streamsToBackup as $name => $file) {
if (mb_strlen($file, 'utf-8') < $fs) {
return false;
}
}
return true;
} }
/**
* @return bool
*/
abstract public function isValid();
} }
?> ?>

View File

@ -13,12 +13,12 @@ class Files extends BackupAbstract
if (!isset($config['files'])) { if (!isset($config['files'])) {
throw new \Exception('Files needs a "files" configuration.'); throw new \Exception('Files needs a "files" configuration.');
} }
parent::__construct();
$filesToBackup = $config['files']; $filesToBackup = $config['files'];
if(!empty($filesToBackup) && is_array($filesToBackup)){ if(!empty($filesToBackup) && is_array($filesToBackup)){
$names = array_map("basename",$filesToBackup); $names = array_map("basename",$filesToBackup);
$this->_filesToBackup = array_combine($filesToBackup,$names); $this->_filesToBackup = array_combine($filesToBackup,$names);
} }
parent::__construct($config);
} }
public function isValid() public function isValid()
@ -33,5 +33,19 @@ class Files extends BackupAbstract
return $result; return $result;
} }
protected function preBuild()
{
// TODO: Implement preBuild() method.
}
protected function postBuild()
{
// TODO: Implement postBuild() method.
}
protected function build()
{
// TODO: Implement build() method.
}
} }
?> ?>

View File

@ -8,8 +8,6 @@ class Folder extends BackupAbstract
public function __construct(array $config = array()) public function __construct(array $config = array())
{ {
parent::__construct($config); parent::__construct($config);
} }
/** /**
@ -19,4 +17,19 @@ class Folder extends BackupAbstract
{ {
// TODO: Implement isValid() method. // TODO: Implement isValid() method.
} }
protected function preBuild()
{
// TODO: Implement preBuild() method.
}
protected function postBuild()
{
// TODO: Implement postBuild() method.
}
protected function build()
{
// TODO: Implement build() method.
}
} }

View File

@ -9,6 +9,10 @@ class Mysql extends BackupAbstract
* @var $pdo \PDO * @var $pdo \PDO
*/ */
private $pdo; private $pdo;
/*
* from config
*/
protected $tables; protected $tables;
protected $host; protected $host;
protected $db; protected $db;
@ -20,15 +24,13 @@ class Mysql extends BackupAbstract
*/ */
public function __construct(array $config = array()) { public function __construct(array $config = array()) {
parent::__construct($config); parent::__construct($config);
$this->pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->db, $this->login, $this->pwd);
empty($this->tables) || $this->tables == '*' ? $this->everything() : $this->fromTables($this->tables);
} }
/** /**
* @param array $tables * @param array $tables
* @return $this|string * @return $this|string
*/ */
public function fromTables($tables = array()) private function fromTables($tables = array())
{ {
if(!empty($tables)) { if(!empty($tables)) {
$this->tables = $tables; $this->tables = $tables;
@ -42,7 +44,7 @@ class Mysql extends BackupAbstract
* *
* @return $this * @return $this
*/ */
public function everything() { private function everything() {
$this->tables = array(); $this->tables = array();
foreach($this->pdo->query('SHOW TABLES') as $table) { foreach($this->pdo->query('SHOW TABLES') as $table) {
$this->tables[] = $table; $this->tables[] = $table;
@ -97,6 +99,21 @@ class Mysql extends BackupAbstract
{ {
return !empty($this->_streamsToBackup); return !empty($this->_streamsToBackup);
} }
protected function preBuild()
{
$this->pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->db, $this->login, $this->pwd);
}
protected function postBuild()
{
// TODO: Implement postBuild() method.
}
protected function build()
{
empty($this->tables) || $this->tables == '*' ? $this->everything() : $this->fromTables($this->tables);
}
} }
?> ?>

View File

@ -11,7 +11,8 @@
} }
], ],
"require": { "require": {
"phpseclib/phpseclib": ">=1.0.0" "phpseclib/phpseclib": ">=1.0.0",
"dropbox/dropbox-sdk": "~1.1"
}, },
"autoload": { "autoload": {
"classmap": ["app/code/", "vendor/"] "classmap": ["app/code/", "vendor/"]