Support multiple concurrent torrent copy operations

Update monitoring to handle multiple simultaneous torrent copy operations
using the new directory-based marker structure.

Changes:
- Rename get_active_torrent_copy() to get_active_torrent_copies()
- Read all marker files from /tmp/torrent-copy/ directory
- Return Vec<String> instead of Option<String> for multiple copies
- Display each active copy as separate sub-service
- Unsanitize filenames by replacing _ with /

This enables monitoring when multiple torrents finish simultaneously
and are being copied in parallel to permanent storage.
This commit is contained in:
Christoffer Martinsson 2025-12-07 14:47:49 +01:00
parent d93260529b
commit 4a8cfbbde4
2 changed files with 27 additions and 14 deletions

6
Cargo.lock generated
View File

@ -279,7 +279,7 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
[[package]] [[package]]
name = "cm-dashboard" name = "cm-dashboard"
version = "0.1.257" version = "0.1.258"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@ -301,7 +301,7 @@ dependencies = [
[[package]] [[package]]
name = "cm-dashboard-agent" name = "cm-dashboard-agent"
version = "0.1.257" version = "0.1.258"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -325,7 +325,7 @@ dependencies = [
[[package]] [[package]]
name = "cm-dashboard-shared" name = "cm-dashboard-shared"
version = "0.1.257" version = "0.1.258"
dependencies = [ dependencies = [
"chrono", "chrono",
"serde", "serde",

View File

@ -179,8 +179,8 @@ impl SystemdCollector {
}); });
} }
// Add active torrent copy status // Add active torrent copy status for each copy operation
if let Some(torrent_name) = self.get_active_torrent_copy() { for torrent_name in self.get_active_torrent_copies() {
let metrics = Vec::new(); let metrics = Vec::new();
sub_services.push(SubServiceData { sub_services.push(SubServiceData {
@ -1101,16 +1101,29 @@ impl SystemdCollector {
Some((active_count, download_mbps, upload_mbps)) Some((active_count, download_mbps, upload_mbps))
} }
/// Check if torrent copy script is actively running /// Check for active torrent copy operations
/// Returns: Some(torrent_name) if copy is in progress, None otherwise /// Returns: Vec of filenames currently being copied
fn get_active_torrent_copy(&self) -> Option<String> { fn get_active_torrent_copies(&self) -> Vec<String> {
let marker_path = "/tmp/torrent-copy-active"; let marker_dir = "/tmp/torrent-copy";
let mut active_copies = Vec::new();
// Check if marker file exists and read torrent name // Read all marker files from directory
std::fs::read_to_string(marker_path) if let Ok(entries) = std::fs::read_dir(marker_dir) {
.ok() for entry in entries.flatten() {
.map(|content| content.trim().to_string()) if let Ok(file_type) = entry.file_type() {
.filter(|name| !name.is_empty()) if file_type.is_file() {
// Filename is the marker (sanitized torrent name)
if let Some(filename) = entry.file_name().to_str() {
// Convert sanitized name back (replace _ with /)
let display_name = filename.replace('_', "/");
active_copies.push(display_name);
}
}
}
}
}
active_copies
} }
} }