diff --git a/app/Commands/BackupCommand.php b/app/Commands/BackupCommand.php index b2ce5b5..3066291 100644 --- a/app/Commands/BackupCommand.php +++ b/app/Commands/BackupCommand.php @@ -12,7 +12,7 @@ class BackupCommand extends Command * * @var string */ - protected $signature = 'backup {containers*} {--data} {--mysql} {--upload} {--clean}'; + protected $signature = 'backup {containers*} {--data} {--mysql} {--pack} {--upload} {--clean}'; /** * The description of the command. @@ -38,18 +38,40 @@ class BackupCommand extends Command } if ($this->option('mysql')) { - $this->call("backup:mysql", [ - '--container' => env('MYSQL_CONTAINER_NAME'), - '--user' => env('MYSQL_USER'), - '--password' => env('MYSQL_PASSWORD'), + $this->call("backup:mysql"); + } + + date_default_timezone_set('Europe/Istanbul'); + $date = date('d-m-Y_H-i-s', time()); + + if ($this->option('pack')) { + $this->call('backup:pack', [ + 'name' => 'backup_' . $date, + ]); + } + + if ($this->option('upload')) { + if (!$this->option('pack')) { + $this->call('backup:pack', [ + 'name' => 'backup_' . $date, + ]); + } + $this->call("backup:upload", [ + 'name' => 'backup_' . $date . '.tar.gz', ]); } if ($this->option('clean')) { + $this->line("|-> Cleaning..."); $files = glob(env('BACKUP_FOLDER') . '/*'); foreach($files as $file){ is_file($file) ? unlink($file) : null; } + + $files = glob(env('EXPORT_FOLDER') . '/*'); + foreach($files as $file){ + is_file($file) ? unlink($file) : null; + } } $this->line("|-> The backup and upload process is finished."); diff --git a/app/Commands/ContainerBackupCommand.php b/app/Commands/ContainerBackupCommand.php index 3a1afe7..44e35a4 100644 --- a/app/Commands/ContainerBackupCommand.php +++ b/app/Commands/ContainerBackupCommand.php @@ -41,11 +41,11 @@ class ContainerBackupCommand extends Command } $backupManager = new BackupManager(); - $backupManager->setBackupFolder($backupFolder); foreach ($containers as $container) { $this->line("|-> Backing up {$container}..."); $builder = new ContainerBuilder(); - $builder->setContainerName($container); + $builder->setContainerName($container) + ->setBackupFolder($backupFolder); $backupManager->setBuilder($builder)->execute(); if ($backupManager->getShell()->getReturnValue() == 0) { $this->line(" |-> {$container} successfully backed up."); diff --git a/app/Commands/DataBackupCommand.php b/app/Commands/DataBackupCommand.php index f7cb3fa..eb86c39 100644 --- a/app/Commands/DataBackupCommand.php +++ b/app/Commands/DataBackupCommand.php @@ -45,11 +45,12 @@ class DataBackupCommand extends Command $dataFolder = env('DATA_FOLDER'); } - $bm = new BackupManager(); $builder = new DataBuilder(); - $builder->setDataFolder($dataFolder); - $bm->setBackupFolder($backupFolder) - ->setBuilder($builder)->execute(); + $builder->setDataFolder($dataFolder) + ->setBackupFolder($backupFolder); + $bm = new BackupManager(); + + $bm->setBuilder($builder)->execute(); if ($bm->getShell()->getReturnValue() == 0) { $this->line(" |-> Data folder successfully backed up."); diff --git a/app/Commands/MysqlBackupCommand.php b/app/Commands/MysqlBackupCommand.php index 53356a6..2bf6cb7 100644 --- a/app/Commands/MysqlBackupCommand.php +++ b/app/Commands/MysqlBackupCommand.php @@ -39,6 +39,19 @@ class MysqlBackupCommand extends Command $container = $this->option('container'); $user = $this->option('user'); $password = $this->option('password'); + + if (!$container) { + $container = env('MYSQL_CONTAINER_NAME'); + } + + if (!$user) { + $user = env('MYSQL_USER'); + } + + if (!$password) { + $password = env('MYSQL_PASSWORD'); + } + $bm = new BackupManager(); $this->line("|-> Backing up mysql databases..."); @@ -46,17 +59,17 @@ class MysqlBackupCommand extends Command $credentials->setUsername($user); $credentials->setPassword($password); - $builder = new DatabaseBuilder(); - $builder->setCredential($credentials); - $builder->setContainerName($container); - $backupFolder = $this->option('folder'); if (!$backupFolder) { $backupFolder = env('BACKUP_FOLDER'); } - $bm->setBackupFolder($backupFolder) - ->setBuilder($builder)->execute(); + $builder = new DatabaseBuilder(); + $builder->setCredential($credentials); + $builder->setContainerName($container) + ->setBackupFolder($backupFolder); + + $bm->setBuilder($builder)->execute(); if ($bm->getShell()->getReturnValue() == 0) { $this->line(" |-> Mysql databases successfully backed up."); diff --git a/app/Commands/PackCommand.php b/app/Commands/PackCommand.php new file mode 100644 index 0000000..58d4f02 --- /dev/null +++ b/app/Commands/PackCommand.php @@ -0,0 +1,77 @@ +option('folder'); + $exportFolder = $this->option('export'); + $packageName = $this->argument('name'); + + if (!$backupFolder) { + $backupFolder = env('BACKUP_FOLDER'); + } + + if (!$exportFolder) { + $exportFolder = env('EXPORT_FOLDER'); + } + + $this->line("|-> {$packageName} is packing..."); + + $packageBuilder = new PackageBuilder(); + $packageBuilder->setBackupFolder($backupFolder) + ->setExportFolder($exportFolder) + ->setPackageName($packageName); + + $backupManager = new BackupManager(); + $backupManager->setBuilder($packageBuilder)->execute(); + + if ($backupManager->getShell()->getReturnValue() == 0) { + $this->line(" |-> Package created."); + } else { + $this->line(" |-> Failed to create package."); + } + return; + } + + /** + * Define the command's schedule. + * + * @param \Illuminate\Console\Scheduling\Schedule $schedule + * @return void + */ + public function schedule(Schedule $schedule): void + { + // $schedule->command(static::class)->everyMinute(); + } +} diff --git a/app/Commands/UploadCommand.php b/app/Commands/UploadCommand.php new file mode 100644 index 0000000..a235d41 --- /dev/null +++ b/app/Commands/UploadCommand.php @@ -0,0 +1,79 @@ +option('export'); + $targetFolder = $this->option('target'); + $name = $this->argument('name'); + + if (!$targetFolder) { + $targetFolder = env('TARGET_FOLDER'); + } + + if (!$exportFolder) { + $exportFolder = env('EXPORT_FOLDER'); + } + + $this->line("|-> {$name} is uploading..."); + + $uploadBuilder = new UploadBuilder(); + $uploadBuilder->setExportFolder($exportFolder) + ->setTargetFolder($targetFolder) + ->setPackageName($name); + + $backupManager = new BackupManager(); + $backupManager->setBuilder($uploadBuilder) + ->execute(); + + if ($backupManager->getShell()->getReturnValue() == 0) { + $this->line(" |-> Upload successful."); + } else { + $this->line(" |-> Upload failed."); + } + return; + } + + /** + * Define the command's schedule. + * + * @param \Illuminate\Console\Scheduling\Schedule $schedule + * @return void + */ + public function schedule(Schedule $schedule): void + { + // $schedule->command(static::class)->everyMinute(); + } +} diff --git a/app/Utils/BackupManager.php b/app/Utils/BackupManager.php index b8b7ae1..ced4edc 100644 --- a/app/Utils/BackupManager.php +++ b/app/Utils/BackupManager.php @@ -9,41 +9,13 @@ use Throwable; class BackupManager { - private $exportFolder; - private $backupFolder; private $shell; private $builder; - private $containerName; public function __construct() { $this->shell = new Exec(); } - - /** - * @param mixed $backupFolder - * @return BackupManager - * @throws Throwable - */ - public function setBackupFolder($backupFolder): BackupManager - { - throw_if(!file_exists($backupFolder), new BackupFolderNotFoundException('Backup folder not exist!')); - $this->backupFolder = $backupFolder; - return $this; - } - - /** - * @param mixed $exportFolder - * @return BackupManager - * @throws Throwable - */ - public function setExportFolder($exportFolder): BackupManager - { - throw_if(!file_exists($exportFolder), new ExportFolderNotFoundException('Export folder not exist!')); - $this->exportFolder = $exportFolder; - return $this; - } - /** * @return Exec */ @@ -52,30 +24,6 @@ class BackupManager return $this->shell; } - /** - * @return mixed - */ - public function getBackupFolder() - { - return $this->backupFolder; - } - - /** - * @return mixed - */ - public function getExportFolder() - { - return $this->exportFolder; - } - - /** - * @return mixed - */ - public function getContainerName() - { - return $this->containerName; - } - public function setBuilder(Builder $builder): BackupManager { $this->builder = $builder; @@ -93,7 +41,7 @@ class BackupManager */ public function execute() { - $builder = $this->getBuilder()->setBackupFolder($this->backupFolder)->builder(); + $builder = $this->getBuilder()->builder(); return $this->shell->run($builder); } } diff --git a/app/Utils/Builder.php b/app/Utils/Builder.php index 612437e..58b1df9 100644 --- a/app/Utils/Builder.php +++ b/app/Utils/Builder.php @@ -10,7 +10,10 @@ use Throwable; abstract class Builder { private $backupFolder; + private $exportFolder; + private $targetFolder; private $containerName; + private $packageName; private $clean; /** @@ -55,6 +58,24 @@ abstract class Builder return $this->backupFolder; } + /** + * @param string $exportFolder + * @return Builder + */ + public function setExportFolder(string $exportFolder): Builder + { + $this->exportFolder = $exportFolder; + return $this; + } + + /** + * @return string + */ + public function getExportFolder(): string + { + return $this->exportFolder; + } + /** * @param $containerName * @return Builder @@ -65,6 +86,24 @@ abstract class Builder return $this; } + /** + * @param string $targetFolder + * @return Builder + */ + public function setTargetFolder(string $targetFolder): Builder + { + $this->targetFolder = $targetFolder; + return $this; + } + + /** + * @return string + */ + public function getTargetFolder(): string + { + return $this->targetFolder; + } + /** * @return string */ @@ -73,6 +112,24 @@ abstract class Builder return $this->containerName; } + /** + * @param string $packageName + * @return Builder + */ + public function setPackageName(string $packageName): Builder + { + $this->packageName = $packageName; + return $this; + } + + /** + * @return string + */ + public function getPackageName(): string + { + return $this->packageName; + } + /** * @param bool $clean */ diff --git a/app/Utils/Builders/PackageBuilder.php b/app/Utils/Builders/PackageBuilder.php new file mode 100644 index 0000000..434c6ba --- /dev/null +++ b/app/Utils/Builders/PackageBuilder.php @@ -0,0 +1,17 @@ +getExportFolder()}/{$this->getPackageName()}.tar.gz {$this->getBackupFolder()}"); + } +} diff --git a/app/Utils/Builders/UploadBuilder.php b/app/Utils/Builders/UploadBuilder.php new file mode 100644 index 0000000..d7a7f0d --- /dev/null +++ b/app/Utils/Builders/UploadBuilder.php @@ -0,0 +1,18 @@ +getExportFolder()}". DIRECTORY_SEPARATOR . + "{$this->getPackageName()} {$this->getTargetFolder()}/{$this->getPackageName()}"); + } +}