Explorar el Código

Fixed a bug in the provisioning process.

Matthew Carr hace 1 año
padre
commit
3e6290ab72

+ 113 - 0
Cargo.lock

@@ -367,6 +367,14 @@ dependencies = [
  "serde-big-array",
 ]
 
+[[package]]
+name = "btweb"
+version = "0.1.0"
+dependencies = [
+ "hyper",
+ "tokio",
+]
+
 [[package]]
 name = "bumpalo"
 version = "3.11.1"
@@ -806,6 +814,12 @@ dependencies = [
  "windows-sys 0.48.0",
 ]
 
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
 [[package]]
 name = "foreign-types"
 version = "0.3.2"
@@ -975,6 +989,25 @@ version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
 
+[[package]]
+name = "h2"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
 [[package]]
 name = "half"
 version = "1.8.2"
@@ -1023,12 +1056,70 @@ version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2"
 
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
 [[package]]
 name = "humantime"
 version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
+[[package]]
+name = "hyper"
+version = "0.14.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
 [[package]]
 name = "iana-time-zone"
 version = "0.1.53"
@@ -2371,6 +2462,12 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
 [[package]]
 name = "tracing"
 version = "0.1.37"
@@ -2403,6 +2500,12 @@ dependencies = [
  "once_cell",
 ]
 
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
 [[package]]
 name = "tss-esapi"
 version = "7.2.0"
@@ -2515,6 +2618,16 @@ dependencies = [
  "winapi-util",
 ]
 
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
 [[package]]
 name = "wasi"
 version = "0.10.0+wasi-snapshot-preview1"

+ 19 - 19
crates/btfproto/src/server.rs

@@ -112,56 +112,56 @@ pub trait FsProvider: Send + Sync {
     ) -> Self::GrantAccessFut<'c>;
 }
 
-impl<P: FsProvider> FsProvider for &P {
+impl<P: 'static + ?Sized + FsProvider, Ptr: Send + Sync + Deref<Target = P>> FsProvider for Ptr {
     type LookupFut<'c> = P::LookupFut<'c> where Self: 'c;
     fn lookup<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Lookup<'c>) -> Self::LookupFut<'c> {
-        (*self).lookup(from, msg)
+        self.deref().lookup(from, msg)
     }
 
     type CreateFut<'c> = P::CreateFut<'c> where Self: 'c;
     fn create<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Create<'c>) -> Self::CreateFut<'c> {
-        (*self).create(from, msg)
+        self.deref().create(from, msg)
     }
 
     type OpenFut<'c> = P::OpenFut<'c> where Self: 'c;
     fn open<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Open) -> Self::OpenFut<'c> {
-        (*self).open(from, msg)
+        self.deref().open(from, msg)
     }
 
     type ReadGuard = P::ReadGuard;
     type ReadFut<'c> = P::ReadFut<'c> where Self: 'c;
     fn read<'c>(&'c self, from: &'c Arc<BlockPath>, msg: ReadMsg) -> Self::ReadFut<'c> {
-        (*self).read(from, msg)
+        self.deref().read(from, msg)
     }
 
     type WriteFut<'r> = P::WriteFut<'r> where Self: 'r;
     fn write<'c>(&'c self, from: &'c Arc<BlockPath>, write: Write<&'c [u8]>) -> Self::WriteFut<'c> {
-        (*self).write(from, write)
+        self.deref().write(from, write)
     }
 
     type FlushFut<'c> = P::FlushFut<'c> where Self: 'c;
     fn flush<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Flush) -> Self::FlushFut<'c> {
-        (*self).flush(from, msg)
+        self.deref().flush(from, msg)
     }
 
     type ReadDirFut<'c> = P::ReadDirFut<'c> where Self: 'c;
     fn read_dir<'c>(&'c self, from: &'c Arc<BlockPath>, msg: ReadDir) -> Self::ReadDirFut<'c> {
-        (*self).read_dir(from, msg)
+        self.deref().read_dir(from, msg)
     }
 
     type LinkFut<'c> = P::LinkFut<'c> where Self: 'c;
     fn link<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Link<'c>) -> Self::LinkFut<'c> {
-        (*self).link(from, msg)
+        self.deref().link(from, msg)
     }
 
     type UnlinkFut<'c> = P::UnlinkFut<'c> where Self: 'c;
     fn unlink<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Unlink<'c>) -> Self::UnlinkFut<'c> {
-        (*self).unlink(from, msg)
+        self.deref().unlink(from, msg)
     }
 
     type ReadMetaFut<'c> = P::ReadMetaFut<'c> where Self: 'c;
     fn read_meta<'c>(&'c self, from: &'c Arc<BlockPath>, msg: ReadMeta) -> Self::ReadMetaFut<'c> {
-        (*self).read_meta(from, msg)
+        self.deref().read_meta(from, msg)
     }
 
     type WriteMetaFut<'c> = P::WriteMetaFut<'c> where Self: 'c;
