git.delta.rocks / jrsonnet / refs/commits / cd4874aa6417

difftreelog

refactor db data

Yaroslav Bolyukin2021-09-18parent: #5eda055.patch.diff
in: trunk

4 files changed

deletedsrc/db/db.rsdiffbeforeafterboth
--- a/src/db/db.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-//! Small .toml based readable data store
-
-use anyhow::{Context, Result};
-use serde::{de::DeserializeOwned, Serialize};
-use std::{
-	cell::Cell,
-	collections::HashSet,
-	io::Write,
-	ops::{Deref, DerefMut},
-	path::Path,
-	path::PathBuf,
-	sync::{Arc, Mutex},
-};
-
-struct DbInternal {
-	root: PathBuf,
-	locked_paths: HashSet<PathBuf>,
-}
-
-pub trait DbData: DeserializeOwned + Serialize + Default {
-	const DB_NAME: &'static str;
-
-	fn open(db: &Db) -> Result<DbFile<Self>> {
-		db.db::<Self>()
-	}
-}
-
-#[derive(Clone)]
-pub struct Db(Arc<Mutex<DbInternal>>);
-impl Db {
-	pub fn new(root: impl AsRef<Path>) -> Result<Self> {
-		let root: &Path = root.as_ref();
-		std::fs::create_dir_all(&root).context("db root")?;
-		Ok(Db(Arc::new(Mutex::new(DbInternal {
-			root: root.to_owned(),
-			locked_paths: HashSet::new(),
-		}))))
-	}
-
-	pub fn db<T: DbData>(&self) -> Result<DbFile<T>> {
-		let name = T::DB_NAME;
-		assert!(!name.contains("/") && !name.contains("\\"));
-		let mut db = self.0.lock().unwrap();
-		let mut data_path = db.root.clone();
-		data_path.push(format!("{}.toml", name));
-
-		if !db.locked_paths.insert(data_path.clone()) {
-			anyhow::bail!("file is already open");
-		}
-
-		let data = if data_path.exists() {
-			let raw_data = std::fs::read(&data_path).context("reading file")?;
-			toml::from_slice(&raw_data).context("parsing file")?
-		} else {
-			T::default()
-		};
-
-		Ok(DbFile {
-			db: self.clone(),
-			root: db.root.clone(),
-			path: data_path,
-			data,
-			dirty: Cell::new(false),
-		})
-	}
-}
-
-pub struct DbFile<T: DbData> {
-	db: Db,
-	root: PathBuf,
-	path: PathBuf,
-	data: T,
-	dirty: Cell<bool>,
-}
-
-impl<T: DbData> Deref for DbFile<T> {
-	type Target = T;
-
-	fn deref(&self) -> &Self::Target {
-		&self.data
-	}
-}
-
-impl<T: DbData> DerefMut for DbFile<T> {
-	fn deref_mut(&mut self) -> &mut Self::Target {
-		self.dirty.set(true);
-		&mut self.data
-	}
-}
-
-impl<T: DbData> DbFile<T> {
-	pub fn write(&self) -> Result<()> {
-		if !self.dirty.get() {
-			return Ok(());
-		}
-		let mut temp = tempfile::Builder::new()
-			.prefix("~")
-			.suffix(".toml")
-			.tempfile_in(&self.root)?;
-		let mut out = String::new();
-		let mut serializer = toml::Serializer::new(&mut out);
-		serializer.pretty_array(true).pretty_string(true);
-		self.data.serialize(&mut serializer)?;
-		temp.write_all(&out.as_bytes())?;
-		temp.persist(&self.path)?;
-		self.dirty.set(false);
-		Ok(())
-	}
-}
-
-impl<T: DbData> Drop for DbFile<T> {
-	fn drop(&mut self) {
-		let mut db = self.db.0.lock().unwrap();
-		self.write().unwrap();
-		db.locked_paths.remove(&self.path);
-	}
-}
addedsrc/db/dbr.rsdiffbeforeafterboth
--- /dev/null
+++ b/src/db/dbr.rs
@@ -0,0 +1,117 @@
+//! Small .toml based readable data store
+
+use anyhow::{Context, Result};
+use serde::{de::DeserializeOwned, Serialize};
+use std::{
+	cell::Cell,
+	collections::HashSet,
+	io::Write,
+	ops::{Deref, DerefMut},
+	path::Path,
+	path::PathBuf,
+	sync::{Arc, Mutex},
+};
+
+struct DbInternal {
+	root: PathBuf,
+	locked_paths: HashSet<PathBuf>,
+}
+
+pub trait DbData: DeserializeOwned + Serialize + Default {
+	const DB_NAME: &'static str;
+
+	fn open(db: &Db) -> Result<DbFile<Self>> {
+		db.db::<Self>()
+	}
+}
+
+#[derive(Clone)]
+pub struct Db(Arc<Mutex<DbInternal>>);
+impl Db {
+	pub fn new(root: impl AsRef<Path>) -> Result<Self> {
+		let root: &Path = root.as_ref();
+		std::fs::create_dir_all(&root).context("db root")?;
+		Ok(Db(Arc::new(Mutex::new(DbInternal {
+			root: root.to_owned(),
+			locked_paths: HashSet::new(),
+		}))))
+	}
+
+	pub fn db<T: DbData>(&self) -> Result<DbFile<T>> {
+		let name = T::DB_NAME;
+		assert!(!name.contains('/') && !name.contains('\\'));
+		let mut db = self.0.lock().unwrap();
+		let mut data_path = db.root.clone();
+		data_path.push(format!("{}.toml", name));
+
+		if !db.locked_paths.insert(data_path.clone()) {
+			anyhow::bail!("file is already open");
+		}
+
+		let data = if data_path.exists() {
+			let raw_data = std::fs::read(&data_path).context("reading file")?;
+			toml::from_slice(&raw_data).context("parsing file")?
+		} else {
+			T::default()
+		};
+
+		Ok(DbFile {
+			db: self.clone(),
+			root: db.root.clone(),
+			path: data_path,
+			data,
+			dirty: Cell::new(false),
+		})
+	}
+}
+
+pub struct DbFile<T: DbData> {
+	db: Db,
+	root: PathBuf,
+	path: PathBuf,
+	data: T,
+	dirty: Cell<bool>,
+}
+
+impl<T: DbData> Deref for DbFile<T> {
+	type Target = T;
+
+	fn deref(&self) -> &Self::Target {
+		&self.data
+	}
+}
+
+impl<T: DbData> DerefMut for DbFile<T> {
+	fn deref_mut(&mut self) -> &mut Self::Target {
+		self.dirty.set(true);
+		&mut self.data
+	}
+}
+
+impl<T: DbData> DbFile<T> {
+	pub fn write(&self) -> Result<()> {
+		if !self.dirty.get() {
+			return Ok(());
+		}
+		let mut temp = tempfile::Builder::new()
+			.prefix("~")
+			.suffix(".toml")
+			.tempfile_in(&self.root)?;
+		let mut out = String::new();
+		let mut serializer = toml::Serializer::new(&mut out);
+		serializer.pretty_array(true).pretty_string(true);
+		self.data.serialize(&mut serializer)?;
+		temp.write_all(out.as_bytes())?;
+		temp.persist(&self.path)?;
+		self.dirty.set(false);
+		Ok(())
+	}
+}
+
+impl<T: DbData> Drop for DbFile<T> {
+	fn drop(&mut self) {
+		let mut db = self.db.0.lock().unwrap();
+		self.write().unwrap();
+		db.locked_paths.remove(&self.path);
+	}
+}
modifiedsrc/db/mod.rsdiffbeforeafterboth
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -1,4 +1,4 @@
-mod db;
+mod dbr;
 pub mod secret;
 
