From 0bced945310abf9f8c3e28c5c82899d12d623134 Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 21 Nov 2024 14:54:44 +0100 Subject: [PATCH] wip #7199 @4 --- .docker/images/php/Dockerfile | 2 +- .../FluidbookPublication/LinksOperation.php | 4 - app/Jobs/Maintenance/ListWorkingSymlinks.php | 83 +++++++++++++++++++ app/Jobs/Maintenance/RemoveDuplicates.php | 1 + app/Models/FluidbookPublication.php | 4 + 5 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 app/Jobs/Maintenance/ListWorkingSymlinks.php diff --git a/.docker/images/php/Dockerfile b/.docker/images/php/Dockerfile index 645253fce..c16d7e286 100644 --- a/.docker/images/php/Dockerfile +++ b/.docker/images/php/Dockerfile @@ -69,7 +69,7 @@ RUN apt -y --no-install-recommends install sshfs python3 python3-pip RUN apt -y --no-install-recommends install openssh-server rsyslog RUN apt -y --no-install-recommends install wine libwine wine64 RUN apt -y --no-install-recommends install pdfposter rename -RUN apt -y --no-install-recommends install jdupes +RUN apt -y --no-install-recommends install jdupes symlinks RUN apt -y --no-install-recommends install dnsutils RUN apt -y --no-install-recommends install locales diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php index 169af7ade..9e19a725d 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php @@ -4,20 +4,16 @@ namespace App\Http\Controllers\Admin\Operations\FluidbookPublication; // __('!!Paramètres des fluidbooks') -use App\Fluidbook\Compiler\Compiler; use App\Fluidbook\Link\LinksData; use App\Models\FluidbookPublication; use App\Models\User; use Cubist\Backpack\Http\Controllers\Base\XSendFileController; use Cubist\Util\Files\Files; use Illuminate\Http\UploadedFile; -use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Route; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; -use Illuminate\Support\Facades\Broadcast; use Illuminate\Support\Str; use Illuminate\Http\Request; -use Prologue\Alerts\Facades\Alert; trait LinksOperation diff --git a/app/Jobs/Maintenance/ListWorkingSymlinks.php b/app/Jobs/Maintenance/ListWorkingSymlinks.php new file mode 100644 index 000000000..9308e98f8 --- /dev/null +++ b/app/Jobs/Maintenance/ListWorkingSymlinks.php @@ -0,0 +1,83 @@ +where('created_ok', 1)->get() as $fluidbook) { + static::parseFluidbookDir($fluidbook); + } + } + + /** + * @param $fluidbook FluidbookPublication|int + * @return void + */ + + protected static function parseFluidbookDir($fluidbook) + { + if (!($fluidbook instanceof FluidbookPublication)) { + $fluidbook = FluidbookPublication::withoutGlobalScopes()->find($fluidbook); + } + + /* @var $fluidbook FluidbookPublication */ + $dir = $fluidbook->getAssetDir(); + if (!file_exists($dir)) { + echo 'skip ' . $dir . " (not exists)\n"; + return; + } + echo 'check ' . $dir . "\n"; + $output = `symlinks -rv $dir`; + $changed = false; + $outlinks = Text::explodeNewLines($output); + if (!count($outlinks)) { + echo 'skip ' . $dir . " (no symlinks)\n"; + return; + } + $links = static::getWorkingSymlinks(); + foreach ($outlinks as $l) { + if (preg_match('/absolute: (.*) -> (.*)/', $l, $matches)) { + $link = $matches[1]; + $target = $matches[2]; + if (!isset($links[$target])) { + $links[$target] = []; + } + if (!isset($links[$target][$link])) { + $links[$target][$link] = true; + $changed = true; + } + } + } + if (!$changed) { + echo 'skip ' . $dir . " (nothing changed)\n"; + return; + } + static::saveWorkingSymlinks($links); + } + + protected static function _getCacheFile() + { + return protected_path('fluidbookpublication/cache/working_symlinks.json'); + } + + public static function getWorkingSymlinks() + { + if(!file_exists(static::_getCacheFile())) { + return []; + } + return json_decode(file_get_contents(static::_getCacheFile()), true) ?? []; + } + + public static function saveWorkingSymlinks($links) + { + file_put_contents(static::_getCacheFile(), json_encode($links)); + } +} diff --git a/app/Jobs/Maintenance/RemoveDuplicates.php b/app/Jobs/Maintenance/RemoveDuplicates.php index da8da6285..dad71619f 100644 --- a/app/Jobs/Maintenance/RemoveDuplicates.php +++ b/app/Jobs/Maintenance/RemoveDuplicates.php @@ -17,5 +17,6 @@ class RemoveDuplicates extends Base $jdupes->setArg(null, $directory); $jdupes->execute(); } + ListWorkingSymlinks::dispatchSync(); } } diff --git a/app/Models/FluidbookPublication.php b/app/Models/FluidbookPublication.php index f466277a9..90ab9efbf 100644 --- a/app/Models/FluidbookPublication.php +++ b/app/Models/FluidbookPublication.php @@ -607,6 +607,10 @@ class FluidbookPublication extends ToolboxStatusModel return $this->protected_path('fluidbookpublication/final/' . $dir . '/' . ($scormVariant ? 'scorm' : 'online')); } + public function _getFreeFileRootDirectory() + { + return Files::mkdir($this->protected_path('fluidbookpublication/working/')); + } public function getAssetDir() { -- 2.39.5