@@ -170,32 +170,32 @@ impl<P: FsProvider> FsProvider for &P {
         from: &'c Arc<BlockPath>,
         msg: WriteMeta,
     ) -> Self::WriteMetaFut<'c> {
-        (*self).write_meta(from, msg)
+        self.deref().write_meta(from, msg)
     }
 
     type AllocateFut<'c> = P::AllocateFut<'c> where Self: 'c;
     fn allocate<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Allocate) -> Self::AllocateFut<'c> {
-        (*self).allocate(from, msg)
+        self.deref().allocate(from, msg)
     }
 
     type CloseFut<'c> = P::CloseFut<'c> where Self: 'c;
     fn close<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Close) -> Self::CloseFut<'c> {
-        (*self).close(from, msg)
+        self.deref().close(from, msg)
     }
 
     type ForgetFut<'c> = P::ForgetFut<'c> where Self: 'c;
     fn forget<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Forget) -> Self::ForgetFut<'c> {
-        (*self).forget(from, msg)
+        self.deref().forget(from, msg)
     }
 
     type LockFut<'c> = P::LockFut<'c> where Self: 'c;
     fn lock<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Lock) -> Self::LockFut<'c> {
-        (*self).lock(from, msg)
+        self.deref().lock(from, msg)
     }
 
     type UnlockFut<'c> = P::UnlockFut<'c> where Self: 'c;
     fn unlock<'c>(&'c self, from: &'c Arc<BlockPath>, msg: Unlock) -> Self::UnlockFut<'c> {
-        (*self).unlock(from, msg)
+        self.deref().unlock(from, msg)
     }
 
     type AddReacapFut<'c> = P::AddReacapFut<'c> where Self: 'c;
@@ -204,7 +204,7 @@ impl<P: FsProvider> FsProvider for &P {
         from: &'c Arc<BlockPath>,
         msg: AddReadcap,
     ) -> Self::AddReacapFut<'c> {
-        (*self).add_readcap(from, msg)
+        self.deref().add_readcap(from, msg)
     }
 
     type GrantAccessFut<'c> = P::GrantAccessFut<'c> where Self: 'c;
@@ -213,7 +213,7 @@ impl<P: FsProvider> FsProvider for &P {
         from: &'c Arc<BlockPath>,
         msg: GrantAccess,
     ) -> Self::GrantAccessFut<'c> {
-        (*self).grant_access(from, msg)
+        self.deref().grant_access(from, msg)
     }
 }
 

+ 9 - 2
crates/btfuse/src/main.rs

