/home/techb158/ileadtechnology.com/vendor/spatie/laravel-backup/src/Tasks/Backup
Edit: /home/techb158/ileadtechnology.com/vendor/spatie/laravel-backup/src/Tasks/Backup/BackupJob.php (9109B)
dontBackupFilesystem();
$this->dontBackupDatabases();
$this->setDefaultFilename();
$this->backupDestinations = new Collection();
}
public function dontBackupFilesystem(): self
{
$this->fileSelection = FileSelection::create();
return $this;
}
public function onlyDbName(array $allowedDbNames): self
{
$this->dbDumpers = $this->dbDumpers->filter(
function (DbDumper $dbDumper, string $connectionName) use ($allowedDbNames) {
return in_array($connectionName, $allowedDbNames);
});
return $this;
}
public function dontBackupDatabases(): self
{
$this->dbDumpers = new Collection();
return $this;
}
public function disableNotifications(): self
{
$this->sendNotifications = false;
return $this;
}
public function setDefaultFilename(): self
{
$this->filename = Carbon::now()->format(static::FILENAME_FORMAT);
return $this;
}
public function setFileSelection(FileSelection $fileSelection): self
{
$this->fileSelection = $fileSelection;
return $this;
}
public function setDbDumpers(Collection $dbDumpers): self
{
$this->dbDumpers = $dbDumpers;
return $this;
}
public function setFilename(string $filename): self
{
$this->filename = $filename;
return $this;
}
public function onlyBackupTo(string $diskName): self
{
$this->backupDestinations = $this->backupDestinations->filter(function (BackupDestination $backupDestination) use ($diskName) {
return $backupDestination->diskName() === $diskName;
});
if (! count($this->backupDestinations)) {
throw InvalidBackupJob::destinationDoesNotExist($diskName);
}
return $this;
}
public function setBackupDestinations(Collection $backupDestinations): self
{
$this->backupDestinations = $backupDestinations;
return $this;
}
public function run()
{
$temporaryDirectoryPath = config('backup.backup.temporary_directory') ?? storage_path('app/backup-temp');
$this->temporaryDirectory = (new TemporaryDirectory($temporaryDirectoryPath))
->name('temp')
->force()
->create()
->empty();
try {
if (! count($this->backupDestinations)) {
throw InvalidBackupJob::noDestinationsSpecified();
}
$manifest = $this->createBackupManifest();
if (! $manifest->count()) {
throw InvalidBackupJob::noFilesToBeBackedUp();
}
$zipFile = $this->createZipContainingEveryFileInManifest($manifest);
$this->copyToBackupDestinations($zipFile);
} catch (Exception $exception) {
consoleOutput()->error("Backup failed because {$exception->getMessage()}.".PHP_EOL.$exception->getTraceAsString());
$this->sendNotification(new BackupHasFailed($exception));
$this->temporaryDirectory->delete();
throw $exception;
}
$this->temporaryDirectory->delete();
}
protected function createBackupManifest(): Manifest
{
$databaseDumps = $this->dumpDatabases();
consoleOutput()->info('Determining files to backup...');
$manifest = Manifest::create($this->temporaryDirectory->path('manifest.txt'))
->addFiles($databaseDumps)
->addFiles($this->filesToBeBackedUp());
$this->sendNotification(new BackupManifestWasCreated($manifest));
return $manifest;
}
public function filesToBeBackedUp()
{
$this->fileSelection->excludeFilesFrom($this->directoriesUsedByBackupJob());
return $this->fileSelection->selectedFiles();
}
protected function directoriesUsedByBackupJob(): array
{
return $this->backupDestinations
->filter(function (BackupDestination $backupDestination) {
return $backupDestination->filesystemType() === 'local';
})
->map(function (BackupDestination $backupDestination) {
return $backupDestination->disk()->getDriver()->getAdapter()->applyPathPrefix('').$backupDestination->backupName();
})
->each(function (string $backupDestinationDirectory) {
$this->fileSelection->excludeFilesFrom($backupDestinationDirectory);
})
->push($this->temporaryDirectory->path())
->toArray();
}
protected function createZipContainingEveryFileInManifest(Manifest $manifest)
{
consoleOutput()->info("Zipping {$manifest->count()} files and directories...");
$pathToZip = $this->temporaryDirectory->path(config('backup.backup.destination.filename_prefix').$this->filename);
$zip = Zip::createForManifest($manifest, $pathToZip);
consoleOutput()->info("Created zip containing {$zip->count()} files and directories. Size is {$zip->humanReadableSize()}");
$this->sendNotification(new BackupZipWasCreated($pathToZip));
return $pathToZip;
}
/**
* Dumps the databases to the given directory.
* Returns an array with paths to the dump files.
*
* @return array
*/
protected function dumpDatabases(): array
{
return $this->dbDumpers->map(function (DbDumper $dbDumper, $key) {
consoleOutput()->info("Dumping database {$dbDumper->getDbName()}...");
$dbType = mb_strtolower(basename(str_replace('\\', '/', get_class($dbDumper))));
$dbName = $dbDumper->getDbName();
if ($dbDumper instanceof Sqlite) {
$dbName = $key.'-database';
}
$fileName = "{$dbType}-{$dbName}.{$this->getExtension($dbDumper)}";
if (config('backup.backup.gzip_database_dump')) {
$dbDumper->useCompressor(new GzipCompressor());
$fileName .= '.'.$dbDumper->getCompressorExtension();
}
if ($compressor = config('backup.backup.database_dump_compressor')) {
$dbDumper->useCompressor(new $compressor());
$fileName .= '.'.$dbDumper->getCompressorExtension();
}
$temporaryFilePath = $this->temporaryDirectory->path('db-dumps'.DIRECTORY_SEPARATOR.$fileName);
$dbDumper->dumpToFile($temporaryFilePath);
return $temporaryFilePath;
})->toArray();
}
protected function copyToBackupDestinations(string $path)
{
$this->backupDestinations->each(function (BackupDestination $backupDestination) use ($path) {
try {
consoleOutput()->info("Copying zip to disk named {$backupDestination->diskName()}...");
$backupDestination->write($path);
consoleOutput()->info("Successfully copied zip to disk named {$backupDestination->diskName()}.");
$this->sendNotification(new BackupWasSuccessful($backupDestination));
} catch (Exception $exception) {
consoleOutput()->error("Copying zip failed because: {$exception->getMessage()}.");
$this->sendNotification(new BackupHasFailed($exception, $backupDestination ?? null));
}
});
}
protected function sendNotification($notification)
{
if ($this->sendNotifications) {
rescue(function () use ($notification) {
event($notification);
}, function () {
consoleOutput()->error('Sending notification failed');
});
}
}
protected function getExtension(DbDumper $dbDumper): string
{
return $dbDumper instanceof MongoDb
? 'archive'
: 'sql';
}
}