Browse Source

make client configs per-user, not per-conversation

Justin Tracey 1 year ago
parent
commit
9e8b242925

+ 0 - 14
shadow/client/shadow.data.template/hosts/client1/alice-group1.toml

@@ -1,14 +0,0 @@
-user = "Alice"
-group = "group1"
-server = "100.0.0.1:6397"
-bootstrap = 5.0
-retry = 5.0
-
-[distributions]
-s = 0.5
-r = 0.1
-m = {distribution = "Poisson", lambda = 1.0}
-i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
-w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
-a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
-a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}

+ 0 - 14
shadow/client/shadow.data.template/hosts/client1/alice-group2.toml

@@ -1,14 +0,0 @@
-user = "Alice"
-group = "group2"
-server = "100.0.0.1:6397"
-bootstrap = 5.0
-retry = 5.0
-
-[distributions]
-s = 0.5
-r = 0.1
-m = {distribution = "Poisson", lambda = 1.0}
-i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
-w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
-a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
-a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}

+ 32 - 0
shadow/client/shadow.data.template/hosts/client1/alice.toml

@@ -0,0 +1,32 @@
+user = "Alice"
+
+[[conversations]]
+group = "group1"
+server = "100.0.0.1:6397"
+bootstrap = 5.0
+retry = 5.0
+
+[conversations.distributions]
+s = 0.5
+r = 0.1
+m = {distribution = "Poisson", lambda = 1.0}
+i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
+w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
+a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
+a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
+
+
+[[conversations]]
+group = "group2"
+server = "100.0.0.1:6397"
+bootstrap = 5.0
+retry = 5.0
+
+[conversations.distributions]
+s = 0.5
+r = 0.1
+m = {distribution = "Poisson", lambda = 1.0}
+i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
+w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
+a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
+a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}

+ 0 - 14
shadow/client/shadow.data.template/hosts/client2/bob-group1.toml

@@ -1,14 +0,0 @@
-user = "Bob"
-group = "group1"
-server = "100.0.0.1:6397"
-bootstrap = 5.0
-retry = 5.0
-
-[distributions]
-s = 0.5
-r = 0.1
-m = {distribution = "Poisson", lambda = 1.0}
-i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
-w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
-a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
-a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}

+ 0 - 14
shadow/client/shadow.data.template/hosts/client2/bob-group2.toml

@@ -1,14 +0,0 @@
-user = "Bob"
-group = "group2"
-server = "100.0.0.1:6397"
-bootstrap = 5.0
-retry = 5.0
-
-[distributions]
-s = 0.5
-r = 0.1
-m = {distribution = "Poisson", lambda = 1.0}
-i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
-w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
-a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
-a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}

+ 32 - 0
shadow/client/shadow.data.template/hosts/client2/bob.toml

@@ -0,0 +1,32 @@
+user = "Bob"
+
+[[conversations]]
+group = "group1"
+server = "100.0.0.1:6397"
+bootstrap = 5.0
+retry = 5.0
+
+[conversations.distributions]
+s = 0.5
+r = 0.1
+m = {distribution = "Poisson", lambda = 1.0}
+i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
+w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
+a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
+a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
+
+
+[[conversations]]
+group = "group2"
+server = "100.0.0.1:6397"
+bootstrap = 5.0
+retry = 5.0
+
+[conversations.distributions]
+s = 0.5
+r = 0.1
+m = {distribution = "Poisson", lambda = 1.0}
+i = {distribution = "Normal", mean = 15.0, std_dev = 30.0}
+w = {distribution = "Normal", mean = 30.0, std_dev = 30.0}
+a_s = {distribution = "Normal", mean = 10.0, std_dev = 5.0}
+a_r = {distribution = "Normal", mean = 10.0, std_dev = 5.0}

+ 3 - 1
shadow/client/shadow.data.template/hosts/client2/carol-group1.toml → shadow/client/shadow.data.template/hosts/client2/carol.toml