@@ -7,6 +7,7 @@ mod fuse_fs;
 use ::config::Config as ExtConfig;
 use btfproto::{client::FsClient, local_fs::LocalFs, server::FsProvider};
 use btlib::{
+    bterr,
     crypto::{Creds, CredsPriv},
     error::BtErr,
     Result,
@@ -108,9 +109,15 @@ async fn run_daemon(config: AppConfig, mounted_signal: Option<oneshot::Sender<()
     let mut daemon = match config.fskind {
         FsKind::Local { path: btdir } => {
             log::info!("starting daemon with local provider using {:?}", btdir);
-            let provider = local_provider(btdir, node_creds)
+            let provider = local_provider(btdir.clone(), node_creds)
                 .await
-                .expect("failed to create local provider");
+                .map_err(|err| {
+                    bterr!(
+                        "failed to create local provider using path '{}': {err}",
+                        btdir.display()
+                    )
+                })
+                .unwrap();
             FuseDaemon::new(
                 config.mntdir,
                 &config.mntoptions,

+ 5 - 0
crates/btlib/src/block_path.rs

@@ -28,6 +28,11 @@ mod private {
         pub fn components(&self) -> impl DoubleEndedIterator<Item = &str> {
             self.components.iter().map(|e| e.as_str())
         }
+
+        /// Creates a `RelBlockPath` with no components.
+        pub fn empty() -> Self {
+            RelBlockPath { components: vec![] }
+        }
     }
 
     impl Decompose<Vec<String>> for RelBlockPath {

+ 3 - 3
crates/btmsg/src/lib.rs

@@ -255,9 +255,9 @@ pub trait Transmitter {
     ///
     /// ## TODO
     /// This issue needs to be fixed. Due to the fact that
-    /// `F::Arg` is a Generic Associated Type I have been unable to express this constraint in the
-    /// where clause of this method. I'm not sure if the errors I've encountered are due to a lack
-    /// of understanding on my part or due to the current limitations of the borrow checker in
+    /// `F::Arg` is a Generic Associated Type (GAT) I have been unable to express this constraint in
+    /// the where clause of this method. I'm not sure if the errors I've encountered are due to a
+    /// lack of understanding on my part or due to the current limitations of the borrow checker in
     /// its handling of GATs.
     fn call<'call, T, F>(&'call self, msg: T, callback: F) -> Self::CallFut<'call, T, F>
     where

+ 0 - 3
crates/btprovision/Cargo.toml

@@ -13,7 +13,4 @@ serde = { version = "^1.0.136", features = ["derive"] }
 config = "0.13.3"
 anyhow = { version = "1.0.66", features = ["std", "backtrace"] }
 termion = "2.0.1"
-
-
-[dev-dependencies]
 tempdir = { version = "0.3.7" }

+ 26 - 14
crates/btprovision/src/main.rs

@@ -16,6 +16,7 @@ use std::{
     path::PathBuf,
     time::Duration,
 };
+use tempdir::TempDir;
 use termion::input::TermRead;
 
 #[derive(Debug, Clone, Deserialize)]
@@ -37,8 +38,6 @@ impl AppConfig {
         let expires = Epoch::now() + Duration::from_secs(DEFAULT_VALID_FOR);
         Ok(Config::builder()
             .set_default("writecapexpires", expires.value().to_string().as_str())?
-            .set_default("writecappath", "")?
-            .set_default("writecapsavepath", "./state/node_writecap")?
             .btconfig()?
             .build()?
             .try_deserialize()?)
@@ -115,19 +114,18 @@ impl<'a> CredStoreConsumer for IssueWritecapConsumer<'a> {
 }
 
 fn issue_node_writecap(config: AppConfig) -> Result<()> {
-    let (writecap_path, cred_path, issuee, expires) = get_settings!(
-        config,
-        writecapsavepath,
-        writecappath,
-        writecapissuee,
-        writecapexpires
-    );
+    let (writecap_path, issuee, expires) =
+        get_settings!(config, writecapsavepath, writecapissuee, writecapexpires);
     let password = if let Some(password) = config.password {
         password
     } else {
         password_prompt("Please enter the root password: ")?
     };
-    let cred_components = RelBlockPath::try_from(cred_path.as_str())?;
+    let cred_components = if let Some(cred_path) = config.writecappath {
+        RelBlockPath::try_from(cred_path.as_str())?
+    } else {
+        RelBlockPath::empty()
+    };
     let issuee = Principal::try_from(issuee.as_str())?;
     let writecap = config.credstore.consume(IssueWritecapConsumer {
         password: &password,
@@ -138,9 +136,15 @@ fn issue_node_writecap(config: AppConfig) -> Result<()> {
     let file = OpenOptions::new()
         .write(true)
         .create_new(true)
-        .open(writecap_path)?;
+        .open(&writecap_path)
+        .map_err(|err| {
+            bterr!(
+                "failed to create writecap at path '{}': {err}",
+                writecap_path.display()
+            )
+        })?;
     let mut writer = BufWriter::new(file);
-    write_to(&writecap, &mut writer)?;
+    write_to(&writecap, &mut writer).map_err(|err| bterr!("failed to save writecap: {err}"))?;
     Ok(())
 }
 
@@ -182,11 +186,19 @@ impl CredStoreConsumer for PrincipalConsumer {
     }
 }
 
-fn all(mut config: AppConfig) -> Result<()> {
+/// Runs all of the provisioning steps on a single credential store.
+fn full(mut config: AppConfig) -> Result<()> {
     gen_root_creds(config.clone())?;
     gen_node_creds(config.clone())?;
     let node_principal = config.credstore.clone().consume(PrincipalConsumer)??;
     config.writecapissuee = Some(node_principal.to_string());
+    let _temp_dir = if config.writecapsavepath.is_none() {
+        let temp_dir = TempDir::new("btprovision")?;
+        config.writecapsavepath = Some(temp_dir.path().join("writecap"));
+        Some(temp_dir)
+    } else {
+        None
+    };
     issue_node_writecap(config.clone())?;
     save_node_writecap(config)
 }
@@ -197,7 +209,7 @@ fn run(command: &str, config: AppConfig) -> Result<()> {
         "gen_node_creds" => gen_node_creds(config),
         "issue_node_writecap" => issue_node_writecap(config),
         "save_node_writecap" => save_node_writecap(config),
-        "all" => all(config),
+        "full" => full(config),
         _ => Err(bterr!("unrecognized command: {command}")),
     }
 }