diff options
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/geniza-net.rs | 28 | ||||
-rw-r--r-- | src/bin/geniza.rs | 166 |
2 files changed, 172 insertions, 22 deletions
diff --git a/src/bin/geniza-net.rs b/src/bin/geniza-net.rs index 6d38eae..0c82e6d 100644 --- a/src/bin/geniza-net.rs +++ b/src/bin/geniza-net.rs @@ -12,22 +12,6 @@ use geniza::*; use std::path::Path; use clap::{App, SubCommand, Arg}; -fn parse_dat_key(raw_key: &str) -> Result<Vec<u8>> { - - if raw_key.len() != 32 * 2 { - bail!("dat key not correct length"); - } - let mut key_bytes = vec![]; - for i in 0..32 { - let r = u8::from_str_radix(&raw_key[2 * i..2 * i + 2], 16); - match r { - Ok(b) => key_bytes.push(b), - Err(e) => bail!("Problem with hex: {}", e), - }; - } - Ok(key_bytes) -} - fn run() -> Result<()> { env_logger::init().unwrap(); @@ -81,7 +65,7 @@ fn run() -> Result<()> { ("connect", Some(subm)) => { let host_port = subm.value_of("host_port").unwrap(); let dat_key = subm.value_of("dat_key").unwrap(); - let key_bytes = parse_dat_key(&dat_key)?; + let key_bytes = parse_dat_address(&dat_key)?; DatConnection::connect(host_port, &key_bytes, false)?; println!("Done!"); } @@ -89,7 +73,7 @@ fn run() -> Result<()> { let host_port = subm.value_of("host_port").unwrap(); let dat_key = subm.value_of("dat_key").unwrap(); let count: u64 = subm.value_of("count").unwrap().parse().unwrap(); - let key_bytes = parse_dat_key(&dat_key)?; + let key_bytes = parse_dat_address(&dat_key)?; let mut dc = DatConnection::connect(host_port, &key_bytes, false)?; dc.receive_some(false, count)?; dc.receive_some(true, count)?; @@ -97,7 +81,7 @@ fn run() -> Result<()> { } ("discovery-key", Some(subm)) => { let dat_key = subm.value_of("dat_key").unwrap(); - let key_bytes = parse_dat_key(&dat_key)?; + let key_bytes = parse_dat_address(&dat_key)?; let disc_key = make_discovery_key(&key_bytes); for b in disc_key { print!("{:02x}", b); @@ -106,7 +90,7 @@ fn run() -> Result<()> { } ("discovery-dns-name", Some(subm)) => { let dat_key = subm.value_of("dat_key").unwrap(); - let key_bytes = parse_dat_key(&dat_key)?; + let key_bytes = parse_dat_address(&dat_key)?; let disc_key = make_discovery_key(&key_bytes); for b in 0..20 { print!("{:02x}", disc_key[b]); @@ -115,7 +99,7 @@ fn run() -> Result<()> { } ("discover-dns", Some(subm)) => { let dat_key = subm.value_of("dat_key").unwrap(); - let key_bytes = parse_dat_key(&dat_key)?; + let key_bytes = parse_dat_address(&dat_key)?; let peers = discover_peers_dns(&key_bytes)?; if peers.len() == 0 { println!("No peers found!"); @@ -128,7 +112,7 @@ fn run() -> Result<()> { ("naive-clone", Some(subm)) => { let host_port = subm.value_of("host_port").unwrap(); let dat_key = subm.value_of("dat_key").unwrap(); - let key_bytes = parse_dat_key(&dat_key)?; + let key_bytes = parse_dat_address(&dat_key)?; let dir = Path::new(subm.value_of("dat-dir").unwrap()); let mut metadata = SleepDirRegister::create(&dir, "metadata")?; node_simple_clone(host_port, &key_bytes, &mut metadata, false)?; diff --git a/src/bin/geniza.rs b/src/bin/geniza.rs new file mode 100644 index 0000000..f5c73b0 --- /dev/null +++ b/src/bin/geniza.rs @@ -0,0 +1,166 @@ +// Free Software under GPL-3.0, see LICENSE +// Copyright 2017 Bryan Newbold + +extern crate clap; +extern crate env_logger; +#[macro_use] +extern crate error_chain; +extern crate geniza; + +// TODO: more careful import +use geniza::*; +use std::path::{Path, PathBuf}; +use clap::{App, SubCommand}; +use std::env::current_dir; + + +// Helper to find a dat directory somewhere in the parent to the current working directory (or None +// if not found) +fn find_dat_dir() -> Option<PathBuf> { + let mut here: &Path = ¤t_dir().unwrap(); + loop { + let check = here.join(".dat"); + if check.is_dir() && check.join("metadata.tree").is_file() { + return Some(check); + }; + here = match here.parent() { + None => return None, + Some(t) => t, + } + } +} + +fn run() -> Result<()> { + env_logger::init().unwrap(); + + let matches = App::new("geniza") + .version(env!("CARGO_PKG_VERSION")) + .subcommand( + SubCommand::with_name("clone") + .about("Finds and downloads a dat archive from the network into a given folder") + .arg_from_usage("<address> 'dat address (public key) to fetch'") + .arg_from_usage("[dir] 'directory to clone into'") + .arg_from_usage("--full 'pull and save complete history (not just latest version)'"), + ) + .subcommand( + SubCommand::with_name("init") + .about("Creates a data archive in the current directory") + .arg_from_usage("[dir] 'init somewhere other than current directory'"), + ) + .subcommand( + SubCommand::with_name("status") + .about("Displays current status of archive and checkout") + ) + .subcommand( + SubCommand::with_name("log") + .about("Displays version history of the archive") + ) + .subcommand( + SubCommand::with_name("checkout") + .about("Copies (or overwrites) files from dat archive") + .arg_from_usage("<path> 'relative path to checkout'"), + ) + .subcommand( + SubCommand::with_name("add") + .about("Adds a path to the current dat archive") + .arg_from_usage("<path> 'file to delete from dat archive'"), + ) + .subcommand( + SubCommand::with_name("rm") + .about("Removes a path from the current dat archive, and from disk (danger!)") + .arg_from_usage("<path> 'file to delete from dat archive'"), + ) + .subcommand( + SubCommand::with_name("ls") + .about("Lists contents of the archive") + .arg_from_usage("[path] 'path to display'") + .arg_from_usage("--recursive 'show directory recursively'"), + ) + .subcommand( + SubCommand::with_name("seed") + .about("Uploads indefinately to any peer") + ) + .subcommand( + SubCommand::with_name("pull") + .about("Pulls highest known version from all possible peers") + .arg_from_usage("--forever 'continues to search for updates forever'"), + ) + .get_matches(); + + match matches.subcommand() { + ("clone", Some(subm)) => { + let dat_key = subm.value_of("dat_key").unwrap(); + let _key_bytes = parse_dat_address(&dat_key)?; + unimplemented!(); + //let dir = Path::new(subm.value_of("dat-dir").unwrap()); + //let mut metadata = SleepDirRegister::create(&dir, "metadata")?; + //node_simple_clone(host_port, &key_bytes, &mut metadata, false)?; + } + ("init", Some(subm)) => { + let _dir = Path::new(subm.value_of("dir").unwrap()); + unimplemented!(); + } + ("status", Some(_subm)) => { + unimplemented!(); + } + ("log", Some(_subm)) => { + let dat_dir = match find_dat_dir() { + Some(p) => p, + None => { + println!("Couldn't find '.dat/' in the current or (any parent) directory."); + println!("Are you running from inside a Dat archive?"); + ::std::process::exit(-1); + } + }; + println!("{:?}", dat_dir); + let mut drive = DatDrive::open(dat_dir, false)?; + for entry in drive.history(0) { + let entry = entry?; + if let Some(stat) = entry.stat { + if stat.get_blocks() == 0 { + println!("{}\t[chg] {}", + entry.index, entry.path.display()); + } else { + println!("{}\t[put] {}\t{} bytes ({} blocks)", + entry.index, entry.path.display(), stat.get_size(), stat.get_blocks()); + } + } else { + println!("{}\t[del] {}", + entry.index, entry.path.display()); + } + } + } + ("checkout", Some(subm)) => { + let _path = Path::new(subm.value_of("path").unwrap()); + unimplemented!(); + } + ("add", Some(subm)) => { + let _path = Path::new(subm.value_of("path").unwrap()); + unimplemented!(); + } + ("rm", Some(subm)) => { + let _path = Path::new(subm.value_of("path").unwrap()); + unimplemented!(); + } + ("ls", Some(subm)) => { + let _path = Path::new(subm.value_of("path").unwrap()); + unimplemented!(); + } + ("seed", Some(subm)) => { + let _path = Path::new(subm.value_of("path").unwrap()); + unimplemented!(); + } + ("pull", Some(subm)) => { + let _path = Path::new(subm.value_of("path").unwrap()); + unimplemented!(); + } + _ => { + println!("Missing or unimplemented command!"); + println!("{}", matches.usage()); + ::std::process::exit(-1); + } + } + Ok(()) +} + +quick_main!(run); |