Fixed Basic Serialization/Deserialization to json

This commit is contained in:
onyinyang 2023-07-21 13:11:21 -04:00
parent ef1ceafffe
commit 572928a271
No known key found for this signature in database
GPG Key ID: 156A6435430C2036
5 changed files with 53 additions and 30 deletions

20
Cargo.lock generated
View File

@ -1319,9 +1319,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro2"
version = "1.0.60"
version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406"
checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [
"unicode-ident",
]
@ -1661,9 +1661,9 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.164"
version = "1.0.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d"
checksum = "3b88756493a5bd5e5395d53baa70b194b05764ab85b59e43e4b8f4e1192fa9b1"
dependencies = [
"serde_derive",
]
@ -1679,9 +1679,9 @@ dependencies = [
[[package]]
name = "serde_derive"
version = "1.0.164"
version = "1.0.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"
checksum = "6e5c3a298c7f978e53536f95a63bdc4c4a64550582f31a0359a9afda6aede62e"
dependencies = [
"proc-macro2",
"quote",
@ -1690,9 +1690,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.97"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a"
checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b"
dependencies = [
"itoa",
"ryu",
@ -1833,9 +1833,9 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142"
[[package]]
name = "syn"
version = "2.0.18"
version = "2.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0"
dependencies = [
"proc-macro2",
"quote",

View File

@ -21,13 +21,13 @@ tokio = { version = "1", features = ["full", "macros", "signal"] }
rand = "0.8.5"
serde = { version = "1.0", features = ["derive", "rc"] }
serde_with = "3.0.0"
serde_json = "1.0.87"
zkp = "0.8.0"
lox-library = { path = "../lox-library", version = "0.1.0"}
lox_utils = { path = "../lox-utils", version = "0.1.0"}
rdsys_backend = { path = "../rdsys-backend-api", version = "0.2"}
clap = { version = "4.3.17", features = ["derive"] }
serde_json = "1.0.103"
[dependencies.chrono]
version = "0.4.19"

View File

@ -12,12 +12,14 @@ use lox_library::{BridgeAuth, BridgeDb};
use rdsys_backend::{proto::ResourceDiff, start_stream};
use serde::Deserialize;
use std::env;
use std::{
convert::Infallible,
error::Error,
fs::File,
io::BufReader,
net::SocketAddr,
path::PathBuf,
path::{Path, PathBuf},
sync::{Arc, Mutex},
time::Duration,
};
@ -44,11 +46,11 @@ async fn shutdown_signal() {
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
/// Name of the person to greet
/// Name/path of the configuration file
#[arg(short, long, default_value = "config.json")]
config: PathBuf,
/// Number of times to greet
/// Optional name/path of the db file
#[arg(short, long)]
db: Option<PathBuf>,
}
@ -120,26 +122,46 @@ async fn create_context_manager(
}
}
fn read_context_from_file<P: AsRef<Path>>(
path: P,
) -> Result<lox_context::LoxServerContext, Box<dyn Error>> {
let file = File::open(path)?;
let reader = BufReader::new(file);
let context = serde_json::from_reader(reader)?;
Ok(context)
}
// Context Manager handles the Lox BridgeDB and Bridge Authority, ensuring
// that the DB can be updated from the rdsys stream and client requests
// can be responded to with an updated BridgeDB state
async fn context_manager(db_path: Option<PathBuf>, mut context_rx: mpsc::Receiver<Command>) {
let context: lox_context::LoxServerContext;
if let Some(existing_db) = db_path.as_deref() {
let file = File::open(existing_db).expect("Should have been able to read config.json file");
let reader = BufReader::new(file);
// Read the JSON contents of the file as a ResourceIn
context =
serde_json::from_reader(reader).expect("Reading SerializableContext from JSON failed.");
context = read_context_from_file(existing_db).unwrap();
} else {
let new_db = BridgeDb::new();
let new_ba = BridgeAuth::new(new_db.pubkey);
context = lox_context::LoxServerContext {
db: Arc::new(Mutex::new(new_db)),
ba: Arc::new(Mutex::new(new_ba)),
extra_bridges: Arc::new(Mutex::new(Vec::new())),
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
};
let current_path = env::current_dir().expect("Unable to access current dir");
if let Some(last_modified_file) = std::fs::read_dir(current_path)
.expect("Couldn't read local directory")
.flatten() // Remove failed
.filter(|f| {
f.metadata().unwrap().is_file()
&& (f.file_name().into_string().unwrap().contains("_lox.json"))
}) // Filter out directories (only consider files)
.max_by_key(|x| x.metadata().unwrap().modified().unwrap())
// Get the most recently modified file
{
println!("Reading from file {:?}", last_modified_file);
context = read_context_from_file(&last_modified_file.path()).unwrap();
} else {
let new_db = BridgeDb::new();
let new_ba = BridgeAuth::new(new_db.pubkey);
context = lox_context::LoxServerContext {
db: Arc::new(Mutex::new(new_db)),
ba: Arc::new(Mutex::new(new_ba)),
extra_bridges: Arc::new(Mutex::new(Vec::new())),
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
};
}
}
while let Some(cmd) = context_rx.recv().await {
@ -287,7 +309,7 @@ async fn context_manager(db_path: Option<PathBuf>, mut context_rx: mpsc::Receive
*/
context.allocate_leftover_bridges();
context.encrypt_table();
let mut date = Local::now().format("%Y-%m-%d").to_string();
let mut date = Local::now().format("%Y-%m-%d_%H:%M:%S").to_string();
let path = "_lox.json";
date.push_str(path);
let file = File::create(&date).expect("Unable to write to file!");

View File

@ -17,7 +17,7 @@ bincode = "1"
chrono = "0.4"
rand = "0.7"
serde = "1.0.164"
serde_with = "3.0.0"
serde_with = {version = "3.0.0", features = ["json"]}
sha2 = "0.9"
statistical = "1.0.0"
lazy_static = "1"

View File

@ -237,7 +237,7 @@ struct K {
/// the encrypted buckets. The encrypted buckets will be exposed to the
/// users of the system, and each user credential will contain the
/// decryption key for one bucket.
//#[serde_as]
#[serde_as]
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct BridgeTable {
// All structures in the bridgetable are indexed by counter
@ -246,6 +246,7 @@ pub struct BridgeTable {
pub buckets: HashMap<u32, [BridgeLine; MAX_BRIDGES_PER_BUCKET]>,
pub encbuckets: HashMap<u32, EncryptedBucket>,
/// Individual bridges that are reachable
#[serde_as(as = "HashMap<serde_with::json::JsonString, _>")]
pub reachable: HashMap<BridgeLine, Vec<(u32, usize)>>,
/// bucket ids of "hot spare" buckets. These buckets are not handed
/// to users, nor do they have any Migration credentials pointing to