diff --git a/bundles/CoreBundle/config/maintenance.yaml b/bundles/CoreBundle/config/maintenance.yaml index 7b7fc17b54f..eea681c6119 100644 --- a/bundles/CoreBundle/config/maintenance.yaml +++ b/bundles/CoreBundle/config/maintenance.yaml @@ -65,11 +65,17 @@ services: Pimcore\Maintenance\Tasks\HousekeepingTask: arguments: - - '%pimcore.maintenance.housekeeping.cleanup_tmp_files_atime_older_than%' - '%pimcore.maintenance.housekeeping.cleanup_profiler_files_atime_older_than%' tags: - { name: pimcore.maintenance.task, type: housekeeping } + Pimcore\Maintenance\Tasks\CleanupDirectoryTask: + arguments: + - '%pimcore.maintenance.cleanup_directory.cleanup_files_atime_older_than%' + - '%pimcore.maintenance.cleanup_directory.directories%' + tags: + - { name: pimcore.maintenance.task, type: cleanupDirectory } + Pimcore\Maintenance\Tasks\LowQualityImagePreviewTask: arguments: - '@logger' diff --git a/bundles/CoreBundle/src/DependencyInjection/Configuration.php b/bundles/CoreBundle/src/DependencyInjection/Configuration.php index badf10e56d3..96815e4ceb1 100644 --- a/bundles/CoreBundle/src/DependencyInjection/Configuration.php +++ b/bundles/CoreBundle/src/DependencyInjection/Configuration.php @@ -153,20 +153,36 @@ private function addMaintenanceNode(ArrayNodeDefinition $rootNode): void { $rootNode ->children() - ->arrayNode('maintenance') - ->addDefaultsIfNotSet() - ->children() - ->arrayNode('housekeeping') + ->arrayNode('maintenance') ->addDefaultsIfNotSet() - ->children() - ->integerNode('cleanup_tmp_files_atime_older_than') - ->info('Integer value in seconds.') - ->defaultValue(7_776_000) // 90 days - ->end() - ->integerNode('cleanup_profiler_files_atime_older_than') - ->info('Integer value in seconds.') - ->defaultValue(1800) + ->children() + ->arrayNode('housekeeping') + ->addDefaultsIfNotSet() + ->children() + ->integerNode('cleanup_profiler_files_atime_older_than') + ->info('Integer value in seconds.') + ->defaultValue(1800) + ->end() + ->end() + ->end() + ->arrayNode('cleanup_directory') + ->addDefaultsIfNotSet() + ->children() + ->integerNode('cleanup_files_atime_older_than') + ->info('Integer value in seconds.') + ->defaultValue(7_776_000) // 90 days + ->end() + ->arrayNode('directories') + ->info('Directories to cleanup.') + ->scalarPrototype()->end() + ->defaultValue([PIMCORE_PRIVATE_VAR. '/tmp', PIMCORE_WEB_ROOT . '/var/tmp']) + ->end() + ->end() + ->end() + ->end() ->end() + ->end() + ->end() ; } diff --git a/bundles/CoreBundle/src/DependencyInjection/PimcoreCoreExtension.php b/bundles/CoreBundle/src/DependencyInjection/PimcoreCoreExtension.php index 8942e3e1214..29e139b6a12 100644 --- a/bundles/CoreBundle/src/DependencyInjection/PimcoreCoreExtension.php +++ b/bundles/CoreBundle/src/DependencyInjection/PimcoreCoreExtension.php @@ -64,9 +64,11 @@ public function loadInternal(array $config, ContainerBuilder $container): void $container->setParameter('pimcore.web_profiler.toolbar.excluded_routes', $config['web_profiler']['toolbar']['excluded_routes']); - $container->setParameter('pimcore.maintenance.housekeeping.cleanup_tmp_files_atime_older_than', $config['maintenance']['housekeeping']['cleanup_tmp_files_atime_older_than']); $container->setParameter('pimcore.maintenance.housekeeping.cleanup_profiler_files_atime_older_than', $config['maintenance']['housekeeping']['cleanup_profiler_files_atime_older_than']); + $container->setParameter('pimcore.maintenance.cleanup_directory.cleanup_files_atime_older_than', $config['maintenance']['cleanup_directory']['cleanup_files_atime_older_than']); + $container->setParameter('pimcore.maintenance.cleanup_directory.directories', $config['maintenance']['cleanup_directory']['directories']); + $container->setParameter('pimcore.documents.default_controller', $config['documents']['default_controller']); //twig security policy allowlist config diff --git a/lib/Maintenance/Tasks/CleanupDirectoryTask.php b/lib/Maintenance/Tasks/CleanupDirectoryTask.php new file mode 100644 index 00000000000..cf2234fdfd2 --- /dev/null +++ b/lib/Maintenance/Tasks/CleanupDirectoryTask.php @@ -0,0 +1,66 @@ +cleanupDirectories as $directory) { + $this->deleteFilesInFolderOlderThanSeconds($directory, $this->tmpFileTime); + } + } + + /** + * @param string $folder + * @param int $seconds + */ + private function deleteFilesInFolderOlderThanSeconds(string $folder, int $seconds): void + { + if (!is_dir($folder)) { + return; + } + + $directory = new \RecursiveDirectoryIterator($folder); + $filter = new \RecursiveCallbackFilterIterator($directory, function (\SplFileInfo $current, $key, $iterator) use ($seconds) { + if (strpos($current->getFilename(), '-low-quality-preview.svg')) { + // do not delete low quality image previews + return false; + } + + if ($current->isFile()) { + if ($current->getATime() && $current->getATime() < (time() - $seconds)) { + return true; + } + } else { + return true; + } + + return false; + }); + + $iterator = new \RecursiveIteratorIterator($filter); + + foreach ($iterator as $file) { + /** + * @var \SplFileInfo $file + */ + if ($file->isFile()) { + @unlink($file->getPathname()); + } + + if (is_dir_empty($file->getPath())) { + @rmdir($file->getPath()); + } + } + } +} diff --git a/lib/Maintenance/Tasks/HousekeepingTask.php b/lib/Maintenance/Tasks/HousekeepingTask.php index 79807d7c849..c4ee030fb5c 100644 --- a/lib/Maintenance/Tasks/HousekeepingTask.php +++ b/lib/Maintenance/Tasks/HousekeepingTask.php @@ -23,13 +23,10 @@ */ class HousekeepingTask implements TaskInterface { - protected int $tmpFileTime; - protected int $profilerTime; - public function __construct(int $tmpFileTime, int $profilerTime) + public function __construct(int $profilerTime) { - $this->tmpFileTime = $tmpFileTime; $this->profilerTime = $profilerTime; }