From 2938409cff80d66b4b9f672ab48d2d93822c4aa2 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 20 Mar 2022 07:53:06 +0200 Subject: feat: add subcommands inspect, list-backup-versions Sponsored-by: author --- src/bin/obnam.rs | 6 ++++++ src/cmd/backup.rs | 2 +- src/cmd/inspect.rs | 40 ++++++++++++++++++++++++++++++++++++++++ src/cmd/list_backup_versions.rs | 31 +++++++++++++++++++++++++++++++ src/cmd/mod.rs | 2 ++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/cmd/inspect.rs create mode 100644 src/cmd/list_backup_versions.rs diff --git a/src/bin/obnam.rs b/src/bin/obnam.rs index 21add9c..15c7d06 100644 --- a/src/bin/obnam.rs +++ b/src/bin/obnam.rs @@ -8,7 +8,9 @@ use obnam::cmd::chunkify::Chunkify; use obnam::cmd::gen_info::GenInfo; use obnam::cmd::get_chunk::GetChunk; use obnam::cmd::init::Init; +use obnam::cmd::inspect::Inspect; use obnam::cmd::list::List; +use obnam::cmd::list_backup_versions::ListSchemaVersions; use obnam::cmd::list_files::ListFiles; use obnam::cmd::resolve::Resolve; use obnam::cmd::restore::Restore; @@ -41,7 +43,9 @@ fn main_program() -> anyhow::Result<()> { match opt.cmd { Command::Init(x) => x.run(&config), + Command::ListBackupVersions(x) => x.run(&config), Command::Backup(x) => x.run(&config), + Command::Inspect(x) => x.run(&config), Command::Chunkify(x) => x.run(&config), Command::List(x) => x.run(&config), Command::ShowGeneration(x) => x.run(&config), @@ -101,8 +105,10 @@ struct Opt { enum Command { Init(Init), Backup(Backup), + Inspect(Inspect), Chunkify(Chunkify), List(List), + ListBackupVersions(ListSchemaVersions), ListFiles(ListFiles), Restore(Restore), GenInfo(GenInfo), diff --git a/src/cmd/backup.rs b/src/cmd/backup.rs index 51d0329..6983de4 100644 --- a/src/cmd/backup.rs +++ b/src/cmd/backup.rs @@ -34,7 +34,7 @@ impl Backup { let major = self.backup_version.or(Some(DEFAULT_SCHEMA_MAJOR)).unwrap(); let schema = schema_version(major)?; - eprintln!("backup: schema: {schema}"); + eprintln!("backup: schema: {}", schema); let client = BackupClient::new(config)?; let genlist = client.list_generations().await?; diff --git a/src/cmd/inspect.rs b/src/cmd/inspect.rs new file mode 100644 index 0000000..d5a75c6 --- /dev/null +++ b/src/cmd/inspect.rs @@ -0,0 +1,40 @@ +//! The `inspect` subcommand. + +use crate::client::BackupClient; +use crate::config::ClientConfig; +use crate::error::ObnamError; + +use log::info; +use structopt::StructOpt; +use tempfile::NamedTempFile; +use tokio::runtime::Runtime; + +/// Make a backup. +#[derive(Debug, StructOpt)] +pub struct Inspect { + /// Reference to generation to inspect. + #[structopt()] + gen_id: String, +} + +impl Inspect { + /// Run the command. + pub fn run(&self, config: &ClientConfig) -> Result<(), ObnamError> { + let rt = Runtime::new()?; + rt.block_on(self.run_async(config)) + } + + async fn run_async(&self, config: &ClientConfig) -> Result<(), ObnamError> { + let temp = NamedTempFile::new()?; + let client = BackupClient::new(config)?; + let genlist = client.list_generations().await?; + let gen_id = genlist.resolve(&self.gen_id)?; + info!("generation id is {}", gen_id.as_chunk_id()); + + let gen = client.fetch_generation(&gen_id, temp.path()).await?; + let meta = gen.meta()?; + println!("schema_version: {}", meta.schema_version()); + + Ok(()) + } +} diff --git a/src/cmd/list_backup_versions.rs b/src/cmd/list_backup_versions.rs new file mode 100644 index 0000000..859d91c --- /dev/null +++ b/src/cmd/list_backup_versions.rs @@ -0,0 +1,31 @@ +//! The `backup` subcommand. + +use crate::config::ClientConfig; +use crate::dbgen::{schema_version, DEFAULT_SCHEMA_MAJOR, SCHEMA_MAJORS}; +use crate::error::ObnamError; + +use structopt::StructOpt; + +/// List supported backup schema versions. +#[derive(Debug, StructOpt)] +pub struct ListSchemaVersions { + /// List only the default version. + #[structopt(long)] + default_only: bool, +} + +impl ListSchemaVersions { + /// Run the command. + pub fn run(&self, _config: &ClientConfig) -> Result<(), ObnamError> { + if self.default_only { + let schema = schema_version(DEFAULT_SCHEMA_MAJOR)?; + println!("{}", schema); + } else { + for major in SCHEMA_MAJORS { + let schema = schema_version(*major)?; + println!("{}", schema); + } + } + Ok(()) + } +} diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 5e5226f..af7457b 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -6,7 +6,9 @@ pub mod chunkify; pub mod gen_info; pub mod get_chunk; pub mod init; +pub mod inspect; pub mod list; +pub mod list_backup_versions; pub mod list_files; pub mod resolve; pub mod restore; -- cgit v1.2.1