核心功能: - ✅ Categories/Series双视图管理(category_view.rs + import_markdown.rs) - ✅ FUSE Multi-Volume支持(tree_type参数) - ✅ SSH/SFTP/SCP/rsync协议完整实现(4042行) - ✅ NFS/SMB Module Phase 1-3完成 - ✅ Archive Module Phase 1-4完成(2916行) - ✅ Download Center API完整实现 - ✅ S3兼容API实现(560行) Git配置修正: - ✅ 删除错误origin(gitea.momentry.ddns.net) - ✅ 删除m5max128(指向机器名) - ✅ 设置origin = m5max128gitea.momentry.ddns.net/admin/markbase - ✅ 设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase 数据清理: - ✅ 删除38个临时SQLite(保留accusys.sqlite、demo.sqlite) - ✅ 删除.bak、test_*.bin、调试脚本等临时文件 - ✅ 删除临时目录(build/、download files/、raid_test/等) - ✅ 更新.gitignore排除临时文件 架构优化: - 52个文件修改,2434行新增,4739行删除 - Workspace成员整合(16个crate) - 数据库状态:accusys.sqlite保留(主demo测试) 远程同步: - ✅ 准备推送到m5max128gitea(远程Gitea) - ✅ 准备推送到m4minigitea(本地Gitea)
108 lines
3.7 KiB
Rust
108 lines
3.7 KiB
Rust
use anyhow::{Context, Result};
|
|
use std::path::PathBuf;
|
|
|
|
impl crate::sftp::config::SftpConfig {
|
|
pub fn validate(&self) -> Result<()> {
|
|
// SFTP section validation
|
|
if self.sftp.port == 0 {
|
|
return Err(anyhow::anyhow!("SFTP port cannot be 0"));
|
|
}
|
|
|
|
if self.sftp.port < 1024 && self.sftp.port != 22 {
|
|
return Err(anyhow::anyhow!(
|
|
"SFTP port {} is invalid. Must be >= 1024 or 22 (standard SSH port)",
|
|
self.sftp.port
|
|
));
|
|
}
|
|
|
|
if self.sftp.base_path.is_empty() {
|
|
return Err(anyhow::anyhow!("SFTP base_path cannot be empty"));
|
|
}
|
|
|
|
if self.sftp.auth_db_path.is_empty() {
|
|
return Err(anyhow::anyhow!("SFTP auth_db_path cannot be empty"));
|
|
}
|
|
|
|
if self.sftp.max_connections == 0 {
|
|
return Err(anyhow::anyhow!("SFTP max_connections must be >= 1"));
|
|
}
|
|
|
|
// Performance section validation
|
|
if self.performance.path_cache_size == 0 {
|
|
return Err(anyhow::anyhow!("performance.path_cache_size must be >= 1"));
|
|
}
|
|
|
|
if self.performance.chunk_size == 0 {
|
|
return Err(anyhow::anyhow!("performance.chunk_size must be >= 1"));
|
|
}
|
|
|
|
if self.performance.chunk_size > 1048576 {
|
|
return Err(anyhow::anyhow!(
|
|
"performance.chunk_size {} is too large. Max: 1048576 (1MB)",
|
|
self.performance.chunk_size
|
|
));
|
|
}
|
|
|
|
if self.performance.connection_pool_size == 0 {
|
|
return Err(anyhow::anyhow!("performance.connection_pool_size must be >= 1"));
|
|
}
|
|
|
|
if self.performance.max_open_files == 0 {
|
|
return Err(anyhow::anyhow!("performance.max_open_files must be >= 1"));
|
|
}
|
|
|
|
if self.performance.max_open_dirs == 0 {
|
|
return Err(anyhow::anyhow!("performance.max_open_dirs must be >= 1"));
|
|
}
|
|
|
|
// Resource section validation
|
|
if self.resource.file_timeout_seconds == 0 {
|
|
return Err(anyhow::anyhow!("resource.file_timeout_seconds must be >= 1"));
|
|
}
|
|
|
|
if self.resource.dir_timeout_seconds == 0 {
|
|
return Err(anyhow::anyhow!("resource.dir_timeout_seconds must be >= 1"));
|
|
}
|
|
|
|
if self.resource.cleanup_interval_seconds == 0 {
|
|
return Err(anyhow::anyhow!("resource.cleanup_interval_seconds must be >= 1"));
|
|
}
|
|
|
|
// Logging section validation
|
|
if self.logging.level.is_empty() {
|
|
return Err(anyhow::anyhow!("logging.level cannot be empty"));
|
|
}
|
|
|
|
let valid_log_levels = ["trace", "debug", "info", "warn", "error", "off"];
|
|
if !valid_log_levels.contains(&self.logging.level.as_str()) {
|
|
return Err(anyhow::anyhow!(
|
|
"Invalid logging.level: {}. Must be one of: {}",
|
|
self.logging.level,
|
|
valid_log_levels.join(", ")
|
|
));
|
|
}
|
|
|
|
// Rsync section validation (if enabled)
|
|
if self.rsync.enabled {
|
|
if self.rsync.block_size == 0 {
|
|
return Err(anyhow::anyhow!("rsync.block_size must be >= 1 when rsync is enabled"));
|
|
}
|
|
|
|
if self.rsync.compression_level < 1 || self.rsync.compression_level > 9 {
|
|
return Err(anyhow::anyhow!(
|
|
"rsync.compression_level {} is invalid. Must be 1-9",
|
|
self.rsync.compression_level
|
|
));
|
|
}
|
|
|
|
if self.rsync.protocol_version < 27 || self.rsync.protocol_version > 31 {
|
|
return Err(anyhow::anyhow!(
|
|
"rsync.protocol_version {} is invalid. Must be 27-31",
|
|
self.rsync.protocol_version
|
|
));
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
} |