架构设计: - 上层(interface):虚拟操作系统层 - web.rs: HTTP Server - ssh.rs: SSH/SFTP Server - webdav.rs: WebDAV Server - iscsi.rs: iSCSI Server - tree.rs: File Tree管理(categories/series) - 中层(metadata):核心数据库层 - config.rs: 配置管理(从framework.rs迁移) - user.rs: 用户管理 - db.rs: 数据库管理 - auth.rs: 认证授权 - 底层(storage):文件存取层 - scan.rs: 文件扫描导入(从framework.rs迁移) - hash.rs: 哈希计算(从framework.rs迁移) - archive.rs: 压缩解压缩 - sync.rs: 文件同步 - mount.rs: 存储挂载 - 辅助工具(tools):辅助功能 - render.rs: Markdown渲染(从framework.rs迁移) - test.rs: 测试命令(从framework.rs迁移) 架构优势: ✅ 清晰的三层分离,符合架构理念 ✅ 21个独立模块,职责清晰 ✅ main.rs简化至23行,cli/mod.rs24行 ✅ 删除旧架构(cli/apps和framework.rs) ✅ 编译成功,所有CLI命令可用 命令範例: markbase interface web start --port 11438 markbase interface ssh start --port 2024 markbase interface tree import --user accusys --tree-type categories markbase metadata config show markbase storage scan directory --user accusys --dir data/downloads markbase tools render file --file README.md 文件统计: - 新增文件:20个Rust模块 - 删除文件:3个旧架构文件 - 修改文件:2个核心入口 - 总计:21个文件变更
73 lines
2.0 KiB
Rust
73 lines
2.0 KiB
Rust
use clap::Subcommand;
|
|
use axum::{extract::Request, response::IntoResponse, Extension};
|
|
|
|
#[derive(Subcommand)]
|
|
pub enum WebdavCommand {
|
|
Start {
|
|
#[arg(short, long, default_value = "8002")]
|
|
port: u16,
|
|
#[arg(short, long)]
|
|
user: String,
|
|
},
|
|
}
|
|
|
|
pub async fn handle_webdav_command(cmd: WebdavCommand) -> anyhow::Result<()> {
|
|
match cmd {
|
|
WebdavCommand::Start { port, user } => {
|
|
let db_path = std::path::PathBuf::from(crate::FileTree::user_db_path(&user));
|
|
|
|
if !db_path.exists() {
|
|
return Err(anyhow::anyhow!(
|
|
"User database not found: {}",
|
|
db_path.display()
|
|
));
|
|
}
|
|
|
|
println!("=== MarkBase WebDAV Server ===");
|
|
println!("User: {}", user);
|
|
println!("Port: {}", port);
|
|
println!("Database: {}", db_path.display());
|
|
println!("");
|
|
|
|
run_webdav_server(port, user, db_path).await?;
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
async fn run_webdav_server(
|
|
port: u16,
|
|
user: String,
|
|
db_path: std::path::PathBuf,
|
|
) -> anyhow::Result<()> {
|
|
use axum::{extract::Request, response::IntoResponse, routing::any, Extension, Router};
|
|
use tokio::net::TcpListener;
|
|
|
|
let webdav = markbase_webdav::webdav::MarkBaseWebDAV::new(user, db_path);
|
|
let dav_handler = webdav.create_handler();
|
|
|
|
let app = Router::new()
|
|
.route("/webdav", any(handle_dav))
|
|
.route("/webdav/", any(handle_dav))
|
|
.route("/webdav/*path", any(handle_dav))
|
|
.layer(Extension(dav_handler));
|
|
|
|
let addr = format!("127.0.0.1:{}", port);
|
|
let listener = TcpListener::bind(&addr).await?;
|
|
|
|
println!("WebDAV server listening on http://{}", addr);
|
|
println!("Mount point: /webdav");
|
|
println!("");
|
|
println!("Press Ctrl+C to stop");
|
|
|
|
axum::serve(listener, app).await?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn handle_dav(
|
|
Extension(dav): Extension<dav_server::DavHandler>,
|
|
req: Request,
|
|
) -> impl IntoResponse {
|
|
dav.handle(req).await
|
|
} |