From 1e4fb38cfb175c001ca2262e34b59ad4a0cb55b1 Mon Sep 17 00:00:00 2001 From: wisecolt Date: Mon, 2 Feb 2026 22:14:41 +0300 Subject: [PATCH] =?UTF-8?q?feat(rclone):=20mount=20ba=C5=9Flatma=20durumu?= =?UTF-8?q?=20ve=20log=20sunumunu=20geli=C5=9Ftir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mount işlemi için "Başlatılıyor" ara durumu eklenerek kullanıcı geri bildirimi iyileştirildi. Sunucu tarafında log seviyeleri ayrıştırılarak gerçek hatalar bilgi mesajlarından ayırt edildi ve arayüze yansıtıldı. --- client/src/routes/Settings.svelte | 40 ++++++++++++++++++++++++++++--- server/server.js | 34 +++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/client/src/routes/Settings.svelte b/client/src/routes/Settings.svelte index d17c183..e7c9187 100644 --- a/client/src/routes/Settings.svelte +++ b/client/src/routes/Settings.svelte @@ -198,7 +198,24 @@ if (!resp.ok || !data?.ok) { throw new Error(data?.error || `HTTP ${resp.status}`); } - success = "Rclone mount başlatıldı."; + + // Mount başlatıldı, birkaç saniye bekleyip tekrar kontrol et + success = "Rclone mount başlatılıyor..."; + + // 2 saniye sonra status güncelle + setTimeout(async () => { + await loadRcloneStatus(); + // Status yüklendikten sonra mesajı güncelle + if (rcloneStatus?.mounted) { + success = "Rclone mount başarıyla başlatıldı."; + } else if (rcloneStatus?.running) { + success = "Rclone mount başlatıldı, mount tamamlanıyor..."; + } else { + error = "Rclone mount başlatılamadı."; + } + }, 2000); + + // İlk status güncellemesi await loadRcloneStatus(); } catch (err) { error = err?.message || "Rclone mount başlatılamadı."; @@ -468,7 +485,17 @@
Durum:
Enabled: {rcloneStatus.enabled ? "Evet" : "Hayır"}
-
Mounted: {rcloneStatus.mounted ? "Evet" : "Hayır"}
+
+ Mounted: + {#if rcloneStatus.mountStatus === "starting"} + Başlatılıyor... + {:else if rcloneStatus.mounted} + Evet + {:else} + Hayır + {/if} +
+
Running: {rcloneStatus.running ? "Evet" : "Hayır"}
Remote: {rcloneStatus.remoteConfigured ? "Hazır" : "Eksik"}
{#if rcloneStatus.vfsCacheMode}
VFS Cache Mode: {rcloneStatus.vfsCacheMode}
@@ -489,7 +516,14 @@
{/if} {#if rcloneStatus.lastError} -
Son hata: {rcloneStatus.lastError}
+
+ Son hata: {rcloneStatus.lastError} +
+ {/if} + {#if rcloneStatus.lastLog && !rcloneStatus.lastError} +
+ Son log: {rcloneStatus.lastLog} +
{/if} {/if} diff --git a/server/server.js b/server/server.js index 1da9dd4..194e4e1 100644 --- a/server/server.js +++ b/server/server.js @@ -780,6 +780,7 @@ function resolveRootDir(rootFolder) { let rcloneProcess = null; let rcloneLastError = null; +let rcloneLastLogMessage = null; // Tüm log mesajları için (NOTICE dahil) const rcloneAuthSessions = new Map(); let rcloneCacheCleanTimer = null; // Auto-restart sayaçları @@ -1276,12 +1277,34 @@ function startRcloneMount(settings) { rcloneProcess.stdout.on("data", (data) => { const msg = data.toString().trim(); - if (msg) console.log(`🌀 rclone: ${msg}`); + if (msg) { + rcloneLastLogMessage = msg; + // NOTICE mesajları için farklı ikon, diğerleri için normal + if (msg.toUpperCase().includes("NOTICE")) { + console.log(`📡 rclone: ${msg}`); + } else { + console.log(`🌀 rclone: ${msg}`); + } + } }); rcloneProcess.stderr.on("data", (data) => { const msg = data.toString().trim(); if (msg) { - rcloneLastError = msg; + rcloneLastLogMessage = msg; + // NOTICE ve INFO seviyesindeki loglar hata değil + // Sadece ERROR, FATAL, CRITICAL seviyesindekileri "son hata" olarak işaretle + const upperMsg = msg.toUpperCase(); + if (upperMsg.includes("ERROR") || + upperMsg.includes("FATAL") || + upperMsg.includes("CRITICAL") || + upperMsg.includes("FAILED") || + upperMsg.includes("COULDN'T") || + upperMsg.includes("CANNOT") || + upperMsg.includes("REFUSED") || + upperMsg.includes("TIMEOUT") || + upperMsg.includes("CONNECTION")) { + rcloneLastError = msg; + } console.warn(`⚠️ rclone: ${msg}`); } }); @@ -9210,6 +9233,10 @@ app.get("/api/rclone/status", requireAuth, async (req, res) => { enabled: RCLONE_ENABLED, mounted, running: Boolean(rcloneProcess), + // Mount durumu hakkında daha fazla bilgi + mountStatus: !rcloneProcess ? "stopped" : + mounted ? "mounted" : + "starting", // Process çalışıyor ama mount henüz tamamlanmadı mountDir: settings.mountDir, remoteName: settings.remoteName, remotePath: settings.remotePath, @@ -9219,7 +9246,8 @@ app.get("/api/rclone/status", requireAuth, async (req, res) => { cacheCleanMinutes: settings.cacheCleanMinutes || 0, configExists: fs.existsSync(settings.configPath), remoteConfigured: rcloneConfigHasRemote(settings.remoteName), - lastError: rcloneLastError || null, + lastError: rcloneLastError || null, // Sadece gerçek hatalar + lastLog: rcloneLastLogMessage || null, // Son log mesajı (NOTICE dahil) // Performans ayarları vfsCacheMode: RCLONE_VFS_CACHE_MODE, bufferSize: RCLONE_BUFFER_SIZE,