CLI三层架构重构完成:interface/metadata/storage/tools层
架构设计: - 上层(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个文件变更
This commit is contained in:
20
markbase-core/src/cli/tools/mod.rs
Normal file
20
markbase-core/src/cli/tools/mod.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
pub mod render;
|
||||
pub mod test;
|
||||
|
||||
use clap::Subcommand;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
pub enum ToolsCommands {
|
||||
#[command(flatten)]
|
||||
Render(render::RenderCommand),
|
||||
#[command(flatten)]
|
||||
Test(test::TestCommand),
|
||||
}
|
||||
|
||||
pub async fn handle_tools_command(cmd: ToolsCommands) -> anyhow::Result<()> {
|
||||
match cmd {
|
||||
ToolsCommands::Render(c) => render::handle_render_command(c)?,
|
||||
ToolsCommands::Test(c) => test::handle_test_command(c)?,
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
26
markbase-core/src/cli/tools/render.rs
Normal file
26
markbase-core/src/cli/tools/render.rs
Normal file
@@ -0,0 +1,26 @@
|
||||
use clap::Subcommand;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
pub enum RenderCommand {
|
||||
File {
|
||||
#[arg(short, long)]
|
||||
file: String,
|
||||
#[arg(short, long)]
|
||||
output: Option<String>,
|
||||
},
|
||||
}
|
||||
|
||||
pub fn handle_render_command(cmd: RenderCommand) -> anyhow::Result<()> {
|
||||
match cmd {
|
||||
RenderCommand::File { file, output } => {
|
||||
let md = std::fs::read_to_string(&file)?;
|
||||
let html = crate::render::md_to_html(&md);
|
||||
if let Some(path) = &output {
|
||||
std::fs::write(path, html)?;
|
||||
} else {
|
||||
println!("{html}");
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
61
markbase-core/src/cli/tools/test.rs
Normal file
61
markbase-core/src/cli/tools/test.rs
Normal file
@@ -0,0 +1,61 @@
|
||||
use clap::Subcommand;
|
||||
|
||||
#[derive(Subcommand)]
|
||||
pub enum TestCommand {
|
||||
Bcrypt {
|
||||
#[arg(short, long, default_value = "demo123")]
|
||||
password: String,
|
||||
#[arg(long)]
|
||||
verify_hash: Option<String>,
|
||||
},
|
||||
Connection {
|
||||
#[arg(short, long, default_value = "11438")]
|
||||
port: u16,
|
||||
},
|
||||
}
|
||||
|
||||
pub fn handle_test_command(cmd: TestCommand) -> anyhow::Result<()> {
|
||||
match cmd {
|
||||
TestCommand::Bcrypt { password, verify_hash } => {
|
||||
use bcrypt::{hash, verify, DEFAULT_COST};
|
||||
|
||||
println!("=== bcrypt Hash Test ===");
|
||||
println!("Password: {}", password);
|
||||
println!("");
|
||||
|
||||
let new_hash = hash(&password, DEFAULT_COST)?;
|
||||
println!("Generated hash:");
|
||||
println!("{}", new_hash);
|
||||
println!("");
|
||||
|
||||
if let Some(hash_to_verify) = verify_hash {
|
||||
println!("Verifying hash: {}", hash_to_verify);
|
||||
let valid = verify(&password, &hash_to_verify)?;
|
||||
println!("Valid: {}", valid);
|
||||
println!("");
|
||||
}
|
||||
|
||||
let db_hash = "$2b$10$ha5wU.mOi8fHLJCfun860u2cfVopa04jwe/q82IKOwqp5uG70qsH6";
|
||||
println!("Database hash: {}", db_hash);
|
||||
let valid = verify(&password, db_hash)?;
|
||||
println!("Database hash valid for '{}': {}", password, valid);
|
||||
println!("");
|
||||
|
||||
if !valid {
|
||||
println!("❌ Database hash is incorrect!");
|
||||
println!("Update SQL:");
|
||||
println!("UPDATE sftpgo_users SET password_hash = '{}' WHERE username IN ('testuser', 'demo', 'warren', 'momentry');", new_hash);
|
||||
println!("");
|
||||
println!("Execute:");
|
||||
println!("sqlite3 data/auth.sqlite \"UPDATE sftpgo_users SET password_hash = '{}' WHERE username IN ('testuser', 'demo', 'warren', 'momentry');\"", new_hash);
|
||||
} else {
|
||||
println!("✅ Database hash is correct!");
|
||||
}
|
||||
}
|
||||
TestCommand::Connection { port } => {
|
||||
println!("Testing connection to port: {}", port);
|
||||
// TODO: 实现连接测试逻辑
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user