-pub use db::*;
+pub use dbr::*;
modifiedsrc/db/secret.rsdiffbeforeafterboth
1use crate::{command::CommandExt, host::FleetConfig, nix::SECRETS_ATTRIBUTE};1use crate::{command::CommandExt, host::FleetOpts, nix::SECRETS_ATTRIBUTE};
2use anyhow::{bail, Result};2use anyhow::{bail, Context, Result};
3use log::info;3use log::info;
4use serde::{Deserialize, Deserializer, Serialize, Serializer};4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5use std::{5use std::{
10};10};
11use time::{Duration, PrimitiveDateTime};11use time::{Duration, PrimitiveDateTime};
1212
13use super::db::DbData;13use super::DbData;
1414
15#[derive(Serialize, Deserialize, Debug)]15#[derive(Serialize, Deserialize, Debug)]
16pub struct SecretListData {16pub struct SecretListData {
31 }) s)31 }) s)
32 "#,32 "#,
33 )33 )
34 .arg("--json")
34 .run_json()35 .run_json()
36 .context("while getting secret list")
35}37}
3638
37struct ReadableDate(PrimitiveDateTime);39struct ReadableDate(PrimitiveDateTime);
109 // Secrets are generated on machine running fleet command111 // Secrets are generated on machine running fleet command
110 pub fn generate_secret(112 pub fn generate_secret(
111 &mut self,113 &mut self,
112 fleet_config: FleetConfig,114 _fleet_config: &FleetOpts,
113 secret: &str,115 secret: &str,
114 data: &SecretListData,116 data: &SecretListData,
115 ) -> Result<()> {117 ) -> Result<()> {
116 let mut rage_keys = String::new();118 let mut rage_keys = String::new();
117 for (i, owner) in data.owners.iter().enumerate() {119 for (i, _owner) in data.owners.iter().enumerate() {
118 if i != 0 {120 if i != 0 {
119 rage_keys.push(' ');121 rage_keys.push(' ');
120 }122 }
121 rage_keys.push_str("--recipient \"");123 rage_keys.push_str("--recipient \"");
124 // rage_keys.push_str(&fleet_config.clone().build()?.host(owner)?.key()?);
122 // rage_keys.push_str(&keys.get_host_key(&owner)?);125 //rage_keys.push_str(&keys.get_host_key(&owner)?);
123 rage_keys.push('"')126 rage_keys.push('"')
124 }127 }
125 let created_at: PrimitiveDateTime = SystemTime::now().into();128 let created_at: PrimitiveDateTime = SystemTime::now().into();
154 let name = entry.file_name();157 let name = entry.file_name();
155 let name = name158 let name = name
156 .to_str()159 .to_str()
157 .ok_or(anyhow::anyhow!("file name should be utf-8"))?;160 .ok_or_else(|| anyhow::anyhow!("file name should be utf-8"))?;
158 let value = String::from_utf8(std::fs::read(entry.path())?)?;161 let value = String::from_utf8(std::fs::read(entry.path())?)?;
159 if let Some(name) = name.strip_prefix("pub_") {162 if let Some(name) = name.strip_prefix("pub_") {
160 secret_data.public_data.insert(name.into(), value);163 secret_data.public_data.insert(name.into(), value);
176 return Ok(true);179 return Ok(true);
177 }180 }
178181
179 if !secret.is_valid(&data) {182 if !secret.is_valid(data) {
180 return Ok(true);183 return Ok(true);
181 }184 }
182185
185 pub fn ensure_generated(188 pub fn ensure_generated(
186 &mut self,189 &mut self,
187 // keys: &KeyDb,190 // keys: &KeyDb,
191 fleet_config: &FleetOpts,
188 secret: &str,192 secret: &str,
189 data: &SecretListData,193 data: &SecretListData,
190 ) -> Result<()> {194 ) -> Result<()> {
191 if self.need_to_generate(secret, data)? {195 if self.need_to_generate(secret, data)? {
192 info!("Generating secret {}", secret);196 info!("Generating secret {}", secret);
193 // self.generate_secret(keys, secret, data)?;197 self.generate_secret(fleet_config, secret, data)?;
194 }198 }
195199
196 Ok(())200 Ok(())