Files
markbase/markbase-core/src/ssh2_mod/rsync_receiver.rs
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  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)
2026-06-12 12:59:54 +08:00

110 lines
3.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// rsync Receiver Handler实现ssh2辅助模块
// 支持完整的rsync receiver流程
use anyhow::{Result, anyhow};
use ssh2::Channel;
use std::path::{Path, PathBuf};
use std::fs::File;
use std::io::{Read, Write, BufReader, BufWriter};
use log::{info, warn, debug};
/// rsync Receiver Handler
pub struct RsyncReceiverHandler {
base_path: PathBuf,
user_id: String,
}
impl RsyncReceiverHandler {
pub fn new(base_path: PathBuf, user_id: String) -> Self {
Self { base_path, user_id }
}
/// 处理rsync receiver命令
pub fn handle_rsync_receiver(&self, channel: &mut Channel, command: &str) -> Result<()> {
info!("rsync receiver command: {}", command);
// 解析rsync命令
// rsync --server --receiver . /path/to/file
let parts: Vec<&str> = command.split_whitespace().collect();
if parts.len() < 4 {
return Err(anyhow!("Invalid rsync command: {}", command));
}
// 获取目标路径
let dest_path = parts.last().unwrap_or(".");
let full_path = self.base_path.join(&self.user_id).join(dest_path);
info!("rsync receiver target: {}", full_path.display());
// rsync receiver流程
// 1. 接收客户端checksum
// 2. 发送文件列表
// 3. 接收delta数据
// 4. 应用delta到目标文件
// Phase 1接收客户端checksum
self.receive_checksums(channel)?;
// Phase 2发送文件列表空列表因为这是receiver
channel.write_all(b"\0\0\0\0")?; // 空文件列表
// Phase 3接收delta数据并应用
self.receive_delta_data(channel, &full_path)?;
info!("rsync receiver completed");
Ok(())
}
/// 接收客户端checksum
fn receive_checksums(&self, channel: &mut Channel) -> Result<()> {
debug!("Receiving client checksums");
let mut buf = vec![0u8; 4096];
let len = channel.read(&mut buf)?;
if len == 0 {
warn!("No checksum data received");
return Ok(());
}
debug!("Received {} bytes of checksum data", len);
// 解析checksum数据简化处理
// 实际rsync checksum格式block_size + weak_checksum + strong_checksum
Ok(())
}
/// 接收delta数据并应用到文件
fn receive_delta_data(&self, channel: &mut Channel, dest_path: &Path) -> Result<()> {
debug!("Receiving delta data for: {}", dest_path.display());
// 创建目标文件
let mut file = BufWriter::new(File::create(dest_path)?);
let mut buf = vec![0u8; 8192];
let mut received = 0;
// 读取delta数据直到EOF
loop {
let len = channel.read(&mut buf)?;
if len == 0 {
break;
}
// 简化处理直接写入数据实际应解析delta指令
file.write_all(&buf[..len])?;
received += len;
// 发送进度确认
channel.write_all(&[0x00])?;
}
file.flush()?;
info!("Received {} bytes of delta data", received);
Ok(())
}
}