feat: initial implementation of content-addressed incremental backup engine
Rust-centric architecture with TypeScript facade following smartproxy/smartstorage pattern.
Core engine in Rust (FastCDC chunking, SHA-256, gzip, AES-256-GCM + Argon2id, binary pack files,
global index, snapshots, locking, verification, pruning, repair). TypeScript provides npm interface
via @push.rocks/smartrust RustBridge IPC with Unix socket streaming for ingest/restore.
All 14 integration tests pass.
2026-03-21 23:30:17 +00:00
|
|
|
use clap::Parser;
|
|
|
|
|
|
|
|
|
|
mod config;
|
|
|
|
|
mod error;
|
|
|
|
|
mod management;
|
|
|
|
|
mod chunker;
|
|
|
|
|
mod hasher;
|
|
|
|
|
mod compression;
|
|
|
|
|
mod encryption;
|
|
|
|
|
mod pack_writer;
|
|
|
|
|
mod pack_reader;
|
|
|
|
|
mod global_index;
|
|
|
|
|
mod repository;
|
|
|
|
|
mod snapshot;
|
|
|
|
|
mod lock;
|
|
|
|
|
mod ingest;
|
|
|
|
|
mod restore;
|
|
|
|
|
mod verify;
|
|
|
|
|
mod prune;
|
2026-03-21 23:46:29 +00:00
|
|
|
mod parity;
|
feat: initial implementation of content-addressed incremental backup engine
Rust-centric architecture with TypeScript facade following smartproxy/smartstorage pattern.
Core engine in Rust (FastCDC chunking, SHA-256, gzip, AES-256-GCM + Argon2id, binary pack files,
global index, snapshots, locking, verification, pruning, repair). TypeScript provides npm interface
via @push.rocks/smartrust RustBridge IPC with Unix socket streaming for ingest/restore.
All 14 integration tests pass.
2026-03-21 23:30:17 +00:00
|
|
|
mod repair;
|
|
|
|
|
|
|
|
|
|
#[derive(Parser, Debug)]
|
|
|
|
|
#[command(name = "containerarchive", about = "Content-addressed incremental backup engine")]
|
|
|
|
|
struct Cli {
|
|
|
|
|
/// Run in management mode (JSON IPC over stdin/stdout)
|
|
|
|
|
#[arg(long)]
|
|
|
|
|
management: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
|
async fn main() -> anyhow::Result<()> {
|
|
|
|
|
// Initialize logging to stderr (stdout is reserved for IPC)
|
|
|
|
|
tracing_subscriber::fmt()
|
|
|
|
|
.with_writer(std::io::stderr)
|
|
|
|
|
.with_env_filter(
|
|
|
|
|
tracing_subscriber::EnvFilter::from_default_env()
|
|
|
|
|
.add_directive(tracing::Level::INFO.into()),
|
|
|
|
|
)
|
|
|
|
|
.init();
|
|
|
|
|
|
|
|
|
|
let cli = Cli::parse();
|
|
|
|
|
|
|
|
|
|
if cli.management {
|
|
|
|
|
management::management_loop().await?;
|
|
|
|
|
} else {
|
|
|
|
|
eprintln!("containerarchive: use --management for IPC mode");
|
|
|
|
|
std::process::exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|