summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2020-11-13 09:40:39 +0200
committerLars Wirzenius <liw@liw.fi>2020-11-13 11:27:21 +0200
commit38b51382e710dda515e6d0df8fdc4f0b253d9cd7 (patch)
tree5a012e63ef7aa6ae63c31f459d56631bc008b0b5 /src/bin
parent179993f3bdd5e5d4dd728fc2a8f5d63274f95966 (diff)
downloadobnam2-38b51382e710dda515e6d0df8fdc4f0b253d9cd7.tar.gz
refactor: put all client functionality into one program
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/obnam-backup.rs37
-rw-r--r--src/bin/obnam-list.rs27
-rw-r--r--src/bin/obnam-restore.rs122
-rw-r--r--src/bin/obnam.rs52
4 files changed, 52 insertions, 186 deletions
diff --git a/src/bin/obnam-backup.rs b/src/bin/obnam-backup.rs
deleted file mode 100644
index 7d7e07e..0000000
--- a/src/bin/obnam-backup.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-use log::{debug, info};
-use obnam::client::{BackupClient, ClientConfig};
-use obnam::fsiter::FsIterator;
-use obnam::generation::Generation;
-use std::path::PathBuf;
-use structopt::StructOpt;
-
-const BUFFER_SIZE: usize = 1024 * 1024;
-
-fn main() -> anyhow::Result<()> {
- pretty_env_logger::init();
-
- let opt = Opt::from_args();
- info!("obnam-backup starts");
- debug!("opt: {:?}", opt);
- let config = ClientConfig::read_config(&opt.config)?;
- let client = BackupClient::new(&config.server_name, config.server_port)?;
-
- {
- let mut gen = Generation::create(&config.dbname)?;
- gen.insert_iter(FsIterator::new(&config.root).map(|entry| match entry {
- Err(err) => Err(err),
- Ok(entry) => client.upload_filesystem_entry(entry, BUFFER_SIZE),
- }))?;
- }
- let gen_id = client.upload_generation(&config.dbname, BUFFER_SIZE)?;
- println!("gen id: {}", gen_id);
-
- Ok(())
-}
-
-#[derive(Debug, StructOpt)]
-#[structopt(name = "obnam-backup", about = "Simplistic backup client")]
-struct Opt {
- #[structopt(parse(from_os_str))]
- config: PathBuf,
-}
diff --git a/src/bin/obnam-list.rs b/src/bin/obnam-list.rs
deleted file mode 100644
index 18c49f1..0000000
--- a/src/bin/obnam-list.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-use log::{debug, info};
-use obnam::client::{BackupClient, ClientConfig};
-use std::path::PathBuf;
-use structopt::StructOpt;
-
-fn main() -> anyhow::Result<()> {
- pretty_env_logger::init();
-
- let opt = Opt::from_args();
- info!("obnam-list starts");
- debug!("opt: {:?}", opt);
- let config = ClientConfig::read_config(&opt.config)?;
- let client = BackupClient::new(&config.server_name, config.server_port)?;
-
- for gen_id in client.list_generations()? {
- println!("{}", gen_id);
- }
-
- Ok(())
-}
-
-#[derive(Debug, StructOpt)]
-#[structopt(name = "obnam-backup", about = "Simplistic backup client")]
-struct Opt {
- #[structopt(parse(from_os_str))]
- config: PathBuf,
-}
diff --git a/src/bin/obnam-restore.rs b/src/bin/obnam-restore.rs
deleted file mode 100644
index 442104a..0000000
--- a/src/bin/obnam-restore.rs
+++ /dev/null
@@ -1,122 +0,0 @@
-use log::{debug, info};
-use obnam::client::BackupClient;
-use obnam::fsentry::{FilesystemEntry, FilesystemKind};
-use obnam::generation::Generation;
-//use obnam::chunkmeta::ChunkMeta;
-use serde::Deserialize;
-use std::fs::File;
-use std::io::prelude::*;
-use std::path::{Path, PathBuf};
-use structopt::StructOpt;
-
-fn main() -> anyhow::Result<()> {
- pretty_env_logger::init();
-
- let opt = Opt::from_args();
- let config = Config::read_config(&opt.config).unwrap();
-
- info!("obnam-restore starts up");
- info!("opt: {:?}", opt);
- info!("config: {:?}", config);
-
- let client = BackupClient::new(&config.server_name, config.server_port)?;
- let gen_chunk = client.fetch_generation(&opt.gen_id)?;
- debug!("gen: {:?}", gen_chunk);
- {
- let mut dbfile = File::create(&opt.dbname)?;
- for id in gen_chunk.chunk_ids() {
- let chunk = client.fetch_chunk(id)?;
- dbfile.write_all(chunk.data())?;
- }
- }
- info!("downloaded generation to {}", opt.dbname.display());
-
- let gen = Generation::open(&opt.dbname)?;
- for (fileid, entry) in gen.files()? {
- restore(&client, &gen, fileid, entry, &opt.to)?;
- }
-
- Ok(())
-}
-
-#[derive(Debug, StructOpt)]
-#[structopt(name = "obnam-backup", about = "Simplistic backup client")]
-struct Opt {
- #[structopt(parse(from_os_str))]
- config: PathBuf,
-
- #[structopt()]
- gen_id: String,
-
- #[structopt(parse(from_os_str))]
- dbname: PathBuf,
-
- #[structopt(parse(from_os_str))]
- to: PathBuf,
-}
-
-#[derive(Debug, Deserialize, Clone)]
-pub struct Config {
- pub server_name: String,
- pub server_port: u16,
-}
-
-impl Config {
- pub fn read_config(filename: &Path) -> anyhow::Result<Config> {
- let config = std::fs::read_to_string(filename)?;
- let config: Config = serde_yaml::from_str(&config)?;
- Ok(config)
- }
-}
-
-fn restore(
- client: &BackupClient,
- gen: &Generation,
- fileid: u64,
- entry: FilesystemEntry,
- to: &Path,
-) -> anyhow::Result<()> {
- println!("restoring {}:{}", fileid, entry.path().display());
-
- let path = if entry.path().is_absolute() {
- entry.path().strip_prefix("/")?
- } else {
- entry.path()
- };
- let to = to.join(path);
- debug!(" to: {}", to.display());
-
- match entry.kind() {
- FilesystemKind::Regular => restore_regular(client, &gen, &to, fileid, &entry)?,
- FilesystemKind::Directory => restore_directory(&to)?,
- }
- Ok(())
-}
-
-fn restore_directory(path: &Path) -> anyhow::Result<()> {
- debug!("restoring directory {}", path.display());
- std::fs::create_dir_all(path)?;
- Ok(())
-}
-
-fn restore_regular(
- client: &BackupClient,
- gen: &Generation,
- path: &Path,
- fileid: u64,
- _entry: &FilesystemEntry,
-) -> anyhow::Result<()> {
- debug!("restoring regular {}", path.display());
- let parent = path.parent().unwrap();
- debug!(" mkdir {}", parent.display());
- std::fs::create_dir_all(parent)?;
- {
- let mut file = std::fs::File::create(path)?;
- for chunkid in gen.chunkids(fileid)? {
- let chunk = client.fetch_chunk(&chunkid)?;
- file.write_all(chunk.data())?;
- }
- }
- debug!("restored regular {}", path.display());
- Ok(())
-}
diff --git a/src/bin/obnam.rs b/src/bin/obnam.rs
new file mode 100644
index 0000000..d0cf271
--- /dev/null
+++ b/src/bin/obnam.rs
@@ -0,0 +1,52 @@
+use log::{debug, info};
+use obnam::cmd::{backup, list, restore};
+use std::path::PathBuf;
+use structopt::StructOpt;
+
+const BUFFER_SIZE: usize = 1024 * 1024;
+
+fn main() -> anyhow::Result<()> {
+ pretty_env_logger::init();
+
+ let opt = Opt::from_args();
+ info!("obnam starts");
+ debug!("opt: {:?}", opt);
+
+ match opt {
+ Opt::Backup { config } => backup(&config, BUFFER_SIZE)?,
+ Opt::List { config } => list(&config)?,
+ Opt::Restore {
+ config,
+ gen_id,
+ dbname,
+ to,
+ } => restore(&config, &gen_id, &dbname, &to)?,
+ }
+ Ok(())
+}
+
+#[derive(Debug, StructOpt)]
+#[structopt(name = "obnam-backup", about = "Simplistic backup client")]
+enum Opt {
+ Backup {
+ #[structopt(parse(from_os_str))]
+ config: PathBuf,
+ },
+ List {
+ #[structopt(parse(from_os_str))]
+ config: PathBuf,
+ },
+ Restore {
+ #[structopt(parse(from_os_str))]
+ config: PathBuf,
+
+ #[structopt()]
+ gen_id: String,
+
+ #[structopt(parse(from_os_str))]
+ dbname: PathBuf,
+
+ #[structopt(parse(from_os_str))]
+ to: PathBuf,
+ },
+}