From 53e25c4641b078aa4815e0f0a115b7e4fdb3a02c Mon Sep 17 00:00:00 2001 From: Mikei386 <44135113+Mikei386@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:17:32 +0200 Subject: [PATCH] Calculate directory sizes in background --- build-plugin.sh | 2 +- packages/u-navigator-2026.06.23.r013.tgz | Bin 17082 -> 0 bytes packages/u-navigator-2026.06.23.r014.tgz | Bin 0 -> 17699 bytes .../emhttp/plugins/u-navigator/api/job.php | 14 +++-- .../plugins/u-navigator/api/job_worker.php | 47 +++++++++++++- server/public/app.js | 58 +++++++++++++++++- u-navigator.plg | 4 +- 7 files changed, 114 insertions(+), 11 deletions(-) delete mode 100644 packages/u-navigator-2026.06.23.r013.tgz create mode 100644 packages/u-navigator-2026.06.23.r014.tgz diff --git a/build-plugin.sh b/build-plugin.sh index 5b519fa..4c2c627 100755 --- a/build-plugin.sh +++ b/build-plugin.sh @@ -2,7 +2,7 @@ set -eu PLUGIN="u-navigator" -VERSION="2026.06.23.r013" +VERSION="2026.06.23.r014" PKG_DIR="packages" WORK_DIR=".plugin-build" PKG_NAME="${PLUGIN}-${VERSION}.tgz" diff --git a/packages/u-navigator-2026.06.23.r013.tgz b/packages/u-navigator-2026.06.23.r013.tgz deleted file mode 100644 index 070a3cb93a5c89b93930074a64cf84e64e70284d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17082 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 diff --git a/packages/u-navigator-2026.06.23.r014.tgz b/packages/u-navigator-2026.06.23.r014.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3bebf93e608555e9f626b56c26e41c9f904762d4 GIT binary patch literal 17699 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 A5&!@I literal 0 HcmV?d00001 diff --git a/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job.php b/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job.php index cd750af..062989b 100644 --- a/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job.php +++ b/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job.php @@ -5,17 +5,19 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { unav_json(unav_job_read($_GET['id'] ?? '')); } -unav_assert_writable(); - $action = $_GET['action'] ?? ''; -if (!in_array($action, ['move', 'copy'], true)) { +if (!in_array($action, ['move', 'copy', 'size'], true)) { unav_error(404, 'Unknown job action'); } $data = unav_request_data(); $source = unav_existing_path($data['source'] ?? null); -$destination = unav_destination_path($data['destination'] ?? null); -unav_guard_destination($source['path'], $destination['path']); +$destination = null; +if (in_array($action, ['move', 'copy'], true)) { + unav_assert_writable(); + $destination = unav_destination_path($data['destination'] ?? null); + unav_guard_destination($source['path'], $destination['path']); +} $id = str_replace('.', '', uniqid($action . '-', true)); $now = date(DATE_ATOM); @@ -27,7 +29,7 @@ $job = [ 'message' => 'Queued', 'error' => null, 'source' => $source['path'], - 'destination' => $destination['path'], + 'destination' => $destination['path'] ?? null, 'createdAt' => $now, 'updatedAt' => $now, ]; diff --git a/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job_worker.php b/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job_worker.php index cdda58f..0396fe5 100644 --- a/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job_worker.php +++ b/plugin-root/usr/local/emhttp/plugins/u-navigator/api/job_worker.php @@ -9,12 +9,16 @@ function unav_run_job(string $id): void { $job = unav_job_read($id); try { unav_worker_update($job, 'running', 5, 'Preparing'); - unav_worker_guard($job['source'], $job['destination']); if ($job['type'] === 'move') { + unav_worker_guard($job['source'], $job['destination']); unav_worker_move($job['source'], $job['destination'], $job); } elseif ($job['type'] === 'copy') { + unav_worker_guard($job['source'], $job['destination']); unav_worker_copy($job['source'], $job['destination'], $job); + } elseif ($job['type'] === 'size') { + $result = unav_worker_size($job['source'], $job); + $job['result'] = $result; } else { throw new RuntimeException('Unknown job action'); } @@ -55,6 +59,15 @@ function unav_worker_guard(string $source, string $destination): void { } } +function unav_worker_guard_source(string $source): string { + $sourceReal = realpath($source); + if ($sourceReal === false) { + throw new RuntimeException('Source not found'); + } + unav_worker_assert_inside_root($sourceReal); + return $sourceReal; +} + function unav_worker_assert_inside_root(string $path): void { foreach (unav_roots() as $root) { if (unav_is_inside($path, $root['path'])) { @@ -73,6 +86,38 @@ function unav_worker_move(string $source, string $destination, array &$job): voi unav_worker_delete($source); } +function unav_worker_size(string $source, array &$job): array { + $sourceReal = unav_worker_guard_source($source); + unav_worker_update($job, 'running', 10, 'Calculating size'); + $result = unav_worker_size_recursive($sourceReal); + unav_worker_update($job, 'running', 95, 'Size calculated'); + return $result; +} + +function unav_worker_size_recursive(string $path): array { + if (is_link($path)) { + return ['size' => 0, 'files' => 0, 'directories' => 0]; + } + if (is_file($path)) { + return ['size' => filesize($path) ?: 0, 'files' => 1, 'directories' => 0]; + } + if (!is_dir($path)) { + return ['size' => 0, 'files' => 0, 'directories' => 0]; + } + + $total = ['size' => 0, 'files' => 0, 'directories' => 1]; + foreach (scandir($path) ?: [] as $entry) { + if ($entry === '.' || $entry === '..') { + continue; + } + $child = unav_worker_size_recursive($path . '/' . $entry); + $total['size'] += $child['size']; + $total['files'] += $child['files']; + $total['directories'] += $child['directories']; + } + return $total; +} + function unav_worker_copy(string $source, string $destination, array &$job): void { if (is_link($source)) { throw new RuntimeException('Copying symlinks is not allowed'); diff --git a/server/public/app.js b/server/public/app.js index 6b8edad..6174e80 100644 --- a/server/public/app.js +++ b/server/public/app.js @@ -15,6 +15,8 @@ const state = { nextDebugId: 1, jobs: new Map(), jobRefresh: new Map(), + sizeJobs: new Map(), + sizeResults: new Map(), nextWindowId: 1, zIndex: 20 }; @@ -339,19 +341,23 @@ function renderProperties(body) { return; } + const sizeLabel = entry.type === 'directory' ? directorySizeLabel(entry) : formatBytes(entry.size); body.classList.add('properties'); body.innerHTML = `
Name
${escapeHtml(entry.name)}
Typ
${escapeHtml(entry.type)}
Pfad
${escapeHtml(entry.path)}
-
Größe
${formatBytes(entry.size)}
+
Größe
${escapeHtml(sizeLabel)}
Geändert
${new Date(entry.modifiedAt).toLocaleString()}
Besitzer
${escapeHtml(formatPrincipal(entry.owner, entry.ownerId))}
Gruppe
${escapeHtml(formatPrincipal(entry.group, entry.groupId))}
Rechte
${escapeHtml(entry.permissions ? `0${entry.permissions}`.slice(-4) : '-')}
`; + if (entry.type === 'directory') { + ensureDirectorySize(entry); + } } function renderQueue(body) { @@ -452,6 +458,24 @@ async function createJob(type, source, destination, refreshWindowIds = []) { return job; } +async function createSizeJob(entry) { + recordDebug('size.create.request', { source: entry.path }); + const body = new URLSearchParams(); + body.set('source', entry.path); + appendCsrf(body); + const job = await api(apiUrl('job.php?action=size'), { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, + body + }); + recordDebug('size.create.response', job); + state.jobs.set(job.id, job); + state.sizeJobs.set(entry.path, job.id); + pollJob(job.id); + render(); + return job; +} + async function reloadExplorerWindows(ids) { const uniqueIds = new Set(ids); const targets = state.windows.filter((win) => win.kind === 'explorer' && (uniqueIds.has(win.id) || !uniqueIds.size)); @@ -601,6 +625,8 @@ async function pollJob(id) { render(); if (['queued', 'running', 'cancel_requested'].includes(job.status)) { setTimeout(() => pollJob(id), 700); + } else if (job.type === 'size') { + finishSizeJob(job); } else { await refreshAfterJob(job); } @@ -610,6 +636,26 @@ async function pollJob(id) { } } +function ensureDirectorySize(entry) { + if (state.sizeResults.has(entry.path) || state.sizeJobs.has(entry.path)) { + return; + } + state.sizeJobs.set(entry.path, 'pending'); + createSizeJob(entry).catch((error) => { + state.sizeJobs.delete(entry.path); + showError(error); + }); +} + +function finishSizeJob(job) { + state.sizeJobs.delete(job.source); + if (job.status === 'completed' && job.result) { + state.sizeResults.set(job.source, job.result); + } + recordDebug('size.finish', { id: job.id, source: job.source, status: job.status, result: job.result || null }); + updatePropertiesWindows(); +} + async function refreshAfterJob(job) { const refresh = state.jobRefresh.get(job.id); if (refresh?.done) { @@ -961,6 +1007,16 @@ function formatBytes(bytes) { return `${(value / 1024 / 1024 / 1024).toFixed(1)} GB`; } +function directorySizeLabel(entry) { + const result = state.sizeResults.get(entry.path); + if (!result) { + return state.sizeJobs.has(entry.path) ? 'Berechne...' : 'Noch nicht berechnet'; + } + const files = Number(result.files || 0); + const directories = Math.max(0, Number(result.directories || 0) - 1); + return `${formatBytes(result.size)} · ${files} Dateien · ${directories} Ordner`; +} + function formatPrincipal(name, id) { if (name == null && id == null) return '-'; if (name == null || String(name) === String(id)) return String(id); diff --git a/u-navigator.plg b/u-navigator.plg index 537d880..c93f6c9 100644 --- a/u-navigator.plg +++ b/u-navigator.plg @@ -1,7 +1,7 @@ - + ]> @@ -14,7 +14,7 @@ https://git.casaderoll.de/michael/Unraid-Navigator/raw/branch/main/packages/&package; -b72f22b37e34b4bdfd93a57c138af2d0 +0100a8a8507d664658a9451a40881944