@@ -1,10 +1,12 @@
 user = "Carol"
+
+[[conversations]]
 group = "group1"
 server = "100.0.0.1:6397"
 bootstrap = 5.0
 retry = 5.0
 
-[distributions]
+[conversations.distributions]
 s = 0.5
 r = 0.1
 m = {distribution = "Poisson", lambda = 1.0}

+ 3 - 1
shadow/client/shadow.data.template/hosts/client3/dave-group2.toml → shadow/client/shadow.data.template/hosts/client3/dave.toml

@@ -1,10 +1,12 @@
 user = "Dave"
+
+[[conversations]]
 group = "group2"
 server = "100.0.0.1:6397"
 bootstrap = 5.0
 retry = 5.0
 
-[distributions]
+[conversations.distributions]
 s = 0.5
 r = 0.1
 m = {distribution = "Poisson", lambda = 1.0}

+ 25 - 12
src/bin/mgen-client.rs

@@ -133,14 +133,18 @@ async fn socket_updater(
 /// The thread responsible for handling the conversation state
 /// (i.e., whether the user is active or idle, and when to send messages).
 /// Spawns all other threads for this conversation.
-async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
+async fn manage_conversation(
+    user: String,
+    socks: Option<String>,
+    config: ConversationConfig,
+) -> Result<(), MessengerError> {
     let mut rng = Xoshiro256PlusPlus::from_entropy();
     let distributions: Distributions = config.distributions.try_into()?;
 
     let str_params = SocksParams {
-        socks: config.socks,
+        socks,
         target: config.server,
-        user: config.user.clone(),
+        user: user.clone(),
         recipient: config.group.clone(),
     };
 
@@ -153,6 +157,7 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
     let write_socket_updater_in = Updater::new();
     let write_socket_updater_out = write_socket_updater_in.clone();
     let (errs_in, errs_out) = mpsc::unbounded_channel();
+
     tokio::spawn(reader(
         reader_to_state,
         read_socket_updater_out,
@@ -179,7 +184,7 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
                     conversation,
                     &mut state_from_reader,
                     &mut state_to_writer,
-                    &config.user,
+                    &user,
                     &config.group,
                     false,
                     &mut rng,
@@ -191,7 +196,7 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
                     conversation,
                     &mut state_from_reader,
                     &mut state_to_writer,
-                    &config.user,
+                    &user,
                     &config.group,
                     false,
                     &mut rng,
@@ -203,16 +208,21 @@ async fn manage_conversation(config: Config) -> Result<(), MessengerError> {
 }
 
 #[derive(Debug, Deserialize)]
-struct Config {
-    user: String,
+struct ConversationConfig {
     group: String,
-    socks: Option<String>,
     server: String,
     bootstrap: f64,
     retry: f64,
     distributions: ConfigDistributions,
 }
 
+#[derive(Debug, Deserialize)]
+struct Config {
+    user: String,
+    socks: Option<String>,
+    conversations: Vec<ConversationConfig>,
+}
+
 #[tokio::main]
 async fn main() -> Result<(), Box<dyn std::error::Error>> {
     let mut args = std::env::args();
@@ -220,10 +230,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
     let mut handles = vec![];
     for config_file in args.flat_map(|a| glob::glob(a.as_str()).unwrap()) {
         let toml_s = std::fs::read_to_string(config_file?)?;
-        let config = toml::from_str(&toml_s)?;
-        let handle: task::JoinHandle<Result<(), MessengerError>> =
-            tokio::spawn(manage_conversation(config));
-        handles.push(handle);
+        let config: Config = toml::from_str(&toml_s)?;
+        for conversation in config.conversations.into_iter() {
+            let handle: task::JoinHandle<Result<(), MessengerError>> = tokio::spawn(
+                manage_conversation(config.user.clone(), config.socks.clone(), conversation),
+            );
+            handles.push(handle);
+        }
     }
     handles.shrink_to_fit();
     for handle in handles {