warpgate/src/services/webdav.rs
grabbit 08f8fc4667 Per-share independent mounts: each share gets its own rclone process
Replace the hierarchical single-mount design with independent mounts:
each [[shares]] entry is a (name, remote_path, mount_point) triplet
with its own rclone FUSE mount process and dedicated RC API port
(5572 + index). Remove top-level connection.remote_path and [mount]
section. Auto-warmup now runs in a background thread to avoid blocking
the supervision loop.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 12:32:18 +08:00

124 lines
2.7 KiB
Rust

//! WebDAV service management via rclone serve webdav.
use crate::config::Config;
/// Build the `rclone serve webdav` command arguments.
///
/// Uses the first share's mount_point as the serve directory.
/// Multi-share WebDAV support is future work.
pub fn build_serve_args(config: &Config) -> Vec<String> {
let mount_point = config.shares[0].mount_point.display().to_string();
let addr = format!("0.0.0.0:{}", config.protocols.webdav_port);
vec![
"serve".into(),
"webdav".into(),
mount_point,
"--addr".into(),
addr,
"--read-only=false".into(),
]
}
/// Build the full command string (for systemd ExecStart).
pub fn build_serve_command(config: &Config) -> String {
let args = build_serve_args(config);
format!("/usr/bin/rclone {}", args.join(" "))
}
#[cfg(test)]
mod tests {
use super::*;
fn test_config() -> Config {
toml::from_str(
r#"
[connection]
nas_host = "10.0.0.1"
nas_user = "admin"
[cache]
dir = "/tmp/cache"
[read]
[bandwidth]
[writeback]
[directory_cache]
[protocols]
[[shares]]
name = "photos"
remote_path = "/photos"
mount_point = "/mnt/photos"
"#,
)
.unwrap()
}
#[test]
fn test_build_serve_args() {
let config = test_config();
let args = build_serve_args(&config);
assert_eq!(args[0], "serve");
assert_eq!(args[1], "webdav");
assert_eq!(args[2], "/mnt/photos");
assert_eq!(args[3], "--addr");
assert_eq!(args[4], "0.0.0.0:8080");
assert_eq!(args[5], "--read-only=false");
}
#[test]
fn test_build_serve_args_custom_port() {
let mut config = test_config();
config.protocols.webdav_port = 9090;
let args = build_serve_args(&config);
assert_eq!(args[4], "0.0.0.0:9090");
}
#[test]
fn test_build_serve_args_uses_first_share() {
let config: Config = toml::from_str(
r#"
[connection]
nas_host = "10.0.0.1"
nas_user = "admin"
[cache]
dir = "/tmp/cache"
[read]
[bandwidth]
[writeback]
[directory_cache]
[protocols]
[[shares]]
name = "photos"
remote_path = "/volume1/photos"
mount_point = "/mnt/photos"
[[shares]]
name = "videos"
remote_path = "/volume1/videos"
mount_point = "/mnt/videos"
"#,
)
.unwrap();
let args = build_serve_args(&config);
assert_eq!(args[2], "/mnt/photos");
}
#[test]
fn test_build_serve_command() {
let config = test_config();
let cmd = build_serve_command(&config);
assert!(cmd.starts_with("/usr/bin/rclone serve webdav"));
assert!(cmd.contains("/mnt/photos"));
assert!(cmd.contains("--addr"));
assert!(cmd.contains("0.0.0.0:8080"));
}
}