is_locked && ($backup->is_successful && !is_null($backup->completed_at))) { throw new BackupLockedException(); } if ($backup->disk === Backup::ADAPTER_AWS_S3) { $this->deleteFromS3($backup); return; } $this->connection->transaction(function () use ($backup) { try { $this->daemonBackupRepository->setServer($backup->server)->delete($backup); } catch (DaemonConnectionException $exception) { $previous = $exception->getPrevious(); // Don't fail the request if the Daemon responds with a 404, just assume the backup // doesn't actually exist and remove its reference from the Panel as well. if (!$previous instanceof ClientException || $previous->getResponse()->getStatusCode() !== Response::HTTP_NOT_FOUND) { throw $exception; } } $backup->delete(); }); } /** * Deletes a backup from an S3 disk. * * @throws \Throwable */ protected function deleteFromS3(Backup $backup): void { $this->connection->transaction(function () use ($backup) { $backup->delete(); /** @var \Pterodactyl\Extensions\Filesystem\S3Filesystem $adapter */ $adapter = $this->manager->adapter(Backup::ADAPTER_AWS_S3); /** @var \Aws\S3\S3Client $client */ $client = $adapter->getClient(); $client->deleteObject([ 'Bucket' => $adapter->getBucket(), 'Key' => sprintf('%s/%s.tar.gz', $backup->server->uuid, $backup->uuid), ]); }); } }